From 37ad59d9378b6e0945858935dff7d028579c7315 Mon Sep 17 00:00:00 2001 From: Alexander Zinchuk Date: Fri, 3 May 2024 14:38:20 +0200 Subject: [PATCH] Sponsored Message: Implement reporting (#4487) --- src/api/gramjs/apiBuilders/appConfig.ts | 2 + src/api/gramjs/apiBuilders/chats.ts | 30 +++ src/api/gramjs/apiBuilders/messages.ts | 57 ++--- src/api/gramjs/apiBuilders/users.ts | 3 +- src/api/gramjs/methods/account.ts | 12 + src/api/gramjs/methods/chats.ts | 38 +++ src/api/gramjs/methods/index.ts | 2 +- src/api/types/messages.ts | 35 +-- src/api/types/misc.ts | 1 + src/api/types/users.ts | 1 + src/assets/font-icons/nochannel.svg | 1 + src/assets/font-icons/revenue-split.svg | 1 + src/bundles/extra.ts | 1 + .../common/AboutAdsModal.module.scss | 35 +++ src/components/common/AboutAdsModal.tsx | 109 ++++++-- .../common/PeerColorWrapper.module.scss | 3 + src/components/common/PeerColorWrapper.tsx | 30 ++- src/components/common/helpers/peerColor.ts | 6 +- .../common/profile/BusinessHours.tsx | 4 +- src/components/middle/MessageList.tsx | 16 +- src/components/middle/MessageListContent.tsx | 6 +- src/components/middle/message/Message.scss | 30 +-- src/components/middle/message/Message.tsx | 59 +++-- .../middle/message/MessageContextMenu.tsx | 18 +- .../middle/message/SponsoredMessage.scss | 40 ++- .../middle/message/SponsoredMessage.tsx | 233 +++++------------- .../SponsoredMessageContextMenuContainer.tsx | 34 ++- src/components/modals/ModalContainer.tsx | 3 + .../modals/reportAd/ReportAdModal.async.tsx | 18 ++ .../modals/reportAd/ReportAdModal.module.scss | 54 ++++ .../modals/reportAd/ReportAdModal.tsx | 157 ++++++++++++ src/components/ui/Separator.tsx | 2 +- src/config.ts | 2 +- src/global/actions/api/messages.ts | 75 ++++++ src/global/actions/ui/messages.ts | 27 ++ src/global/reducers/messages.ts | 17 ++ src/global/types.ts | 21 ++ src/lib/gramjs/tl/AllTLObjects.js | 2 +- src/lib/gramjs/tl/api.d.ts | 129 +++++++--- src/lib/gramjs/tl/apiTl.js | 26 +- src/lib/gramjs/tl/static/api.json | 2 + src/lib/gramjs/tl/static/api.tl | 31 ++- src/styles/icons.scss | 216 ++++++++-------- src/styles/icons.woff | Bin 29544 -> 29940 bytes src/styles/icons.woff2 | Bin 24696 -> 25064 bytes src/types/icons/font.ts | 2 + 46 files changed, 1067 insertions(+), 524 deletions(-) create mode 100644 src/assets/font-icons/nochannel.svg create mode 100644 src/assets/font-icons/revenue-split.svg create mode 100644 src/components/common/AboutAdsModal.module.scss create mode 100644 src/components/common/PeerColorWrapper.module.scss create mode 100644 src/components/modals/reportAd/ReportAdModal.async.tsx create mode 100644 src/components/modals/reportAd/ReportAdModal.module.scss create mode 100644 src/components/modals/reportAd/ReportAdModal.tsx diff --git a/src/api/gramjs/apiBuilders/appConfig.ts b/src/api/gramjs/apiBuilders/appConfig.ts index 21db0bcaa..3986097cb 100644 --- a/src/api/gramjs/apiBuilders/appConfig.ts +++ b/src/api/gramjs/apiBuilders/appConfig.ts @@ -74,6 +74,7 @@ export interface GramJsAppConfig extends LimitsConfig { // Boosts group_transcribe_level_min?: number; new_noncontact_peers_require_premium_without_ownpremium?: boolean; + channel_restrict_sponsored_level_min?: number; // Upload premium notifications upload_premium_speedup_notify_period?: number; upload_premium_speedup_download?: number; @@ -156,5 +157,6 @@ export function buildAppConfig(json: GramJs.TypeJSONValue, hash: number): ApiApp bandwidthPremiumNotifyPeriod: appConfig.upload_premium_speedup_notify_period, bandwidthPremiumUploadSpeedup: appConfig.upload_premium_speedup_upload, bandwidthPremiumDownloadSpeedup: appConfig.upload_premium_speedup_download, + channelRestrictAdsLevelMin: appConfig.channel_restrict_sponsored_level_min, }; } diff --git a/src/api/gramjs/apiBuilders/chats.ts b/src/api/gramjs/apiBuilders/chats.ts index de64b9923..403216ad4 100644 --- a/src/api/gramjs/apiBuilders/chats.ts +++ b/src/api/gramjs/apiBuilders/chats.ts @@ -17,11 +17,13 @@ import type { ApiMissingInvitedUser, ApiRestrictionReason, ApiSendAsPeerId, + ApiSponsoredMessageReportResult, ApiTopic, } from '../../types'; import { omitUndefined, pick, pickTruthy } from '../../../util/iteratees'; import { getServerTime, getServerTimeOffset } from '../../../util/serverTime'; +import { serializeBytes } from '../helpers'; import { buildApiUsernames } from './common'; import { omitVirtualClassFields } from './helpers'; import { @@ -645,3 +647,31 @@ export function buildApiMissingInvitedUser( isRequiringPremiumToInvite: user.premiumWouldAllowInvite, }; } + +export function buildApiSponsoredMessageReportResult( + result: GramJs.channels.TypeSponsoredMessageReportResult, +): ApiSponsoredMessageReportResult { + if (result instanceof GramJs.channels.SponsoredMessageReportResultReported) { + return { + type: 'reported', + }; + } + + if (result instanceof GramJs.channels.SponsoredMessageReportResultAdsHidden) { + return { + type: 'hidden', + }; + } + + const title = result.title; + const options = result.options.map((option) => ({ + text: option.text, + option: serializeBytes(option.option), + })); + + return { + type: 'selectOption', + title, + options, + }; +} diff --git a/src/api/gramjs/apiBuilders/messages.ts b/src/api/gramjs/apiBuilders/messages.ts index 0103067d6..4f9752eff 100644 --- a/src/api/gramjs/apiBuilders/messages.ts +++ b/src/api/gramjs/apiBuilders/messages.ts @@ -20,7 +20,6 @@ import type { ApiReplyInfo, ApiReplyKeyboard, ApiSponsoredMessage, - ApiSponsoredWebPage, ApiSticker, ApiStory, ApiStorySkipped, @@ -51,13 +50,12 @@ import { resolveMessageApiChatId, serializeBytes, } from '../helpers'; -import { buildApiBotApp } from './bots'; import { buildApiCallDiscardReason } from './calls'; import { buildApiPhoto, } from './common'; import { buildMessageContent, buildMessageMediaContent, buildMessageTextContent } from './messageContent'; -import { buildApiPeerId, getApiChatIdFromMtpPeer, isPeerUser } from './peers'; +import { buildApiPeerColor, buildApiPeerId, getApiChatIdFromMtpPeer } from './peers'; import { buildMessageReactions } from './reactions'; const LOCAL_MESSAGES_LIMIT = 1e6; // 1M @@ -79,33 +77,28 @@ export function setMessageBuilderCurrentUserId(_currentUserId: string) { export function buildApiSponsoredMessage(mtpMessage: GramJs.SponsoredMessage): ApiSponsoredMessage | undefined { const { - fromId, message, entities, startParam, channelPost, chatInvite, chatInviteHash, randomId, recommended, sponsorInfo, - additionalInfo, showPeerPhoto, webpage, buttonText, app, + message, entities, randomId, recommended, sponsorInfo, additionalInfo, buttonText, canReport, title, url, color, } = mtpMessage; - const chatId = fromId ? getApiChatIdFromMtpPeer(fromId) : undefined; - const chatInviteTitle = chatInvite - ? (chatInvite instanceof GramJs.ChatInvite - ? chatInvite.title - : !(chatInvite.chat instanceof GramJs.ChatEmpty) ? chatInvite.chat.title : undefined) - : undefined; + + let photo: ApiPhoto | undefined; + if (mtpMessage.photo instanceof GramJs.Photo) { + addPhotoToLocalDb(mtpMessage.photo); + photo = buildApiPhoto(mtpMessage.photo); + } return { randomId: serializeBytes(randomId), - isBot: fromId ? isPeerUser(fromId) : false, text: buildMessageTextContent(message, entities), expiresAt: Math.round(Date.now() / 1000) + SPONSORED_MESSAGE_CACHE_MS, - isRecommended: Boolean(recommended), - ...(webpage && { webPage: buildSponsoredWebPage(webpage) }), - ...(showPeerPhoto && { isAvatarShown: true }), - ...(chatId && { chatId }), - ...(chatInviteHash && { chatInviteHash }), - ...(chatInvite && { chatInviteTitle }), - ...(startParam && { startParam }), - ...(channelPost && { channelPostId: channelPost }), - ...(sponsorInfo && { sponsorInfo }), - ...(additionalInfo && { additionalInfo }), - ...(buttonText && { buttonText }), - ...(app && { botApp: buildApiBotApp(app) }), + isRecommended: recommended, + sponsorInfo, + additionalInfo, + buttonText, + canReport, + title, + url, + peerColor: color && buildApiPeerColor(color), + photo, }; } @@ -1094,19 +1087,3 @@ export function buildApiQuickReply(reply: GramJs.TypeQuickReply): ApiQuickReply topMessageId: topMessage, }; } - -function buildSponsoredWebPage(webPage: GramJs.TypeSponsoredWebPage): ApiSponsoredWebPage { - let photo: ApiPhoto | undefined; - if (webPage.photo instanceof GramJs.Photo) { - addPhotoToLocalDb(webPage.photo); - photo = buildApiPhoto(webPage.photo); - } - - return { - ...pick(webPage, [ - 'url', - 'siteName', - ]), - photo, - }; -} diff --git a/src/api/gramjs/apiBuilders/users.ts b/src/api/gramjs/apiBuilders/users.ts index 72dfd4823..a47282495 100644 --- a/src/api/gramjs/apiBuilders/users.ts +++ b/src/api/gramjs/apiBuilders/users.ts @@ -22,7 +22,7 @@ export function buildApiUserFullInfo(mtpUserFull: GramJs.users.UserFull): ApiUse profilePhoto, voiceMessagesForbidden, premiumGifts, fallbackPhoto, personalPhoto, translationsDisabled, storiesPinnedAvailable, contactRequirePremium, businessWorkHours, businessLocation, businessIntro, - birthday, personalChannelId, personalChannelMessage, + birthday, personalChannelId, personalChannelMessage, sponsoredEnabled, }, users, } = mtpUserFull; @@ -49,6 +49,7 @@ export function buildApiUserFullInfo(mtpUserFull: GramJs.users.UserFull): ApiUse businessIntro: businessIntro && buildApiBusinessIntro(businessIntro), personalChannelId: personalChannelId && buildApiPeerId(personalChannelId, 'channel'), personalChannelMessageId: personalChannelMessage, + areAdsEnabled: sponsoredEnabled, }; } diff --git a/src/api/gramjs/methods/account.ts b/src/api/gramjs/methods/account.ts index f895672c6..be6dbdb64 100644 --- a/src/api/gramjs/methods/account.ts +++ b/src/api/gramjs/methods/account.ts @@ -94,3 +94,15 @@ export async function resolveBusinessChatLink({ slug } : { slug: string }) { chatLink, }; } + +export function toggleSponsoredMessages({ + enabled, +}: { + enabled: boolean; +}) { + return invokeRequest(new GramJs.account.ToggleSponsoredMessages({ + enabled, + }), { + shouldReturnTrue: true, + }); +} diff --git a/src/api/gramjs/methods/chats.ts b/src/api/gramjs/methods/chats.ts index 45badb1a3..2383f1ee7 100644 --- a/src/api/gramjs/methods/chats.ts +++ b/src/api/gramjs/methods/chats.ts @@ -44,6 +44,7 @@ import { buildApiChatReactions, buildApiChatSettings, buildApiMissingInvitedUser, + buildApiSponsoredMessageReportResult, buildApiTopic, buildChatMembers, getPeerKey, @@ -70,6 +71,7 @@ import { addEntitiesToLocalDb, addMessageToLocalDb, addPhotoToLocalDb, + deserializeBytes, isChatFolder, } from '../helpers'; import localDb from '../localDb'; @@ -2017,3 +2019,39 @@ export async function fetchChannelRecommendations({ chat }: { chat: ApiChat }) { result instanceof GramJs.messages.ChatsSlice ? result.count : undefined, }; } + +export async function reportSponsoredMessage({ + chat, + randomId, + option, +}: { + chat: ApiChat; + randomId: string; + option: string; +}) { + const { id, accessHash } = chat; + const channel = buildInputEntity(id, accessHash); + + try { + const result = await invokeRequest(new GramJs.channels.ReportSponsoredMessage({ + channel: channel as GramJs.InputChannel, + randomId: deserializeBytes(randomId), + option: deserializeBytes(option), + }), { + shouldThrow: true, + }); + + if (!result) { + return undefined; + } + + return buildApiSponsoredMessageReportResult(result); + } catch (err) { + if (err instanceof Error && err.message === 'PREMIUM_ACCOUNT_REQUIRED') { + return { + type: 'premiumRequired' as const, + }; + } + return undefined; + } +} diff --git a/src/api/gramjs/methods/index.ts b/src/api/gramjs/methods/index.ts index 10b8e0801..b448d0ee7 100644 --- a/src/api/gramjs/methods/index.ts +++ b/src/api/gramjs/methods/index.ts @@ -22,7 +22,7 @@ export { editTopic, toggleForum, fetchTopicById, createTopic, toggleParticipantsHidden, checkChatlistInvite, joinChatlistInvite, createChalistInvite, editChatlistInvite, deleteChatlistInvite, fetchChatlistInvites, fetchLeaveChatlistSuggestions, leaveChatlist, togglePeerTranslations, setViewForumAsMessages, - fetchChannelRecommendations, fetchSavedChats, toggleSavedDialogPinned, + fetchChannelRecommendations, fetchSavedChats, toggleSavedDialogPinned, reportSponsoredMessage, } from './chats'; export { diff --git a/src/api/types/messages.ts b/src/api/types/messages.ts index f5d94b476..7f3e794b2 100644 --- a/src/api/types/messages.ts +++ b/src/api/types/messages.ts @@ -1,7 +1,7 @@ import type { ThreadId } from '../../types'; import type { ApiWebDocument } from './bots'; import type { ApiGroupCall, PhoneCallAction } from './calls'; -import type { ApiChat } from './chats'; +import type { ApiChat, ApiPeerColor } from './chats'; import type { ApiInputStorePaymentPurpose, ApiPremiumGiftCodeOption } from './payments'; import type { ApiMessageStoryData, ApiWebPageStoryData } from './stories'; @@ -382,12 +382,6 @@ export interface ApiWebPage { story?: ApiWebPageStoryData; } -export interface ApiSponsoredWebPage { - url: string; - siteName: string; - photo?: ApiPhoto; -} - export type ApiReplyInfo = ApiMessageReplyInfo | ApiStoryReplyInfo; export interface ApiMessageReplyInfo { @@ -685,22 +679,18 @@ export type ApiThreadInfo = ApiCommentsInfo | ApiMessageThreadInfo; export type ApiMessageOutgoingStatus = 'read' | 'succeeded' | 'pending' | 'failed'; export type ApiSponsoredMessage = { - chatId?: string; randomId: string; - isRecommended?: boolean; - isAvatarShown?: boolean; - isBot?: boolean; - channelPostId?: number; - startParam?: string; - chatInviteHash?: string; - chatInviteTitle?: string; + isRecommended?: true; text: ApiFormattedText; - webPage?: ApiSponsoredWebPage; expiresAt: number; sponsorInfo?: string; additionalInfo?: string; buttonText?: string; - botApp?: ApiBotApp; + canReport?: true; + title: string; + url: string; + photo?: ApiPhoto; + peerColor?: ApiPeerColor; }; // KeyboardButtons @@ -841,6 +831,17 @@ export type ApiQuickReply = { topMessageId: number; }; +export type ApiSponsoredMessageReportResult = { + type: 'reported' | 'hidden' | 'premiumRequired'; +} | { + type: 'selectOption'; + title: string; + options: { + text: string; + option: string; + }[]; +}; + export const MAIN_THREAD_ID = -1; // `Symbol` can not be transferred from worker diff --git a/src/api/types/misc.ts b/src/api/types/misc.ts index 9309edd7e..6848ef05e 100644 --- a/src/api/types/misc.ts +++ b/src/api/types/misc.ts @@ -208,6 +208,7 @@ export interface ApiAppConfig { bandwidthPremiumNotifyPeriod?: number; bandwidthPremiumUploadSpeedup?: number; bandwidthPremiumDownloadSpeedup?: number; + channelRestrictAdsLevelMin?: number; } export interface ApiConfig { diff --git a/src/api/types/users.ts b/src/api/types/users.ts index 301e3dcc9..4d15a73a2 100644 --- a/src/api/types/users.ts +++ b/src/api/types/users.ts @@ -53,6 +53,7 @@ export interface ApiUserFullInfo { noVoiceMessages?: boolean; premiumGifts?: ApiPremiumGiftOption[]; isTranslationDisabled?: true; + areAdsEnabled?: boolean; hasPinnedStories?: boolean; isContactRequirePremium?: boolean; birthday?: ApiBirthday; diff --git a/src/assets/font-icons/nochannel.svg b/src/assets/font-icons/nochannel.svg new file mode 100644 index 000000000..418bf9032 --- /dev/null +++ b/src/assets/font-icons/nochannel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/font-icons/revenue-split.svg b/src/assets/font-icons/revenue-split.svg new file mode 100644 index 000000000..4add5b4b5 --- /dev/null +++ b/src/assets/font-icons/revenue-split.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/bundles/extra.ts b/src/bundles/extra.ts index eed219e9c..c315f4df1 100644 --- a/src/bundles/extra.ts +++ b/src/bundles/extra.ts @@ -27,6 +27,7 @@ export { default as GiftCodeModal } from '../components/modals/giftcode/GiftCode export { default as ChatlistModal } from '../components/modals/chatlist/ChatlistModal'; export { default as AboutAdsModal } from '../components/common/AboutAdsModal'; +export { default as ReportAdModal } from '../components/modals/reportAd/ReportAdModal'; export { default as CalendarModal } from '../components/common/CalendarModal'; export { default as DeleteMessageModal } from '../components/common/DeleteMessageModal'; export { default as PinMessageModal } from '../components/common/PinMessageModal'; diff --git a/src/components/common/AboutAdsModal.module.scss b/src/components/common/AboutAdsModal.module.scss new file mode 100644 index 000000000..a593ec6d8 --- /dev/null +++ b/src/components/common/AboutAdsModal.module.scss @@ -0,0 +1,35 @@ +.title, .description { + text-align: center !important; + text-wrap: pretty; + padding-inline: 1.5rem; +} + +.secondary { + color: var(--color-text-secondary); +} + +.separator { + margin-block: 1rem; + width: 100%; +} + +.topIcon { + --premium-gradient: linear-gradient(88.39deg, #6C93FF -2.56%, #976FFF 51.27%, #DF69D1 107.39%); + display: grid; + place-items: center; + flex-shrink: 0; + border-radius: 50%; + background: var(--premium-gradient); + + font-size: 4rem; + color: white; + width: 6rem; + height: 6rem; + margin-bottom: 1rem; +} + +.content { + display: flex; + flex-direction: column; + align-items: center; +} diff --git a/src/components/common/AboutAdsModal.tsx b/src/components/common/AboutAdsModal.tsx index fb9c5afb9..bd0c0ae1f 100644 --- a/src/components/common/AboutAdsModal.tsx +++ b/src/components/common/AboutAdsModal.tsx @@ -1,45 +1,120 @@ import type { FC } from '../../lib/teact/teact'; -import React, { memo } from '../../lib/teact/teact'; +import React, { memo, useMemo } from '../../lib/teact/teact'; +import buildClassName from '../../util/buildClassName'; import renderText from './helpers/renderText'; +import useDerivedState from '../../hooks/useDerivedState'; import useLang from '../../hooks/useLang'; +import useSelectorSignal from '../../hooks/useSelectorSignal'; import Button from '../ui/Button'; +import ListItem from '../ui/ListItem'; import Modal from '../ui/Modal'; +import Separator from '../ui/Separator'; +import Icon from './Icon'; import SafeLink from './SafeLink'; +import styles from './AboutAdsModal.module.scss'; + export type OwnProps = { isOpen: boolean; - onClose: () => void; + isRevenueSharing?: boolean; + onClose: NoneToVoidFunction; }; const AboutAdsModal: FC = ({ isOpen, + isRevenueSharing, onClose, }) => { const lang = useLang(); + const minLevelSignal = useSelectorSignal((global) => global.appConfig?.channelRestrictAdsLevelMin); + const minLevelToRestrictAds = useDerivedState(minLevelSignal); + + const regularAdContent = useMemo(() => { + return ( + <> +

{lang('SponsoredMessageInfoScreen.Title')}

+

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

+

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

+

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

+

+ +

+

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

+ + ); + }, [lang]); + + const revenueSharingAdContent = useMemo(() => { + return ( + <> +
+

{lang('AboutRevenueSharingAds')}

+

+ {lang('RevenueSharingAdsAlertSubtitle')} +

+ + {lang('RevenueSharingAdsInfo1Title')} + + {renderText(lang('RevenueSharingAdsInfo1Subtitle'), ['simple_markdown'])} + + + + {lang('RevenueSharingAdsInfo2Title')} + + {renderText(lang('RevenueSharingAdsInfo2Subtitle'), ['simple_markdown'])} + + + + {lang('RevenueSharingAdsInfo3Title')} + + {renderText(lang('RevenueSharingAdsInfo3Subtitle', minLevelToRestrictAds), ['simple_markdown'])} + + + +

{renderText(lang('RevenueSharingAdsInfo4Title'), ['simple_markdown'])}

+

+ {renderText(lang('RevenueSharingAdsInfo4Subtitle2', ''), ['simple_markdown'])} + +

+ + ); + }, [lang, minLevelToRestrictAds]); + return ( -

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

-

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

-

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

-

- -

-

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

-
- -
+ {isRevenueSharing ? revenueSharingAdContent : regularAdContent} +
); }; diff --git a/src/components/common/PeerColorWrapper.module.scss b/src/components/common/PeerColorWrapper.module.scss new file mode 100644 index 000000000..6e91c9f00 --- /dev/null +++ b/src/components/common/PeerColorWrapper.module.scss @@ -0,0 +1,3 @@ +.root { + position: relative; +} diff --git a/src/components/common/PeerColorWrapper.tsx b/src/components/common/PeerColorWrapper.tsx index 8f0b3e83e..4515803f8 100644 --- a/src/components/common/PeerColorWrapper.tsx +++ b/src/components/common/PeerColorWrapper.tsx @@ -1,30 +1,44 @@ import React, { memo } from '../../lib/teact/teact'; -import type { ApiPeer } from '../../api/types'; +import type { ApiPeer, ApiPeerColor } from '../../api/types'; import buildClassName from '../../util/buildClassName'; -import { getPeerColorClass } from './helpers/peerColor'; +import { getApiPeerColorClass, getPeerColorClass } from './helpers/peerColor'; import EmojiIconBackground from './embedded/EmojiIconBackground'; -type OwnProps = { +import styles from './PeerColorWrapper.module.scss'; + +interface OwnProps extends React.HTMLAttributes { peer?: ApiPeer; + peerColor?: ApiPeerColor; noUserColors?: boolean; shoudReset?: boolean; className?: string; emojiIconClassName?: string; children: React.ReactNode; -}; +} function PeerColorWrapper({ - peer, noUserColors, shoudReset, className, emojiIconClassName, children, + peer, peerColor, noUserColors, shoudReset, className, emojiIconClassName, children, ...otherProps }: OwnProps) { + const color = peerColor || peer?.color; + return ( -
- {peer?.color?.backgroundEmojiId && ( +
+ {color?.backgroundEmojiId && ( )} {children} diff --git a/src/components/common/helpers/peerColor.ts b/src/components/common/helpers/peerColor.ts index fdf995100..e0219e990 100644 --- a/src/components/common/helpers/peerColor.ts +++ b/src/components/common/helpers/peerColor.ts @@ -1,4 +1,4 @@ -import type { ApiPeer } from '../../../api/types'; +import type { ApiPeer, ApiPeerColor } from '../../../api/types'; import { getPeerColorCount, getPeerColorKey } from '../../../global/helpers'; @@ -9,3 +9,7 @@ export function getPeerColorClass(peer?: ApiPeer, noUserColors?: boolean, should } return noUserColors ? `peer-color-count-${getPeerColorCount(peer)}` : `peer-color-${getPeerColorKey(peer)}`; } + +export function getApiPeerColorClass(color: ApiPeerColor) { + return `peer-color-${color.color}`; +} diff --git a/src/components/common/profile/BusinessHours.tsx b/src/components/common/profile/BusinessHours.tsx index ce63c8c13..2f6733ecd 100644 --- a/src/components/common/profile/BusinessHours.tsx +++ b/src/components/common/profile/BusinessHours.tsx @@ -114,7 +114,7 @@ const BusinessHours = ({ useEffect(() => { if (!isExpanded) return; - const slide = document.querySelector(`.${ACTIVE_SLIDE_CLASS_NAME} .${styles.timetable}`); + const slide = document.querySelector(`.${ACTIVE_SLIDE_CLASS_NAME} > .${styles.timetable}`); if (!slide) return; const height = slide.offsetHeight; @@ -124,7 +124,7 @@ const BusinessHours = ({ }, [isExpanded]); const handleAnimationStart = useLastCallback(() => { - const slide = document.querySelector(`.${TO_SLIDE_CLASS_NAME} .${styles.timetable}`)!; + const slide = document.querySelector(`.${TO_SLIDE_CLASS_NAME} > .${styles.timetable}`)!; requestMeasure(() => { const height = slide.offsetHeight; diff --git a/src/components/middle/MessageList.tsx b/src/components/middle/MessageList.tsx index 3d145fca8..854b75add 100644 --- a/src/components/middle/MessageList.tsx +++ b/src/components/middle/MessageList.tsx @@ -52,6 +52,7 @@ import { selectScrollOffset, selectTabState, selectThreadInfo, + selectUserFullInfo, } from '../../global/selectors'; import animateScroll, { isAnimatingScroll, restartCurrentScrollAnimation } from '../../util/animateScroll'; import buildClassName from '../../util/buildClassName'; @@ -101,7 +102,6 @@ type OwnProps = { }; type StateProps = { - isCurrentUserPremium?: boolean; isChatLoaded?: boolean; isChannelChat?: boolean; isGroupChat?: boolean; @@ -127,6 +127,7 @@ type StateProps = { isEmptyThread?: boolean; isForum?: boolean; currentUserId: string; + areAdsEnabled?: boolean; }; const MESSAGE_REACTIONS_POLLING_INTERVAL = 20 * 1000; @@ -150,7 +151,6 @@ const MessageList: FC = ({ hasTools, onScrollDownToggle, onNotchToggle, - isCurrentUserPremium, isChatLoaded, isForum, isChannelChat, @@ -184,6 +184,7 @@ const MessageList: FC = ({ getForceNextPinnedInHeader, onPinnedIntersectionChange, isContactRequirePremium, + areAdsEnabled, }) => { const { loadViewportMessages, setScrollOffset, loadSponsoredMessages, loadMessageReactions, copyMessagesByIds, @@ -230,10 +231,10 @@ const MessageList: FC = ({ }, [firstUnreadId]); useEffect(() => { - if (!isCurrentUserPremium && isChannelChat && isSynced && isReady) { + if (areAdsEnabled && isChannelChat && isSynced && isReady) { loadSponsoredMessages({ chatId }); } - }, [isCurrentUserPremium, chatId, isSynced, isReady, isChannelChat]); + }, [chatId, isSynced, isReady, isChannelChat, areAdsEnabled]); // Updated only once when messages are loaded (as we want the unread divider to keep its position) useSyncEffect(() => { @@ -633,7 +634,7 @@ const MessageList: FC = ({ /> ) : hasMessages ? ( ( const chatFullInfo = !isUserId(chatId) ? selectChatFullInfo(global, chatId) : undefined; const isEmptyThread = !selectThreadInfo(global, chatId, threadId)?.messagesCount; + const isCurrentUserPremium = selectIsCurrentUserPremium(global); + const areAdsEnabled = !isCurrentUserPremium || selectUserFullInfo(global, currentUserId)?.areAdsEnabled; + return { - isCurrentUserPremium: selectIsCurrentUserPremium(global), + areAdsEnabled, isChatLoaded: true, isRestricted, restrictionReason, diff --git a/src/components/middle/MessageListContent.tsx b/src/components/middle/MessageListContent.tsx index e49e65038..380b3ff47 100644 --- a/src/components/middle/MessageListContent.tsx +++ b/src/components/middle/MessageListContent.tsx @@ -32,7 +32,7 @@ import SponsoredMessage from './message/SponsoredMessage'; import MessageListBotInfo from './MessageListBotInfo'; interface OwnProps { - isCurrentUserPremium?: boolean; + areAdsEnabled?: boolean; chatId: string; threadId: ThreadId; messageIds: number[]; @@ -64,7 +64,7 @@ interface OwnProps { const UNREAD_DIVIDER_CLASS = 'unread-divider'; const MessageListContent: FC = ({ - isCurrentUserPremium, + areAdsEnabled, chatId, threadId, messageIds, @@ -290,7 +290,7 @@ const MessageListContent: FC = ({ {withHistoryTriggers &&
} {shouldRenderBotInfo && } {dateGroups.flat()} - {!isCurrentUserPremium && isViewportNewest && ( + {areAdsEnabled && isViewportNewest && ( )} {withHistoryTriggers && ( diff --git a/src/components/middle/message/Message.scss b/src/components/middle/message/Message.scss index 462406822..73d03ba8b 100644 --- a/src/components/middle/message/Message.scss +++ b/src/components/middle/message/Message.scss @@ -674,47 +674,43 @@ } } - .message-action-button { + .message-action-buttons { position: absolute; bottom: 0; - color: white; background-color: var(--pattern-color); + border-radius: 1rem; + + display: flex; + flex-direction: column; opacity: 0; - transition: opacity 150ms, backdrop-filter 150ms, filter 150ms; + transition: opacity 150ms; @media (pointer: coarse) { opacity: 1 !important; } + } - &:hover, - &:active, - &:focus { - background-color: var(--pattern-color) !important; - backdrop-filter: brightness(115%); - - @supports not (backdrop-filter: brightness(115%)) { - filter: brightness(115%); - } - } + .message-action-button { + color: white; } &:hover, &[data-is-document-group-hover] { - .message-action-button { + .message-action-buttons { opacity: 1; } } - .message-action-button-shown { + .message-action-buttons-shown { opacity: 1; } - &.own .message-action-button { + &.own .message-action-buttons { left: -3rem; } - &:not(.own) .message-action-button { + &:not(.own) .message-action-buttons { right: -3rem; } diff --git a/src/components/middle/message/Message.tsx b/src/components/middle/message/Message.tsx index ab2bc27a9..1dbd6d8e8 100644 --- a/src/components/middle/message/Message.tsx +++ b/src/components/middle/message/Message.tsx @@ -1389,7 +1389,7 @@ const Message: FC = ({ /> {!isInDocumentGroup && (
- {isSelected && } + {isSelected && }
)} {isLastInDocumentGroup && ( @@ -1398,7 +1398,7 @@ const Message: FC = ({ onClick={handleDocumentGroupSelectAll} > {isGroupSelected && ( - + )}
)} @@ -1419,33 +1419,38 @@ const Message: FC = ({ )} {renderContent()} {!isInDocumentGroupNotLast && metaPosition === 'standalone' && !isStoryMention && renderReactionsAndMeta()} - {canShowActionButton && canForward ? ( - - ) : canShowActionButton && canFocus ? ( - )} - color="translucent-white" - round - size="tiny" - ariaLabel="Focus message" - onClick={isPinnedList ? handleFocus : handleFocusForwarded} - > - - - ) : undefined} + {canFocus && ( + + )} +
+ )} {withCommentButton && ( = ({ onAboutAds, onSponsoredHide, onSponsorInfo, + onSponsoredReport, onReactionPickerOpen, onTranslate, onShowOriginal, @@ -443,9 +445,21 @@ const MessageContextMenu: FC = ({ {isSponsoredMessage && message.sponsorInfo && ( {lang('SponsoredMessageSponsor')} )} - {isSponsoredMessage && {lang('SponsoredMessageInfo')}} + {isSponsoredMessage && ( + + {lang(message.canReport ? 'AboutRevenueSharingAds' : 'SponsoredMessageInfo')} + + )} + {isSponsoredMessage && message.canReport && ( + + {lang('ReportAd')} + + )} {isSponsoredMessage && onSponsoredHide && ( - {lang('HideAd')} + <> + + {lang('HideAd')} + )} {(canShowSeenBy || canShowReactionsCount) && !isSponsoredMessage && ( <> diff --git a/src/components/middle/message/SponsoredMessage.scss b/src/components/middle/message/SponsoredMessage.scss index 9b6c0ca6b..876841654 100644 --- a/src/components/middle/message/SponsoredMessage.scss +++ b/src/components/middle/message/SponsoredMessage.scss @@ -4,6 +4,7 @@ margin-top: -0.5rem; margin-bottom: 0.5rem; + z-index: calc(var(--z-sticky-date) + 1); &::before { display: none; @@ -36,26 +37,9 @@ color: var(--color-text); } - &.with-avatar { - padding-left: 2.5rem !important; - - & > .Avatar { - display: flex !important; - } - - - @media (max-width: 600px) { - padding-left: 2.875rem !important; - - .message-content { - max-width: min(29rem, calc(100vw - 7.0625rem)) !important; - } - } - } - - .message-action-button { + .message-action-buttons { bottom: auto !important; - top: 0.5rem; + top: 0; } .message-content { @@ -67,7 +51,7 @@ } .channel-avatar { - --radius: 0.125rem; + --radius: 0.25rem; float: right; margin: 0 0 0.5rem 0.5rem; @@ -86,7 +70,6 @@ font-size: calc(var(--message-text-size, 1rem) - 0.125rem); background-color: var(--accent-background-color); border-radius: 0.375rem; - position: relative; overflow: hidden; &::before { @@ -131,4 +114,19 @@ .svg-appendix { transform: translate(0.01875rem, -0.00625rem); } + + .ad-about { + font-size: 0.6875rem; + margin-inline-start: 0.25rem; + border-radius: 1rem; + padding-inline: 0.375rem; + transition: 150ms filter ease-in; + background: var(--accent-background-active-color); + cursor: var(--custom-cursor, pointer); + filter: opacity(0.8); + + &:hover { + filter: opacity(1); + } + } } diff --git a/src/components/middle/message/SponsoredMessage.tsx b/src/components/middle/message/SponsoredMessage.tsx index e5c69f340..8ffd76dff 100644 --- a/src/components/middle/message/SponsoredMessage.tsx +++ b/src/components/middle/message/SponsoredMessage.tsx @@ -1,23 +1,16 @@ -import type { MouseEvent as ReactMouseEvent, RefObject } from 'react'; +import type { RefObject } from 'react'; import type { FC } from '../../../lib/teact/teact'; import React, { memo, useEffect, useRef } from '../../../lib/teact/teact'; import { getActions, withGlobal } from '../../../global'; -import type { - ApiChat, ApiSponsoredMessage, ApiUser, -} from '../../../api/types'; +import type { ApiSponsoredMessage } from '../../../api/types'; -import { getChatTitle, getUserFullName } from '../../../global/helpers'; -import { selectChat, selectSponsoredMessage, selectUser } from '../../../global/selectors'; +import { selectSponsoredMessage } from '../../../global/selectors'; import buildClassName from '../../../util/buildClassName'; -import { extractCurrentThemeParams } from '../../../util/themeStyle'; -import { IS_ANDROID, IS_TOUCH_ENV } from '../../../util/windowEnvironment'; -import { getPeerColorClass } from '../../common/helpers/peerColor'; -import renderText from '../../common/helpers/renderText'; +import { IS_ANDROID } from '../../../util/windowEnvironment'; import { renderTextWithEntities } from '../../common/helpers/renderTextWithEntities'; import { preventMessageInputBlur } from '../helpers/preventMessageInputBlur'; -import useAppLayout from '../../../hooks/useAppLayout'; import useContextMenuHandlers from '../../../hooks/useContextMenuHandlers'; import useFlag from '../../../hooks/useFlag'; import { useIntersectionObserver } from '../../../hooks/useIntersectionObserver'; @@ -26,6 +19,8 @@ import useLastCallback from '../../../hooks/useLastCallback'; import AboutAdsModal from '../../common/AboutAdsModal.async'; import Avatar from '../../common/Avatar'; +import Icon from '../../common/Icon'; +import PeerColorWrapper from '../../common/PeerColorWrapper'; import Button from '../../ui/Button'; import MessageAppendix from './MessageAppendix'; import SponsoredMessageContextMenuContainer from './SponsoredMessageContextMenuContainer.async'; @@ -39,31 +34,21 @@ type OwnProps = { type StateProps = { message?: ApiSponsoredMessage; - peer?: ApiChat; - bot?: ApiUser; - channel?: ApiChat; }; const INTERSECTION_DEBOUNCE_MS = 200; const SponsoredMessage: FC = ({ chatId, - peer, message, containerRef, - bot, - channel, }) => { const { viewSponsoredMessage, - openChat, - openChatByInvite, - requestAppWebView, - startBot, - focusMessage, openUrl, - openPremiumModal, + hideSponsoredMessages, clickSponsoredMessage, + reportSponsoredMessage, } = getActions(); const lang = useLang(); @@ -83,11 +68,8 @@ const SponsoredMessage: FC = ({ isContextMenuOpen, contextMenuPosition, handleBeforeContextMenu, handleContextMenu, handleContextMenuClose, handleContextMenuHide, - } = useContextMenuHandlers(ref, IS_TOUCH_ENV, true, IS_ANDROID); + } = useContextMenuHandlers(ref, undefined, true, IS_ANDROID); const [isAboutAdsModalOpen, openAboutAdsModal, closeAboutAdsModal] = useFlag(false); - const { isMobile } = useAppLayout(); - const withAvatar = Boolean(message?.isAvatarShown && peer); - const isBotApp = Boolean(message?.botApp); useEffect(() => { return shouldObserve ? observeIntersection(contentRef.current!, (target) => { @@ -102,146 +84,30 @@ const SponsoredMessage: FC = ({ handleBeforeContextMenu(e); }; - const handleAvatarClick = useLastCallback(() => { - if (!peer) { - return; - } - - openChat({ id: peer.id }); + const handleReportSponsoredMessage = useLastCallback(() => { + reportSponsoredMessage({ chatId, randomId: message!.randomId }); }); - const handleLinkClick = useLastCallback((e: ReactMouseEvent) => { - e.preventDefault(); - - clickSponsoredMessage({ chatId }); - openUrl({ url: message!.webPage!.url, shouldSkipModal: true }); - - return false; - }); - - const handleCloseSponsoredMessage = useLastCallback(() => { - openPremiumModal(); + const handleHideSponsoredMessage = useLastCallback(() => { + hideSponsoredMessages(); }); const handleClick = useLastCallback(() => { if (!message) return; clickSponsoredMessage({ chatId }); - - if (isBotApp) { - const { shortName } = message.botApp!; - const theme = extractCurrentThemeParams(); - - requestAppWebView({ - botId: message.chatId!, - appName: shortName, - startApp: message.startParam, - theme, - }); - } else if (message.chatInviteHash) { - openChatByInvite({ hash: message.chatInviteHash }); - } else if (message.channelPostId) { - focusMessage({ chatId: message.chatId!, messageId: message.channelPostId }); - } else { - openChat({ id: message.chatId }); - - if (message.startParam) { - startBot({ - botId: message.chatId!, - param: message.startParam, - }); - } - } + openUrl({ url: message!.url, shouldSkipModal: true }); }); if (!message) { return undefined; } - function renderAvatar() { - return ( - - ); - } - - function renderPhoto() { - if (message?.botApp) { - if (!message.botApp.photo) return undefined; - - return ( - - ); - } - - if (channel) { - return ( - - ); - } - - return undefined; - } - function renderContent() { - if (message?.webPage) { - return ( - <> -
-
- {renderText(message.webPage.siteName)} -
- - {renderTextWithEntities({ - text: message!.text.text, - entities: message!.text.entities, - })} - -
- - - - ); - } - - const buttonText = message?.buttonText ?? ( - isBotApp - ? lang('BotWebAppInstantViewOpen') - : (message!.isBot - ? lang('Conversation.ViewBot') - : lang(message!.channelPostId ? 'Conversation.ViewPost' : 'Conversation.ViewChannel') - )); - const title = isBotApp - ? message!.botApp!.title - : (bot - ? renderText(getUserFullName(bot) || '') - : (channel ? renderText(message!.chatInviteTitle || getChatTitle(lang, channel) || '') : '') - ); - + if (!message) return undefined; return ( <> -
{title}
+
{message.title}
{renderTextWithEntities({ @@ -258,48 +124,64 @@ const SponsoredMessage: FC = ({ isRectangular onClick={handleClick} > - {buttonText} + {message.buttonText} ); } - const contentClassName = buildClassName( - 'message-content has-shadow has-solid-background has-appendix', - getPeerColorClass(bot || peer || channel), - ); - return (
- {withAvatar && renderAvatar()}
-
- {renderPhoto()} + + {message.photo && ( + + )} {message!.isRecommended ? lang('Message.RecommendedLabel') : lang('SponsoredMessage')} + {lang('SponsoredMessageAdWhatIsThis')} {renderContent()} -
+ - +
+ + {message.canReport && ( + + )} +
{contextMenuPosition && ( = ({ anchor={contextMenuPosition} message={message!} onAboutAds={openAboutAdsModal} + onReportAd={handleReportSponsoredMessage} onClose={handleContextMenuClose} onCloseAnimationEnd={handleContextMenuHide} /> )}
@@ -322,14 +206,9 @@ const SponsoredMessage: FC = ({ export default memo(withGlobal( (global, { chatId }): StateProps => { const message = selectSponsoredMessage(global, chatId); - const peer = message?.chatId ? selectChat(global, message?.chatId) : undefined; - const { chatId: fromChatId, isBot } = message || {}; return { message, - peer, - bot: fromChatId && isBot ? selectUser(global, fromChatId) : undefined, - channel: !isBot && fromChatId ? selectChat(global, fromChatId) : undefined, }; }, )(SponsoredMessage)); diff --git a/src/components/middle/message/SponsoredMessageContextMenuContainer.tsx b/src/components/middle/message/SponsoredMessageContextMenuContainer.tsx index bb525ebd4..2e808c270 100644 --- a/src/components/middle/message/SponsoredMessageContextMenuContainer.tsx +++ b/src/components/middle/message/SponsoredMessageContextMenuContainer.tsx @@ -1,11 +1,10 @@ import type { FC } from '../../../lib/teact/teact'; import React, { memo } from '../../../lib/teact/teact'; -import { getActions, withGlobal } from '../../../global'; +import { getActions } from '../../../global'; import type { ApiSponsoredMessage } from '../../../api/types'; import type { IAnchorPosition } from '../../../types'; -import { selectIsCurrentUserPremium, selectIsPremiumPurchaseBlocked } from '../../../global/selectors'; import buildClassName from '../../../util/buildClassName'; import useFlag from '../../../hooks/useFlag'; @@ -18,22 +17,19 @@ export type OwnProps = { isOpen: boolean; message: ApiSponsoredMessage; anchor: IAnchorPosition; - onAboutAds: () => void; - onClose: () => void; - onCloseAnimationEnd: () => void; + onAboutAds: NoneToVoidFunction; + onReportAd: NoneToVoidFunction; + onClose: NoneToVoidFunction; + onCloseAnimationEnd: NoneToVoidFunction; }; -type StateProps = { - canBuyPremium?: boolean; -}; - -const SponsoredMessageContextMenuContainer: FC = ({ +const SponsoredMessageContextMenuContainer: FC = ({ message, anchor, onAboutAds, + onReportAd, onClose, onCloseAnimationEnd, - canBuyPremium, }) => { const { openPremiumModal, showDialog } = getActions(); @@ -60,6 +56,11 @@ const SponsoredMessageContextMenuContainer: FC = ({ }); }); + const handleReportSponsoredMessage = useLastCallback(() => { + closeMenu(); + onReportAd(); + }); + if (!anchor) { return undefined; } @@ -73,17 +74,12 @@ const SponsoredMessageContextMenuContainer: FC = ({ onClose={closeMenu} onCloseAnimationEnd={closeMenu} onAboutAds={handleAboutAdsOpen} - onSponsoredHide={canBuyPremium ? handleSponsoredHide : undefined} + onSponsoredHide={handleSponsoredHide} onSponsorInfo={handleSponsorInfo} + onSponsoredReport={handleReportSponsoredMessage} />
); }; -export default memo(withGlobal( - (global): StateProps => { - return { - canBuyPremium: !selectIsCurrentUserPremium(global) && !selectIsPremiumPurchaseBlocked(global), - }; - }, -)(SponsoredMessageContextMenuContainer)); +export default memo(SponsoredMessageContextMenuContainer); diff --git a/src/components/modals/ModalContainer.tsx b/src/components/modals/ModalContainer.tsx index ecddef7eb..3031de69e 100644 --- a/src/components/modals/ModalContainer.tsx +++ b/src/components/modals/ModalContainer.tsx @@ -12,6 +12,7 @@ import ChatlistModal from './chatlist/ChatlistModal.async'; import GiftCodeModal from './giftcode/GiftCodeModal.async'; import InviteViaLinkModal from './inviteViaLink/InviteViaLinkModal.async'; import OneTimeMediaModal from './oneTimeMedia/OneTimeMediaModal.async'; +import ReportAdModal from './reportAd/ReportAdModal.async'; import UrlAuthModal from './urlAuth/UrlAuthModal.async'; import WebAppModal from './webApp/WebAppModal.async'; @@ -24,6 +25,7 @@ type ModalKey = keyof Pick; @@ -47,6 +49,7 @@ const MODALS: ModalRegistry = { oneTimeMediaModal: OneTimeMediaModal, inviteViaLinkModal: InviteViaLinkModal, requestedAttachBotInstall: AttachBotInstallModal, + reportAdModal: ReportAdModal, webApp: WebAppModal, }; const MODAL_KEYS = Object.keys(MODALS) as ModalKey[]; diff --git a/src/components/modals/reportAd/ReportAdModal.async.tsx b/src/components/modals/reportAd/ReportAdModal.async.tsx new file mode 100644 index 000000000..389218040 --- /dev/null +++ b/src/components/modals/reportAd/ReportAdModal.async.tsx @@ -0,0 +1,18 @@ +import type { FC } from '../../../lib/teact/teact'; +import React from '../../../lib/teact/teact'; + +import type { OwnProps } from './ReportAdModal'; + +import { Bundles } from '../../../util/moduleLoader'; + +import useModuleLoader from '../../../hooks/useModuleLoader'; + +const ReportAdModalAsync: FC = (props) => { + const { modal } = props; + const ReportAdModal = useModuleLoader(Bundles.Extra, 'ReportAdModal', !modal); + + // eslint-disable-next-line react/jsx-props-no-spreading + return ReportAdModal ? : undefined; +}; + +export default ReportAdModalAsync; diff --git a/src/components/modals/reportAd/ReportAdModal.module.scss b/src/components/modals/reportAd/ReportAdModal.module.scss new file mode 100644 index 000000000..73ab87944 --- /dev/null +++ b/src/components/modals/reportAd/ReportAdModal.module.scss @@ -0,0 +1,54 @@ +.slide { // Do not remove .slide, identifier used in JS + overflow-x: hidden; +} + +.modalTitle { + display: flex; + flex-direction: column; +} + +.optionText { + width: 100%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.option { + margin-bottom: 0.25rem !important; +} + +.optionButton { + padding-block: 0 !important; +} + +.sectionTitle { + color: var(--color-primary); + padding-inline: 1rem; +} + +.description { + margin-top: 0.75rem; + margin-bottom: 0; + color: var(--color-text-secondary); + padding-inline: 1rem; +} + +.title { + margin-bottom: 0; +} + +.titleMultiline > .title { + font-size: 1rem; +} + +.subtitle { + font-size: 0.875rem; + color: var(--color-text-secondary); +} + +.transition { + /* stylelint-disable-next-line plugin/no-low-performance-animation-properties */ + transition: height 0.25s ease-in-out; + overflow: hidden; +} diff --git a/src/components/modals/reportAd/ReportAdModal.tsx b/src/components/modals/reportAd/ReportAdModal.tsx new file mode 100644 index 000000000..dc7d12cf5 --- /dev/null +++ b/src/components/modals/reportAd/ReportAdModal.tsx @@ -0,0 +1,157 @@ +import React, { + memo, useEffect, useMemo, useRef, +} from '../../../lib/teact/teact'; +import { getActions } from '../../../global'; + +import type { TabState } from '../../../global/types'; + +import { requestMeasure, requestMutation } from '../../../lib/fasterdom/fasterdom'; +import buildClassName from '../../../util/buildClassName'; + +import useLang from '../../../hooks/useLang'; +import useLastCallback from '../../../hooks/useLastCallback'; + +import Icon from '../../common/Icon'; +import SafeLink from '../../common/SafeLink'; +import Button from '../../ui/Button'; +import ListItem from '../../ui/ListItem'; +import Modal from '../../ui/Modal'; +import Transition, { ACTIVE_SLIDE_CLASS_NAME, TO_SLIDE_CLASS_NAME } from '../../ui/Transition'; + +import styles from './ReportAdModal.module.scss'; + +const ADDED_PADDING = 40; + +export type OwnProps = { + modal: TabState['reportAdModal']; +}; + +const ReportAdModal = ({ + modal, +}: OwnProps) => { + const { + reportSponsoredMessage, closeReportAdModal, openPreviousReportAdModal, + } = getActions(); + const lang = useLang(); + const isOpen = Boolean(modal); + + // eslint-disable-next-line no-null/no-null + const transitionRef = useRef(null); + + const handleOptionClick = useLastCallback((e, option: string) => { + const { chatId, randomId } = modal!; + reportSponsoredMessage({ chatId, randomId, option }); + }); + + const [renderingSection, renderingDepth] = useMemo(() => { + if (!modal) return [undefined, 0]; + const sectionDepth = modal.sections.length - 1; + return [modal.sections[sectionDepth], sectionDepth]; + }, [modal]); + + const handleBackClick = useLastCallback(() => { + if (!renderingDepth) { + closeReportAdModal(); + return; + } + + openPreviousReportAdModal(); + }); + + const bottomText = useMemo(() => { + if (!modal) return undefined; + const template = lang('lng_report_sponsored_reported_learn'); + const parts = template.split('{link}'); + return [ + parts[0], + , + parts[1], + ]; + }, [lang, modal]); + + const header = useMemo(() => { + if (!modal) { + return undefined; + } + + const hasSubtitle = Boolean(renderingSection?.subtitle); + + return ( +
+ +
+

{lang('ReportAd')}

+ {hasSubtitle && ( + {renderingSection.subtitle} + )} +
+
+ ); + }, [lang, modal, renderingDepth, renderingSection?.subtitle]); + + useEffect(() => { + if (!modal) return; + const slide = document.querySelector(`.${ACTIVE_SLIDE_CLASS_NAME} > .${styles.slide}`); + if (!slide) return; + + const height = slide.scrollHeight; + requestMutation(() => { + transitionRef.current!.style.height = `${height + ADDED_PADDING}px`; + }); + }, [modal]); + + const handleAnimationStart = useLastCallback(() => { + const slide = document.querySelector(`.${TO_SLIDE_CLASS_NAME} > .${styles.slide}`)!; + + requestMeasure(() => { + const height = slide.scrollHeight; + requestMutation(() => { + transitionRef.current!.style.height = `${height + ADDED_PADDING}px`; + }); + }); + }); + + return ( + + +
+

{renderingSection?.title}

+ {renderingSection?.options.map((option) => ( + +
{option.text}
+
+ ))} +
+

{bottomText}

+
+
+ ); +}; + +export default memo(ReportAdModal); diff --git a/src/components/ui/Separator.tsx b/src/components/ui/Separator.tsx index a7675591b..503cf25da 100644 --- a/src/components/ui/Separator.tsx +++ b/src/components/ui/Separator.tsx @@ -7,7 +7,7 @@ import useLang from '../../hooks/useLang'; import styles from './Separator.module.scss'; type OwnProps = { - children: React.ReactNode; + children?: React.ReactNode; className?: string; }; diff --git a/src/config.ts b/src/config.ts index 675ea4fb8..923eb364d 100644 --- a/src/config.ts +++ b/src/config.ts @@ -49,7 +49,7 @@ export const MEDIA_PROGRESSIVE_CACHE_DISABLED = false; export const MEDIA_PROGRESSIVE_CACHE_NAME = 'tt-media-progressive'; export const MEDIA_CACHE_MAX_BYTES = 512 * 1024; // 512 KB export const CUSTOM_BG_CACHE_NAME = 'tt-custom-bg'; -export const LANG_CACHE_NAME = 'tt-lang-packs-v34'; +export const LANG_CACHE_NAME = 'tt-lang-packs-v35'; export const ASSET_CACHE_NAME = 'tt-assets'; export const AUTODOWNLOAD_FILESIZE_MB_LIMITS = [1, 5, 10, 50, 100, 500]; export const DATA_BROADCAST_CHANNEL_NAME = 'tt-global'; diff --git a/src/global/actions/api/messages.ts b/src/global/actions/api/messages.ts index 932f31c5a..8beff59c2 100644 --- a/src/global/actions/api/messages.ts +++ b/src/global/actions/api/messages.ts @@ -67,6 +67,7 @@ import { addChatMessagesById, addChats, addUsers, + deleteSponsoredMessage, removeOutlyingList, removeRequestedMessageTranslation, replaceSettings, @@ -90,6 +91,7 @@ import { updateThreadUnreadFromForwardedMessage, updateTopic, updateUploadByMessageKey, + updateUserFullInfo, updateUsers, } from '../../reducers'; import { updateTabState } from '../../reducers/tabs'; @@ -1548,6 +1550,79 @@ addActionHandler('clickSponsoredMessage', (global, actions, payload): ActionRetu void callApi('clickSponsoredMessage', { chat, random: message.randomId }); }); +addActionHandler('reportSponsoredMessage', async (global, actions, payload): Promise => { + const { + chatId, randomId, option = '', tabId = getCurrentTabId(), + } = payload; + const chat = selectChat(global, chatId); + if (!chat) { + return; + } + + const result = await callApi('reportSponsoredMessage', { chat, randomId, option }); + + if (!result) return; + + if (result.type === 'premiumRequired') { + actions.openPremiumModal({ initialSection: 'no_ads', tabId }); + actions.closeReportAdModal({ tabId }); + return; + } + + if (result.type === 'reported' || result.type === 'hidden') { + actions.showNotification({ + message: translate(result.type === 'reported' ? 'AdReported' : 'AdHidden'), + tabId, + }); + actions.closeReportAdModal({ tabId }); + + global = getGlobal(); + global = deleteSponsoredMessage(global, chatId); + setGlobal(global); + return; + } + + if (result.type === 'selectOption') { + global = getGlobal(); + const oldSections = selectTabState(global, tabId).reportAdModal?.sections; + const selectedOption = oldSections?.[oldSections.length - 1]?.options.find((o) => o.option === option); + const newSection = { + title: result.title, + options: result.options, + subtitle: selectedOption?.text, + }; + global = updateTabState(global, { + reportAdModal: { + chatId, + randomId, + sections: oldSections ? [...oldSections, newSection] : [newSection], + }, + }, tabId); + setGlobal(global); + } +}); + +addActionHandler('hideSponsoredMessages', async (global, actions, payload): Promise => { + const { tabId = getCurrentTabId() } = payload || {}; + const isCurrentUserPremium = selectIsCurrentUserPremium(global); + if (!isCurrentUserPremium) { + actions.openPremiumModal({ initialSection: 'no_ads', tabId }); + return; + } + + const result = await callApi('toggleSponsoredMessages', { enabled: false }); + if (!result) return; + global = getGlobal(); + global = updateUserFullInfo(global, global.currentUserId!, { + areAdsEnabled: false, + }); + setGlobal(global); + actions.showNotification({ + message: translate('AdHidden'), + tabId, + }); +}); + addActionHandler('fetchUnreadMentions', async (global, actions, payload): Promise => { const { chatId, offsetId } = payload; await fetchUnreadMentions(global, chatId, offsetId); diff --git a/src/global/actions/ui/messages.ts b/src/global/actions/ui/messages.ts index 523eeaddf..cd9135ab2 100644 --- a/src/global/actions/ui/messages.ts +++ b/src/global/actions/ui/messages.ts @@ -863,6 +863,33 @@ addActionHandler('closeOneTimeMediaModal', (global, actions, payload): ActionRet setGlobal(global); }); +addActionHandler('closeReportAdModal', (global, actions, payload): ActionReturnType => { + const { tabId = getCurrentTabId() } = payload || {}; + return updateTabState(global, { + reportAdModal: undefined, + }, tabId); +}); + +addActionHandler('openPreviousReportAdModal', (global, actions, payload): ActionReturnType => { + const { tabId = getCurrentTabId() } = payload || {}; + const reportAdModal = selectTabState(global, tabId).reportAdModal; + if (!reportAdModal) { + return undefined; + } + + if (reportAdModal.sections.length === 1) { + actions.closeReportAdModal({ tabId }); + return undefined; + } + + return updateTabState(global, { + reportAdModal: { + ...reportAdModal, + sections: reportAdModal.sections.slice(0, -1), + }, + }, tabId); +}); + function copyTextForMessages(global: GlobalState, chatId: string, messageIds: number[]) { const { type: messageListType, threadId } = selectCurrentMessageList(global) || {}; const lang = langProvider.translate; diff --git a/src/global/reducers/messages.ts b/src/global/reducers/messages.ts index 4d5aca17c..d547170c0 100644 --- a/src/global/reducers/messages.ts +++ b/src/global/reducers/messages.ts @@ -671,6 +671,23 @@ export function updateSponsoredMessage( }; } +export function deleteSponsoredMessage( + global: T, chatId: string, +): T { + const byChatId = global.messages.sponsoredByChatId; + if (!byChatId[chatId]) { + return global; + } + + return { + ...global, + messages: { + ...global.messages, + sponsoredByChatId: omit(byChatId, [chatId]), + }, + }; +} + export function updateFocusDirection( global: T, direction?: FocusDirection, ...[tabId = getCurrentTabId()]: TabArgs diff --git a/src/global/types.ts b/src/global/types.ts index 4c84a3d60..c82a2630f 100644 --- a/src/global/types.ts +++ b/src/global/types.ts @@ -533,6 +533,19 @@ export type TabState = { openedStickerSetShortName?: string; openedCustomEmojiSetIds?: string[]; + reportAdModal?: { + chatId: string; + randomId: string; + sections: { + title: string; + subtitle?: string; + options: { + text: string; + option: string; + }[]; + }[]; + }; + activeDownloads: { byChatId: { [chatId: string]: { @@ -1465,6 +1478,14 @@ export interface ActionPayloads { clickSponsoredMessage: { chatId: string; }; + reportSponsoredMessage: { + chatId: string; + randomId: string; + option?: string; + } & WithTabId; + openPreviousReportAdModal: WithTabId | undefined; + closeReportAdModal: WithTabId | undefined; + hideSponsoredMessages: WithTabId | undefined; loadSendAs: { chatId: string; }; diff --git a/src/lib/gramjs/tl/AllTLObjects.js b/src/lib/gramjs/tl/AllTLObjects.js index d9260efba..1e9eb6837 100644 --- a/src/lib/gramjs/tl/AllTLObjects.js +++ b/src/lib/gramjs/tl/AllTLObjects.js @@ -1,6 +1,6 @@ const api = require('./api'); -const LAYER = 177; +const LAYER = 178; const tlobjects = {}; for (const tl of Object.values(api)) { diff --git a/src/lib/gramjs/tl/api.d.ts b/src/lib/gramjs/tl/api.d.ts index 3895f6bd7..9dafcf75f 100644 --- a/src/lib/gramjs/tl/api.d.ts +++ b/src/lib/gramjs/tl/api.d.ts @@ -86,7 +86,7 @@ namespace Api { export type TypeImportedContact = ImportedContact; export type TypeContactStatus = ContactStatus; export type TypeMessagesFilter = InputMessagesFilterEmpty | InputMessagesFilterPhotos | InputMessagesFilterVideo | InputMessagesFilterPhotoVideo | InputMessagesFilterDocument | InputMessagesFilterUrl | InputMessagesFilterGif | InputMessagesFilterVoice | InputMessagesFilterMusic | InputMessagesFilterChatPhotos | InputMessagesFilterPhoneCalls | InputMessagesFilterRoundVoice | InputMessagesFilterRoundVideo | InputMessagesFilterMyMentions | InputMessagesFilterGeo | InputMessagesFilterContacts | InputMessagesFilterPinned; - export type TypeUpdate = UpdateNewMessage | UpdateMessageID | UpdateDeleteMessages | UpdateUserTyping | UpdateChatUserTyping | UpdateChatParticipants | UpdateUserStatus | UpdateUserName | UpdateNewAuthorization | UpdateNewEncryptedMessage | UpdateEncryptedChatTyping | UpdateEncryption | UpdateEncryptedMessagesRead | UpdateChatParticipantAdd | UpdateChatParticipantDelete | UpdateDcOptions | UpdateNotifySettings | UpdateServiceNotification | UpdatePrivacy | UpdateUserPhone | UpdateReadHistoryInbox | UpdateReadHistoryOutbox | UpdateWebPage | UpdateReadMessagesContents | UpdateChannelTooLong | UpdateChannel | UpdateNewChannelMessage | UpdateReadChannelInbox | UpdateDeleteChannelMessages | UpdateChannelMessageViews | UpdateChatParticipantAdmin | UpdateNewStickerSet | UpdateStickerSetsOrder | UpdateStickerSets | UpdateSavedGifs | UpdateBotInlineQuery | UpdateBotInlineSend | UpdateEditChannelMessage | UpdateBotCallbackQuery | UpdateEditMessage | UpdateInlineBotCallbackQuery | UpdateReadChannelOutbox | UpdateDraftMessage | UpdateReadFeaturedStickers | UpdateRecentStickers | UpdateConfig | UpdatePtsChanged | UpdateChannelWebPage | UpdateDialogPinned | UpdatePinnedDialogs | UpdateBotWebhookJSON | UpdateBotWebhookJSONQuery | UpdateBotShippingQuery | UpdateBotPrecheckoutQuery | UpdatePhoneCall | UpdateLangPackTooLong | UpdateLangPack | UpdateFavedStickers | UpdateChannelReadMessagesContents | UpdateContactsReset | UpdateChannelAvailableMessages | UpdateDialogUnreadMark | UpdateMessagePoll | UpdateChatDefaultBannedRights | UpdateFolderPeers | UpdatePeerSettings | UpdatePeerLocated | UpdateNewScheduledMessage | UpdateDeleteScheduledMessages | UpdateTheme | UpdateGeoLiveViewed | UpdateLoginToken | UpdateMessagePollVote | UpdateDialogFilter | UpdateDialogFilterOrder | UpdateDialogFilters | UpdatePhoneCallSignalingData | UpdateChannelMessageForwards | UpdateReadChannelDiscussionInbox | UpdateReadChannelDiscussionOutbox | UpdatePeerBlocked | UpdateChannelUserTyping | UpdatePinnedMessages | UpdatePinnedChannelMessages | UpdateChat | UpdateGroupCallParticipants | UpdateGroupCall | UpdatePeerHistoryTTL | UpdateChatParticipant | UpdateChannelParticipant | UpdateBotStopped | UpdateGroupCallConnection | UpdateBotCommands | UpdatePendingJoinRequests | UpdateBotChatInviteRequester | UpdateMessageReactions | UpdateAttachMenuBots | UpdateWebViewResultSent | UpdateBotMenuButton | UpdateSavedRingtones | UpdateTranscribedAudio | UpdateReadFeaturedEmojiStickers | UpdateUserEmojiStatus | UpdateRecentEmojiStatuses | UpdateRecentReactions | UpdateMoveStickerSetToTop | UpdateMessageExtendedMedia | UpdateChannelPinnedTopic | UpdateChannelPinnedTopics | UpdateUser | UpdateAutoSaveSettings | UpdateStory | UpdateReadStories | UpdateStoryID | UpdateStoriesStealthMode | UpdateSentStoryReaction | UpdateBotChatBoost | UpdateChannelViewForumAsMessages | UpdatePeerWallpaper | UpdateBotMessageReaction | UpdateBotMessageReactions | UpdateSavedDialogPinned | UpdatePinnedSavedDialogs | UpdateSavedReactionTags | UpdateSmsJob | UpdateQuickReplies | UpdateNewQuickReply | UpdateDeleteQuickReply | UpdateQuickReplyMessage | UpdateDeleteQuickReplyMessages | UpdateBotBusinessConnect | UpdateBotNewBusinessMessage | UpdateBotEditBusinessMessage | UpdateBotDeleteBusinessMessage; + export type TypeUpdate = UpdateNewMessage | UpdateMessageID | UpdateDeleteMessages | UpdateUserTyping | UpdateChatUserTyping | UpdateChatParticipants | UpdateUserStatus | UpdateUserName | UpdateNewAuthorization | UpdateNewEncryptedMessage | UpdateEncryptedChatTyping | UpdateEncryption | UpdateEncryptedMessagesRead | UpdateChatParticipantAdd | UpdateChatParticipantDelete | UpdateDcOptions | UpdateNotifySettings | UpdateServiceNotification | UpdatePrivacy | UpdateUserPhone | UpdateReadHistoryInbox | UpdateReadHistoryOutbox | UpdateWebPage | UpdateReadMessagesContents | UpdateChannelTooLong | UpdateChannel | UpdateNewChannelMessage | UpdateReadChannelInbox | UpdateDeleteChannelMessages | UpdateChannelMessageViews | UpdateChatParticipantAdmin | UpdateNewStickerSet | UpdateStickerSetsOrder | UpdateStickerSets | UpdateSavedGifs | UpdateBotInlineQuery | UpdateBotInlineSend | UpdateEditChannelMessage | UpdateBotCallbackQuery | UpdateEditMessage | UpdateInlineBotCallbackQuery | UpdateReadChannelOutbox | UpdateDraftMessage | UpdateReadFeaturedStickers | UpdateRecentStickers | UpdateConfig | UpdatePtsChanged | UpdateChannelWebPage | UpdateDialogPinned | UpdatePinnedDialogs | UpdateBotWebhookJSON | UpdateBotWebhookJSONQuery | UpdateBotShippingQuery | UpdateBotPrecheckoutQuery | UpdatePhoneCall | UpdateLangPackTooLong | UpdateLangPack | UpdateFavedStickers | UpdateChannelReadMessagesContents | UpdateContactsReset | UpdateChannelAvailableMessages | UpdateDialogUnreadMark | UpdateMessagePoll | UpdateChatDefaultBannedRights | UpdateFolderPeers | UpdatePeerSettings | UpdatePeerLocated | UpdateNewScheduledMessage | UpdateDeleteScheduledMessages | UpdateTheme | UpdateGeoLiveViewed | UpdateLoginToken | UpdateMessagePollVote | UpdateDialogFilter | UpdateDialogFilterOrder | UpdateDialogFilters | UpdatePhoneCallSignalingData | UpdateChannelMessageForwards | UpdateReadChannelDiscussionInbox | UpdateReadChannelDiscussionOutbox | UpdatePeerBlocked | UpdateChannelUserTyping | UpdatePinnedMessages | UpdatePinnedChannelMessages | UpdateChat | UpdateGroupCallParticipants | UpdateGroupCall | UpdatePeerHistoryTTL | UpdateChatParticipant | UpdateChannelParticipant | UpdateBotStopped | UpdateGroupCallConnection | UpdateBotCommands | UpdatePendingJoinRequests | UpdateBotChatInviteRequester | UpdateMessageReactions | UpdateAttachMenuBots | UpdateWebViewResultSent | UpdateBotMenuButton | UpdateSavedRingtones | UpdateTranscribedAudio | UpdateReadFeaturedEmojiStickers | UpdateUserEmojiStatus | UpdateRecentEmojiStatuses | UpdateRecentReactions | UpdateMoveStickerSetToTop | UpdateMessageExtendedMedia | UpdateChannelPinnedTopic | UpdateChannelPinnedTopics | UpdateUser | UpdateAutoSaveSettings | UpdateStory | UpdateReadStories | UpdateStoryID | UpdateStoriesStealthMode | UpdateSentStoryReaction | UpdateBotChatBoost | UpdateChannelViewForumAsMessages | UpdatePeerWallpaper | UpdateBotMessageReaction | UpdateBotMessageReactions | UpdateSavedDialogPinned | UpdatePinnedSavedDialogs | UpdateSavedReactionTags | UpdateSmsJob | UpdateQuickReplies | UpdateNewQuickReply | UpdateDeleteQuickReply | UpdateQuickReplyMessage | UpdateDeleteQuickReplyMessages | UpdateBotBusinessConnect | UpdateBotNewBusinessMessage | UpdateBotEditBusinessMessage | UpdateBotDeleteBusinessMessage | UpdateNewStoryReaction; export type TypeUpdates = UpdatesTooLong | UpdateShortMessage | UpdateShortChatMessage | UpdateShort | UpdatesCombined | Updates | UpdateShortSentMessage; export type TypeDcOption = DcOption; export type TypeConfig = Config; @@ -234,7 +234,7 @@ namespace Api { export type TypeBaseTheme = BaseThemeClassic | BaseThemeDay | BaseThemeNight | BaseThemeTinted | BaseThemeArctic; export type TypeInputThemeSettings = InputThemeSettings; export type TypeThemeSettings = ThemeSettings; - export type TypeWebPageAttribute = WebPageAttributeTheme | WebPageAttributeStory; + export type TypeWebPageAttribute = WebPageAttributeTheme | WebPageAttributeStory | WebPageAttributeStickerSet; export type TypeBankCardOpenUrl = BankCardOpenUrl; export type TypeDialogFilter = DialogFilter | DialogFilterDefault | DialogFilterChatlist; export type TypeDialogFilterSuggested = DialogFilterSuggested; @@ -310,7 +310,6 @@ namespace Api { export type TypeInputChatlist = InputChatlistDialogFilter; export type TypeExportedChatlistInvite = ExportedChatlistInvite; export type TypeMessagePeerVote = MessagePeerVote | MessagePeerVoteInputOption | MessagePeerVoteMultiple; - export type TypeSponsoredWebPage = SponsoredWebPage; export type TypeStoryViews = StoryViews; export type TypeStoryItem = StoryItemDeleted | StoryItemSkipped | StoryItem; export type TypeStoryView = StoryView | StoryViewPublicForward | StoryViewPublicRepost; @@ -361,6 +360,8 @@ namespace Api { export type TypeRequestedPeer = RequestedPeerUser | RequestedPeerChat | RequestedPeerChannel; export type TypeSponsoredMessageReportOption = SponsoredMessageReportOption; export type TypeBroadcastRevenueTransaction = BroadcastRevenueTransactionProceeds | BroadcastRevenueTransactionWithdrawal | BroadcastRevenueTransactionRefund; + export type TypeReactionNotificationsFrom = ReactionNotificationsFromContacts | ReactionNotificationsFromAll; + export type TypeReactionsNotifySettings = ReactionsNotifySettings; export type TypeResPQ = ResPQ; export type TypeP_Q_inner_data = PQInnerData | PQInnerDataDc | PQInnerDataTemp | PQInnerDataTempDc; export type TypeServer_DH_Params = ServerDHParamsFail | ServerDHParamsOk; @@ -1372,6 +1373,7 @@ namespace Api { requestsPending?: int; recentRequesters?: long[]; availableReactions?: Api.TypeChatReactions; + reactionsLimit?: int; }> { // flags: undefined; canSetUsername?: true; @@ -1393,6 +1395,7 @@ namespace Api { requestsPending?: int; recentRequesters?: long[]; availableReactions?: Api.TypeChatReactions; + reactionsLimit?: int; }; export class ChannelFull extends VirtualClass<{ // flags: undefined; @@ -1448,6 +1451,7 @@ namespace Api { recentRequesters?: long[]; defaultSendAs?: Api.TypePeer; availableReactions?: Api.TypeChatReactions; + reactionsLimit?: int; stories?: Api.TypePeerStories; wallpaper?: Api.TypeWallPaper; boostsApplied?: int; @@ -1507,6 +1511,7 @@ namespace Api { recentRequesters?: long[]; defaultSendAs?: Api.TypePeer; availableReactions?: Api.TypeChatReactions; + reactionsLimit?: int; stories?: Api.TypePeerStories; wallpaper?: Api.TypeWallPaper; boostsApplied?: int; @@ -2500,6 +2505,7 @@ namespace Api { contactRequirePremium?: true; readDatesPrivate?: true; // flags2: undefined; + sponsoredEnabled?: true; id: long; about?: string; settings: Api.TypePeerSettings; @@ -2543,6 +2549,7 @@ namespace Api { contactRequirePremium?: true; readDatesPrivate?: true; // flags2: undefined; + sponsoredEnabled?: true; id: long; about?: string; settings: Api.TypePeerSettings; @@ -3757,6 +3764,15 @@ namespace Api { messages: int[]; qts: int; }; + export class UpdateNewStoryReaction extends VirtualClass<{ + storyId: int; + peer: Api.TypePeer; + reaction: Api.TypeReaction; + }> { + storyId: int; + peer: Api.TypePeer; + reaction: Api.TypeReaction; + }; export class UpdatesTooLong extends VirtualClass {}; export class UpdateShortMessage extends VirtualClass<{ // flags: undefined; @@ -7593,6 +7609,7 @@ namespace Api { allowAppHash?: true; allowMissedCall?: true; allowFirebase?: true; + unknownNumber?: true; logoutTokens?: bytes[]; token?: string; appSandbox?: Bool; @@ -7603,6 +7620,7 @@ namespace Api { allowAppHash?: true; allowMissedCall?: true; allowFirebase?: true; + unknownNumber?: true; logoutTokens?: bytes[]; token?: string; appSandbox?: Bool; @@ -7871,6 +7889,17 @@ namespace Api { id: int; story?: Api.TypeStoryItem; }; + export class WebPageAttributeStickerSet extends VirtualClass<{ + // flags: undefined; + emojis?: true; + textColor?: true; + stickers: Api.TypeDocument[]; + }> { + // flags: undefined; + emojis?: true; + textColor?: true; + stickers: Api.TypeDocument[]; + }; export class BankCardOpenUrl extends VirtualClass<{ url: string; name: string; @@ -8300,37 +8329,29 @@ namespace Api { export class SponsoredMessage extends VirtualClass<{ // flags: undefined; recommended?: true; - showPeerPhoto?: true; canReport?: true; randomId: bytes; - fromId?: Api.TypePeer; - chatInvite?: Api.TypeChatInvite; - chatInviteHash?: string; - channelPost?: int; - startParam?: string; - webpage?: Api.TypeSponsoredWebPage; - app?: Api.TypeBotApp; + url: string; + title: string; message: string; entities?: Api.TypeMessageEntity[]; - buttonText?: string; + photo?: Api.TypePhoto; + color?: Api.TypePeerColor; + buttonText: string; sponsorInfo?: string; additionalInfo?: string; }> { // flags: undefined; recommended?: true; - showPeerPhoto?: true; canReport?: true; randomId: bytes; - fromId?: Api.TypePeer; - chatInvite?: Api.TypeChatInvite; - chatInviteHash?: string; - channelPost?: int; - startParam?: string; - webpage?: Api.TypeSponsoredWebPage; - app?: Api.TypeBotApp; + url: string; + title: string; message: string; entities?: Api.TypeMessageEntity[]; - buttonText?: string; + photo?: Api.TypePhoto; + color?: Api.TypePeerColor; + buttonText: string; sponsorInfo?: string; additionalInfo?: string; }; @@ -9001,17 +9022,6 @@ namespace Api { options: bytes[]; date: int; }; - export class SponsoredWebPage extends VirtualClass<{ - // flags: undefined; - url: string; - siteName: string; - photo?: Api.TypePhoto; - }> { - // flags: undefined; - url: string; - siteName: string; - photo?: Api.TypePhoto; - }; export class StoryViews extends VirtualClass<{ // flags: undefined; hasViewers?: true; @@ -9820,6 +9830,21 @@ namespace Api { date: int; provider: string; }; + export class ReactionNotificationsFromContacts extends VirtualClass {}; + export class ReactionNotificationsFromAll extends VirtualClass {}; + export class ReactionsNotifySettings extends VirtualClass<{ + // flags: undefined; + messagesNotifyFrom?: Api.TypeReactionNotificationsFrom; + storiesNotifyFrom?: Api.TypeReactionNotificationsFrom; + sound: Api.TypeNotificationSound; + showPreviews: Bool; + }> { + // flags: undefined; + messagesNotifyFrom?: Api.TypeReactionNotificationsFrom; + storiesNotifyFrom?: Api.TypeReactionNotificationsFrom; + sound: Api.TypeNotificationSound; + showPreviews: Bool; + }; export class ResPQ extends VirtualClass<{ nonce: int128; serverNonce: int128; @@ -12315,13 +12340,17 @@ namespace Api { stealthMode: Api.TypeStoriesStealthMode; }; export class Stories extends VirtualClass<{ + // flags: undefined; count: int; stories: Api.TypeStoryItem[]; + pinnedToTop?: int[]; chats: Api.TypeChat[]; users: Api.TypeUser[]; }> { + // flags: undefined; count: int; stories: Api.TypeStoryItem[]; + pinnedToTop?: int[]; chats: Api.TypeChat[]; users: Api.TypeUser[]; }; @@ -13468,6 +13497,17 @@ namespace Api { }>, Bool> { channel: Api.TypeInputChannel; }; + export class ToggleSponsoredMessages extends Request, Bool> { + enabled: Bool; + }; + export class GetReactionsNotifySettings extends Request {}; + export class SetReactionsNotifySettings extends Request, Api.TypeReactionsNotifySettings> { + settings: Api.TypeReactionsNotifySettings; + }; } export namespace users { @@ -14192,6 +14232,7 @@ namespace Api { }; export class SearchGlobal extends Request, messages.TypeMessages> { // flags: undefined; + broadcastsOnly?: true; folderId?: int; q: string; filter: Api.TypeMessagesFilter; @@ -15215,11 +15257,15 @@ namespace Api { limit: int; }; export class SetChatAvailableReactions extends Request, Api.TypeUpdates> { + // flags: undefined; peer: Api.TypeInputPeer; availableReactions: Api.TypeChatReactions; + reactionsLimit?: int; }; export class GetAvailableReactions extends Request, messages.TypeChats> { - channel: Api.TypeInputChannel; + // flags: undefined; + channel?: Api.TypeInputChannel; + } | void>, messages.TypeChats> { + // flags: undefined; + channel?: Api.TypeInputChannel; }; export class UpdateEmojiStatus extends Request, Bool> { + peer: Api.TypeInputPeer; + id: int[]; + }; } export namespace premium { @@ -17671,7 +17726,7 @@ namespace Api { export type AnyRequest = InvokeAfterMsg | InvokeAfterMsgs | InitConnection | InvokeWithLayer | InvokeWithoutUpdates | InvokeWithMessagesRange | InvokeWithTakeout | InvokeWithBusinessConnection | ReqPq | ReqPqMulti | ReqPqMultiNew | ReqDHParams | SetClientDHParams | DestroyAuthKey | RpcDropAnswer | GetFutureSalts | Ping | PingDelayDisconnect | DestroySession | auth.SendCode | auth.SignUp | auth.SignIn | auth.LogOut | auth.ResetAuthorizations | auth.ExportAuthorization | auth.ImportAuthorization | auth.BindTempAuthKey | auth.ImportBotAuthorization | auth.CheckPassword | auth.RequestPasswordRecovery | auth.RecoverPassword | auth.ResendCode | auth.CancelCode | auth.DropTempAuthKeys | auth.ExportLoginToken | auth.ImportLoginToken | auth.AcceptLoginToken | auth.CheckRecoveryPassword | auth.ImportWebTokenAuthorization | auth.RequestFirebaseSms | auth.ResetLoginEmail - | account.RegisterDevice | account.UnregisterDevice | account.UpdateNotifySettings | account.GetNotifySettings | account.ResetNotifySettings | account.UpdateProfile | account.UpdateStatus | account.GetWallPapers | account.ReportPeer | account.CheckUsername | account.UpdateUsername | account.GetPrivacy | account.SetPrivacy | account.DeleteAccount | account.GetAccountTTL | account.SetAccountTTL | account.SendChangePhoneCode | account.ChangePhone | account.UpdateDeviceLocked | account.GetAuthorizations | account.ResetAuthorization | account.GetPassword | account.GetPasswordSettings | account.UpdatePasswordSettings | account.SendConfirmPhoneCode | account.ConfirmPhone | account.GetTmpPassword | account.GetWebAuthorizations | account.ResetWebAuthorization | account.ResetWebAuthorizations | account.GetAllSecureValues | account.GetSecureValue | account.SaveSecureValue | account.DeleteSecureValue | account.GetAuthorizationForm | account.AcceptAuthorization | account.SendVerifyPhoneCode | account.VerifyPhone | account.SendVerifyEmailCode | account.VerifyEmail | account.InitTakeoutSession | account.FinishTakeoutSession | account.ConfirmPasswordEmail | account.ResendPasswordEmail | account.CancelPasswordEmail | account.GetContactSignUpNotification | account.SetContactSignUpNotification | account.GetNotifyExceptions | account.GetWallPaper | account.UploadWallPaper | account.SaveWallPaper | account.InstallWallPaper | account.ResetWallPapers | account.GetAutoDownloadSettings | account.SaveAutoDownloadSettings | account.UploadTheme | account.CreateTheme | account.UpdateTheme | account.SaveTheme | account.InstallTheme | account.GetTheme | account.GetThemes | account.SetContentSettings | account.GetContentSettings | account.GetMultiWallPapers | account.GetGlobalPrivacySettings | account.SetGlobalPrivacySettings | account.ReportProfilePhoto | account.ResetPassword | account.DeclinePasswordReset | account.GetChatThemes | account.SetAuthorizationTTL | account.ChangeAuthorizationSettings | account.GetSavedRingtones | account.SaveRingtone | account.UploadRingtone | account.UpdateEmojiStatus | account.GetDefaultEmojiStatuses | account.GetRecentEmojiStatuses | account.ClearRecentEmojiStatuses | account.ReorderUsernames | account.ToggleUsername | account.GetDefaultProfilePhotoEmojis | account.GetDefaultGroupPhotoEmojis | account.GetAutoSaveSettings | account.SaveAutoSaveSettings | account.DeleteAutoSaveExceptions | account.InvalidateSignInCodes | account.UpdateColor | account.GetDefaultBackgroundEmojis | account.GetChannelDefaultEmojiStatuses | account.GetChannelRestrictedStatusEmojis | account.UpdateBusinessWorkHours | account.UpdateBusinessLocation | account.UpdateBusinessGreetingMessage | account.UpdateBusinessAwayMessage | account.UpdateConnectedBot | account.GetConnectedBots | account.GetBotBusinessConnection | account.UpdateBusinessIntro | account.ToggleConnectedBotPaused | account.DisablePeerConnectedBot | account.UpdateBirthday | account.CreateBusinessChatLink | account.EditBusinessChatLink | account.DeleteBusinessChatLink | account.GetBusinessChatLinks | account.ResolveBusinessChatLink | account.UpdatePersonalChannel + | account.RegisterDevice | account.UnregisterDevice | account.UpdateNotifySettings | account.GetNotifySettings | account.ResetNotifySettings | account.UpdateProfile | account.UpdateStatus | account.GetWallPapers | account.ReportPeer | account.CheckUsername | account.UpdateUsername | account.GetPrivacy | account.SetPrivacy | account.DeleteAccount | account.GetAccountTTL | account.SetAccountTTL | account.SendChangePhoneCode | account.ChangePhone | account.UpdateDeviceLocked | account.GetAuthorizations | account.ResetAuthorization | account.GetPassword | account.GetPasswordSettings | account.UpdatePasswordSettings | account.SendConfirmPhoneCode | account.ConfirmPhone | account.GetTmpPassword | account.GetWebAuthorizations | account.ResetWebAuthorization | account.ResetWebAuthorizations | account.GetAllSecureValues | account.GetSecureValue | account.SaveSecureValue | account.DeleteSecureValue | account.GetAuthorizationForm | account.AcceptAuthorization | account.SendVerifyPhoneCode | account.VerifyPhone | account.SendVerifyEmailCode | account.VerifyEmail | account.InitTakeoutSession | account.FinishTakeoutSession | account.ConfirmPasswordEmail | account.ResendPasswordEmail | account.CancelPasswordEmail | account.GetContactSignUpNotification | account.SetContactSignUpNotification | account.GetNotifyExceptions | account.GetWallPaper | account.UploadWallPaper | account.SaveWallPaper | account.InstallWallPaper | account.ResetWallPapers | account.GetAutoDownloadSettings | account.SaveAutoDownloadSettings | account.UploadTheme | account.CreateTheme | account.UpdateTheme | account.SaveTheme | account.InstallTheme | account.GetTheme | account.GetThemes | account.SetContentSettings | account.GetContentSettings | account.GetMultiWallPapers | account.GetGlobalPrivacySettings | account.SetGlobalPrivacySettings | account.ReportProfilePhoto | account.ResetPassword | account.DeclinePasswordReset | account.GetChatThemes | account.SetAuthorizationTTL | account.ChangeAuthorizationSettings | account.GetSavedRingtones | account.SaveRingtone | account.UploadRingtone | account.UpdateEmojiStatus | account.GetDefaultEmojiStatuses | account.GetRecentEmojiStatuses | account.ClearRecentEmojiStatuses | account.ReorderUsernames | account.ToggleUsername | account.GetDefaultProfilePhotoEmojis | account.GetDefaultGroupPhotoEmojis | account.GetAutoSaveSettings | account.SaveAutoSaveSettings | account.DeleteAutoSaveExceptions | account.InvalidateSignInCodes | account.UpdateColor | account.GetDefaultBackgroundEmojis | account.GetChannelDefaultEmojiStatuses | account.GetChannelRestrictedStatusEmojis | account.UpdateBusinessWorkHours | account.UpdateBusinessLocation | account.UpdateBusinessGreetingMessage | account.UpdateBusinessAwayMessage | account.UpdateConnectedBot | account.GetConnectedBots | account.GetBotBusinessConnection | account.UpdateBusinessIntro | account.ToggleConnectedBotPaused | account.DisablePeerConnectedBot | account.UpdateBirthday | account.CreateBusinessChatLink | account.EditBusinessChatLink | account.DeleteBusinessChatLink | account.GetBusinessChatLinks | account.ResolveBusinessChatLink | account.UpdatePersonalChannel | account.ToggleSponsoredMessages | account.GetReactionsNotifySettings | account.SetReactionsNotifySettings | users.GetUsers | users.GetFullUser | users.SetSecureValueErrors | users.GetIsPremiumRequiredToContact | contacts.GetContactIDs | contacts.GetStatuses | contacts.GetContacts | contacts.ImportContacts | contacts.DeleteContacts | contacts.DeleteByPhones | contacts.Block | contacts.Unblock | contacts.GetBlocked | contacts.Search | contacts.ResolveUsername | contacts.GetTopPeers | contacts.ResetTopPeerRating | contacts.ResetSaved | contacts.GetSaved | contacts.ToggleTopPeers | contacts.AddContact | contacts.AcceptContact | contacts.GetLocated | contacts.BlockFromReplies | contacts.ResolvePhone | contacts.ExportContactToken | contacts.ImportContactToken | contacts.EditCloseFriends | contacts.SetBlocked | contacts.GetBirthdays | messages.GetMessages | messages.GetDialogs | messages.GetHistory | messages.Search | messages.ReadHistory | messages.DeleteHistory | messages.DeleteMessages | messages.ReceivedMessages | messages.SetTyping | messages.SendMessage | messages.SendMedia | messages.ForwardMessages | messages.ReportSpam | messages.GetPeerSettings | messages.Report | messages.GetChats | messages.GetFullChat | messages.EditChatTitle | messages.EditChatPhoto | messages.AddChatUser | messages.DeleteChatUser | messages.CreateChat | messages.GetDhConfig | messages.RequestEncryption | messages.AcceptEncryption | messages.DiscardEncryption | messages.SetEncryptedTyping | messages.ReadEncryptedHistory | messages.SendEncrypted | messages.SendEncryptedFile | messages.SendEncryptedService | messages.ReceivedQueue | messages.ReportEncryptedSpam | messages.ReadMessageContents | messages.GetStickers | messages.GetAllStickers | messages.GetWebPagePreview | messages.ExportChatInvite | messages.CheckChatInvite | messages.ImportChatInvite | messages.GetStickerSet | messages.InstallStickerSet | messages.UninstallStickerSet | messages.StartBot | messages.GetMessagesViews | messages.EditChatAdmin | messages.MigrateChat | messages.SearchGlobal | messages.ReorderStickerSets | messages.GetDocumentByHash | messages.GetSavedGifs | messages.SaveGif | messages.GetInlineBotResults | messages.SetInlineBotResults | messages.SendInlineBotResult | messages.GetMessageEditData | messages.EditMessage | messages.EditInlineBotMessage | messages.GetBotCallbackAnswer | messages.SetBotCallbackAnswer | messages.GetPeerDialogs | messages.SaveDraft | messages.GetAllDrafts | messages.GetFeaturedStickers | messages.ReadFeaturedStickers | messages.GetRecentStickers | messages.SaveRecentSticker | messages.ClearRecentStickers | messages.GetArchivedStickers | messages.GetMaskStickers | messages.GetAttachedStickers | messages.SetGameScore | messages.SetInlineGameScore | messages.GetGameHighScores | messages.GetInlineGameHighScores | messages.GetCommonChats | messages.GetWebPage | messages.ToggleDialogPin | messages.ReorderPinnedDialogs | messages.GetPinnedDialogs | messages.SetBotShippingResults | messages.SetBotPrecheckoutResults | messages.UploadMedia | messages.SendScreenshotNotification | messages.GetFavedStickers | messages.FaveSticker | messages.GetUnreadMentions | messages.ReadMentions | messages.GetRecentLocations | messages.SendMultiMedia | messages.UploadEncryptedFile | messages.SearchStickerSets | messages.GetSplitRanges | messages.MarkDialogUnread | messages.GetDialogUnreadMarks | messages.ClearAllDrafts | messages.UpdatePinnedMessage | messages.SendVote | messages.GetPollResults | messages.GetOnlines | messages.EditChatAbout | messages.EditChatDefaultBannedRights | messages.GetEmojiKeywords | messages.GetEmojiKeywordsDifference | messages.GetEmojiKeywordsLanguages | messages.GetEmojiURL | messages.GetSearchCounters | messages.RequestUrlAuth | messages.AcceptUrlAuth | messages.HidePeerSettingsBar | messages.GetScheduledHistory | messages.GetScheduledMessages | messages.SendScheduledMessages | messages.DeleteScheduledMessages | messages.GetPollVotes | messages.ToggleStickerSets | messages.GetDialogFilters | messages.GetSuggestedDialogFilters | messages.UpdateDialogFilter | messages.UpdateDialogFiltersOrder | messages.GetOldFeaturedStickers | messages.GetReplies | messages.GetDiscussionMessage | messages.ReadDiscussion | messages.UnpinAllMessages | messages.DeleteChat | messages.DeletePhoneCallHistory | messages.CheckHistoryImport | messages.InitHistoryImport | messages.UploadImportedMedia | messages.StartHistoryImport | messages.GetExportedChatInvites | messages.GetExportedChatInvite | messages.EditExportedChatInvite | messages.DeleteRevokedExportedChatInvites | messages.DeleteExportedChatInvite | messages.GetAdminsWithInvites | messages.GetChatInviteImporters | messages.SetHistoryTTL | messages.CheckHistoryImportPeer | messages.SetChatTheme | messages.GetMessageReadParticipants | messages.GetSearchResultsCalendar | messages.GetSearchResultsPositions | messages.HideChatJoinRequest | messages.HideAllChatJoinRequests | messages.ToggleNoForwards | messages.SaveDefaultSendAs | messages.SendReaction | messages.GetMessagesReactions | messages.GetMessageReactionsList | messages.SetChatAvailableReactions | messages.GetAvailableReactions | messages.SetDefaultReaction | messages.TranslateText | messages.GetUnreadReactions | messages.ReadReactions | messages.SearchSentMedia | messages.GetAttachMenuBots | messages.GetAttachMenuBot | messages.ToggleBotInAttachMenu | messages.RequestWebView | messages.ProlongWebView | messages.RequestSimpleWebView | messages.SendWebViewResultMessage | messages.SendWebViewData | messages.TranscribeAudio | messages.RateTranscribedAudio | messages.GetCustomEmojiDocuments | messages.GetEmojiStickers | messages.GetFeaturedEmojiStickers | messages.ReportReaction | messages.GetTopReactions | messages.GetRecentReactions | messages.ClearRecentReactions | messages.GetExtendedMedia | messages.SetDefaultHistoryTTL | messages.GetDefaultHistoryTTL | messages.SendBotRequestedPeer | messages.GetEmojiGroups | messages.GetEmojiStatusGroups | messages.GetEmojiProfilePhotoGroups | messages.SearchCustomEmoji | messages.TogglePeerTranslations | messages.GetBotApp | messages.RequestAppWebView | messages.SetChatWallPaper | messages.SearchEmojiStickerSets | messages.GetSavedDialogs | messages.GetSavedHistory | messages.DeleteSavedHistory | messages.GetPinnedSavedDialogs | messages.ToggleSavedDialogPin | messages.ReorderPinnedSavedDialogs | messages.GetSavedReactionTags | messages.UpdateSavedReactionTag | messages.GetDefaultTagReactions | messages.GetOutboxReadDate | messages.GetQuickReplies | messages.ReorderQuickReplies | messages.CheckQuickReplyShortcut | messages.EditQuickReplyShortcut | messages.DeleteQuickReplyShortcut | messages.GetQuickReplyMessages | messages.SendQuickReplyMessages | messages.DeleteQuickReplyMessages | messages.ToggleDialogFilterTags | messages.GetMyStickers @@ -17688,7 +17743,7 @@ namespace Api { | folders.EditPeerFolders | stats.GetBroadcastStats | stats.LoadAsyncGraph | stats.GetMegagroupStats | stats.GetMessagePublicForwards | stats.GetMessageStats | stats.GetStoryStats | stats.GetStoryPublicForwards | stats.GetBroadcastRevenueStats | stats.GetBroadcastRevenueWithdrawalUrl | stats.GetBroadcastRevenueTransactions | chatlists.ExportChatlistInvite | chatlists.DeleteExportedInvite | chatlists.EditExportedInvite | chatlists.GetExportedInvites | chatlists.CheckChatlistInvite | chatlists.JoinChatlistInvite | chatlists.GetChatlistUpdates | chatlists.JoinChatlistUpdates | chatlists.HideChatlistUpdates | chatlists.GetLeaveChatlistSuggestions | chatlists.LeaveChatlist - | stories.CanSendStory | stories.SendStory | stories.EditStory | stories.DeleteStories | stories.TogglePinned | stories.GetAllStories | stories.GetPinnedStories | stories.GetStoriesArchive | stories.GetStoriesByID | stories.ToggleAllStoriesHidden | stories.ReadStories | stories.IncrementStoryViews | stories.GetStoryViewsList | stories.GetStoriesViews | stories.ExportStoryLink | stories.Report | stories.ActivateStealthMode | stories.SendReaction | stories.GetPeerStories | stories.GetAllReadPeerStories | stories.GetPeerMaxIDs | stories.GetChatsToSend | stories.TogglePeerStoriesHidden | stories.GetStoryReactionsList + | stories.CanSendStory | stories.SendStory | stories.EditStory | stories.DeleteStories | stories.TogglePinned | stories.GetAllStories | stories.GetPinnedStories | stories.GetStoriesArchive | stories.GetStoriesByID | stories.ToggleAllStoriesHidden | stories.ReadStories | stories.IncrementStoryViews | stories.GetStoryViewsList | stories.GetStoriesViews | stories.ExportStoryLink | stories.Report | stories.ActivateStealthMode | stories.SendReaction | stories.GetPeerStories | stories.GetAllReadPeerStories | stories.GetPeerMaxIDs | stories.GetChatsToSend | stories.TogglePeerStoriesHidden | stories.GetStoryReactionsList | stories.TogglePinnedToTop | premium.GetBoostsList | premium.GetMyBoosts | premium.ApplyBoost | premium.GetBoostsStatus | premium.GetUserBoosts | smsjobs.IsEligibleToJoin | smsjobs.Join | smsjobs.Leave | smsjobs.UpdateSettings | smsjobs.GetStatus | smsjobs.GetSmsJob | smsjobs.FinishJob | fragment.GetCollectibleInfo; diff --git a/src/lib/gramjs/tl/apiTl.js b/src/lib/gramjs/tl/apiTl.js index e993ac270..b662ac747 100644 --- a/src/lib/gramjs/tl/apiTl.js +++ b/src/lib/gramjs/tl/apiTl.js @@ -80,8 +80,8 @@ chat#41cbf256 flags:# creator:flags.0?true left:flags.2?true deactivated:flags.5 chatForbidden#6592a1a7 id:long title:string = Chat; channel#aadfc8f flags:# creator:flags.0?true left:flags.2?true broadcast:flags.5?true verified:flags.7?true megagroup:flags.8?true restricted:flags.9?true signatures:flags.11?true min:flags.12?true scam:flags.19?true has_link:flags.20?true has_geo:flags.21?true slowmode_enabled:flags.22?true call_active:flags.23?true call_not_empty:flags.24?true fake:flags.25?true gigagroup:flags.26?true noforwards:flags.27?true join_to_send:flags.28?true join_request:flags.29?true forum:flags.30?true flags2:# stories_hidden:flags2.1?true stories_hidden_min:flags2.2?true stories_unavailable:flags2.3?true id:long access_hash:flags.13?long title:string username:flags.6?string photo:ChatPhoto date:int restriction_reason:flags.9?Vector admin_rights:flags.14?ChatAdminRights banned_rights:flags.15?ChatBannedRights default_banned_rights:flags.18?ChatBannedRights participants_count:flags.17?int usernames:flags2.0?Vector stories_max_id:flags2.4?int color:flags2.7?PeerColor profile_color:flags2.8?PeerColor emoji_status:flags2.9?EmojiStatus level:flags2.10?int = Chat; channelForbidden#17d493d5 flags:# broadcast:flags.5?true megagroup:flags.8?true id:long access_hash:long title:string until_date:flags.16?int = Chat; -chatFull#c9d31138 flags:# can_set_username:flags.7?true has_scheduled:flags.8?true translations_disabled:flags.19?true id:long about:string participants:ChatParticipants chat_photo:flags.2?Photo notify_settings:PeerNotifySettings exported_invite:flags.13?ExportedChatInvite bot_info:flags.3?Vector pinned_msg_id:flags.6?int folder_id:flags.11?int call:flags.12?InputGroupCall ttl_period:flags.14?int groupcall_default_join_as:flags.15?Peer theme_emoticon:flags.16?string requests_pending:flags.17?int recent_requesters:flags.17?Vector available_reactions:flags.18?ChatReactions = ChatFull; -channelFull#44c054a7 flags:# can_view_participants:flags.3?true can_set_username:flags.6?true can_set_stickers:flags.7?true hidden_prehistory:flags.10?true can_set_location:flags.16?true has_scheduled:flags.19?true can_view_stats:flags.20?true blocked:flags.22?true flags2:# can_delete_channel:flags2.0?true antispam:flags2.1?true participants_hidden:flags2.2?true translations_disabled:flags2.3?true stories_pinned_available:flags2.5?true view_forum_as_messages:flags2.6?true restricted_sponsored:flags2.11?true can_view_revenue:flags2.12?true id:long about:string participants_count:flags.0?int admins_count:flags.1?int kicked_count:flags.2?int banned_count:flags.2?int online_count:flags.13?int read_inbox_max_id:int read_outbox_max_id:int unread_count:int chat_photo:Photo notify_settings:PeerNotifySettings exported_invite:flags.23?ExportedChatInvite bot_info:Vector migrated_from_chat_id:flags.4?long migrated_from_max_id:flags.4?int pinned_msg_id:flags.5?int stickerset:flags.8?StickerSet available_min_id:flags.9?int folder_id:flags.11?int linked_chat_id:flags.14?long location:flags.15?ChannelLocation slowmode_seconds:flags.17?int slowmode_next_send_date:flags.18?int stats_dc:flags.12?int pts:int call:flags.21?InputGroupCall ttl_period:flags.24?int pending_suggestions:flags.25?Vector groupcall_default_join_as:flags.26?Peer theme_emoticon:flags.27?string requests_pending:flags.28?int recent_requesters:flags.28?Vector default_send_as:flags.29?Peer available_reactions:flags.30?ChatReactions stories:flags2.4?PeerStories wallpaper:flags2.7?WallPaper boosts_applied:flags2.8?int boosts_unrestrict:flags2.9?int emojiset:flags2.10?StickerSet = ChatFull; +chatFull#2633421b flags:# can_set_username:flags.7?true has_scheduled:flags.8?true translations_disabled:flags.19?true id:long about:string participants:ChatParticipants chat_photo:flags.2?Photo notify_settings:PeerNotifySettings exported_invite:flags.13?ExportedChatInvite bot_info:flags.3?Vector pinned_msg_id:flags.6?int folder_id:flags.11?int call:flags.12?InputGroupCall ttl_period:flags.14?int groupcall_default_join_as:flags.15?Peer theme_emoticon:flags.16?string requests_pending:flags.17?int recent_requesters:flags.17?Vector available_reactions:flags.18?ChatReactions reactions_limit:flags.20?int = ChatFull; +channelFull#bbab348d flags:# can_view_participants:flags.3?true can_set_username:flags.6?true can_set_stickers:flags.7?true hidden_prehistory:flags.10?true can_set_location:flags.16?true has_scheduled:flags.19?true can_view_stats:flags.20?true blocked:flags.22?true flags2:# can_delete_channel:flags2.0?true antispam:flags2.1?true participants_hidden:flags2.2?true translations_disabled:flags2.3?true stories_pinned_available:flags2.5?true view_forum_as_messages:flags2.6?true restricted_sponsored:flags2.11?true can_view_revenue:flags2.12?true id:long about:string participants_count:flags.0?int admins_count:flags.1?int kicked_count:flags.2?int banned_count:flags.2?int online_count:flags.13?int read_inbox_max_id:int read_outbox_max_id:int unread_count:int chat_photo:Photo notify_settings:PeerNotifySettings exported_invite:flags.23?ExportedChatInvite bot_info:Vector migrated_from_chat_id:flags.4?long migrated_from_max_id:flags.4?int pinned_msg_id:flags.5?int stickerset:flags.8?StickerSet available_min_id:flags.9?int folder_id:flags.11?int linked_chat_id:flags.14?long location:flags.15?ChannelLocation slowmode_seconds:flags.17?int slowmode_next_send_date:flags.18?int stats_dc:flags.12?int pts:int call:flags.21?InputGroupCall ttl_period:flags.24?int pending_suggestions:flags.25?Vector groupcall_default_join_as:flags.26?Peer theme_emoticon:flags.27?string requests_pending:flags.28?int recent_requesters:flags.28?Vector default_send_as:flags.29?Peer available_reactions:flags.30?ChatReactions reactions_limit:flags2.13?int stories:flags2.4?PeerStories wallpaper:flags2.7?WallPaper boosts_applied:flags2.8?int boosts_unrestrict:flags2.9?int emojiset:flags2.10?StickerSet = ChatFull; chatParticipant#c02d4007 user_id:long inviter_id:long date:int = ChatParticipant; chatParticipantCreator#e46bcee4 user_id:long = ChatParticipant; chatParticipantAdmin#a0933f5b user_id:long inviter_id:long date:int = ChatParticipant; @@ -188,7 +188,7 @@ inputReportReasonGeoIrrelevant#dbd4feed = ReportReason; inputReportReasonFake#f5ddd6e7 = ReportReason; inputReportReasonIllegalDrugs#a8eb2be = ReportReason; inputReportReasonPersonalDetails#9ec7863d = ReportReason; -userFull#cc997720 flags:# blocked:flags.0?true phone_calls_available:flags.4?true phone_calls_private:flags.5?true can_pin_message:flags.7?true has_scheduled:flags.12?true video_calls_available:flags.13?true voice_messages_forbidden:flags.20?true translations_disabled:flags.23?true stories_pinned_available:flags.26?true blocked_my_stories_from:flags.27?true wallpaper_overridden:flags.28?true contact_require_premium:flags.29?true read_dates_private:flags.30?true flags2:# id:long about:flags.1?string settings:PeerSettings personal_photo:flags.21?Photo profile_photo:flags.2?Photo fallback_photo:flags.22?Photo notify_settings:PeerNotifySettings bot_info:flags.3?BotInfo pinned_msg_id:flags.6?int common_chats_count:int folder_id:flags.11?int ttl_period:flags.14?int theme_emoticon:flags.15?string private_forward_name:flags.16?string bot_group_admin_rights:flags.17?ChatAdminRights bot_broadcast_admin_rights:flags.18?ChatAdminRights premium_gifts:flags.19?Vector wallpaper:flags.24?WallPaper stories:flags.25?PeerStories business_work_hours:flags2.0?BusinessWorkHours business_location:flags2.1?BusinessLocation business_greeting_message:flags2.2?BusinessGreetingMessage business_away_message:flags2.3?BusinessAwayMessage business_intro:flags2.4?BusinessIntro birthday:flags2.5?Birthday personal_channel_id:flags2.6?long personal_channel_message:flags2.6?int = UserFull; +userFull#cc997720 flags:# blocked:flags.0?true phone_calls_available:flags.4?true phone_calls_private:flags.5?true can_pin_message:flags.7?true has_scheduled:flags.12?true video_calls_available:flags.13?true voice_messages_forbidden:flags.20?true translations_disabled:flags.23?true stories_pinned_available:flags.26?true blocked_my_stories_from:flags.27?true wallpaper_overridden:flags.28?true contact_require_premium:flags.29?true read_dates_private:flags.30?true flags2:# sponsored_enabled:flags2.7?true id:long about:flags.1?string settings:PeerSettings personal_photo:flags.21?Photo profile_photo:flags.2?Photo fallback_photo:flags.22?Photo notify_settings:PeerNotifySettings bot_info:flags.3?BotInfo pinned_msg_id:flags.6?int common_chats_count:int folder_id:flags.11?int ttl_period:flags.14?int theme_emoticon:flags.15?string private_forward_name:flags.16?string bot_group_admin_rights:flags.17?ChatAdminRights bot_broadcast_admin_rights:flags.18?ChatAdminRights premium_gifts:flags.19?Vector wallpaper:flags.24?WallPaper stories:flags.25?PeerStories business_work_hours:flags2.0?BusinessWorkHours business_location:flags2.1?BusinessLocation business_greeting_message:flags2.2?BusinessGreetingMessage business_away_message:flags2.3?BusinessAwayMessage business_intro:flags2.4?BusinessIntro birthday:flags2.5?Birthday personal_channel_id:flags2.6?long personal_channel_message:flags2.6?int = UserFull; contact#145ade0b user_id:long mutual:Bool = Contact; importedContact#c13e3c50 user_id:long client_id:long = ImportedContact; contactStatus#16d9703b user_id:long status:UserStatus = ContactStatus; @@ -359,6 +359,7 @@ updateBotBusinessConnect#8ae5c97a connection:BotBusinessConnection qts:int = Upd updateBotNewBusinessMessage#9ddb347c flags:# connection_id:string message:Message reply_to_message:flags.0?Message qts:int = Update; updateBotEditBusinessMessage#7df587c flags:# connection_id:string message:Message reply_to_message:flags.0?Message qts:int = Update; updateBotDeleteBusinessMessage#a02a982e connection_id:string peer:Peer messages:Vector qts:int = Update; +updateNewStoryReaction#1824e40b story_id:int peer:Peer reaction:Reaction = Update; updates.state#a56c2a3e pts:int qts:int date:int seq:int unread_count:int = updates.State; updates.differenceEmpty#5d75a138 date:int seq:int = updates.Difference; updates.difference#f49ca0 new_messages:Vector new_encrypted_messages:Vector other_updates:Vector chats:Vector users:Vector state:updates.State = updates.Difference; @@ -927,7 +928,7 @@ inputWallPaperSlug#72091c80 slug:string = InputWallPaper; inputWallPaperNoFile#967a462e id:long = InputWallPaper; account.wallPapersNotModified#1c199183 = account.WallPapers; account.wallPapers#cdc3858c hash:long wallpapers:Vector = account.WallPapers; -codeSettings#ad253d78 flags:# allow_flashcall:flags.0?true current_number:flags.1?true allow_app_hash:flags.4?true allow_missed_call:flags.5?true allow_firebase:flags.7?true logout_tokens:flags.6?Vector token:flags.8?string app_sandbox:flags.8?Bool = CodeSettings; +codeSettings#ad253d78 flags:# allow_flashcall:flags.0?true current_number:flags.1?true allow_app_hash:flags.4?true allow_missed_call:flags.5?true allow_firebase:flags.7?true unknown_number:flags.9?true logout_tokens:flags.6?Vector token:flags.8?string app_sandbox:flags.8?Bool = CodeSettings; wallPaperSettings#372efcd0 flags:# blur:flags.1?true motion:flags.2?true background_color:flags.0?int second_background_color:flags.4?int third_background_color:flags.5?int fourth_background_color:flags.6?int intensity:flags.3?int rotation:flags.4?int emoticon:flags.7?string = WallPaperSettings; autoDownloadSettings#baa57628 flags:# disabled:flags.0?true video_preload_large:flags.1?true audio_preload_next:flags.2?true phonecalls_less_data:flags.3?true stories_preload:flags.4?true photo_size_max:int video_size_max:long file_size_max:long video_upload_maxbitrate:int small_queue_active_operations_max:int large_queue_active_operations_max:int = AutoDownloadSettings; account.autoDownloadSettings#63cacf26 low:AutoDownloadSettings medium:AutoDownloadSettings high:AutoDownloadSettings = account.AutoDownloadSettings; @@ -967,6 +968,7 @@ inputThemeSettings#8fde504f flags:# message_colors_animated:flags.2?true base_th themeSettings#fa58b6d4 flags:# message_colors_animated:flags.2?true base_theme:BaseTheme accent_color:int outbox_accent_color:flags.3?int message_colors:flags.0?Vector wallpaper:flags.1?WallPaper = ThemeSettings; webPageAttributeTheme#54b56617 flags:# documents:flags.0?Vector settings:flags.1?ThemeSettings = WebPageAttribute; webPageAttributeStory#2e94c3e7 flags:# peer:Peer id:int story:flags.0?StoryItem = WebPageAttribute; +webPageAttributeStickerSet#50cc03d3 flags:# emojis:flags.0?true text_color:flags.1?true stickers:Vector = WebPageAttribute; messages.votesList#4899484e flags:# count:int votes:Vector chats:Vector users:Vector next_offset:flags.0?string = messages.VotesList; bankCardOpenUrl#f568028a url:string name:string = BankCardOpenUrl; payments.bankCardData#3e24e573 title:string open_urls:Vector = payments.BankCardData; @@ -1041,7 +1043,7 @@ botCommandScopePeerUser#a1321f3 peer:InputPeer user_id:InputUser = BotCommandSco account.resetPasswordFailedWait#e3779861 retry_date:int = account.ResetPasswordResult; account.resetPasswordRequestedWait#e9effc7d until_date:int = account.ResetPasswordResult; account.resetPasswordOk#e926d63e = account.ResetPasswordResult; -sponsoredMessage#ed5383f7 flags:# recommended:flags.5?true show_peer_photo:flags.6?true can_report:flags.12?true random_id:bytes from_id:flags.3?Peer chat_invite:flags.4?ChatInvite chat_invite_hash:flags.4?string channel_post:flags.2?int start_param:flags.0?string webpage:flags.9?SponsoredWebPage app:flags.10?BotApp message:string entities:flags.1?Vector button_text:flags.11?string sponsor_info:flags.7?string additional_info:flags.8?string = SponsoredMessage; +sponsoredMessage#bdedf566 flags:# recommended:flags.5?true can_report:flags.12?true random_id:bytes url:string title:string message:string entities:flags.1?Vector photo:flags.6?Photo color:flags.13?PeerColor button_text:string sponsor_info:flags.7?string additional_info:flags.8?string = SponsoredMessage; messages.sponsoredMessages#c9ee1d87 flags:# posts_between:flags.0?int messages:Vector chats:Vector users:Vector = messages.SponsoredMessages; messages.sponsoredMessagesEmpty#1839490f = messages.SponsoredMessages; searchResultsCalendarPeriod#c9b0539f date:int min_msg_id:int max_msg_id:int count:int = SearchResultsCalendarPeriod; @@ -1165,14 +1167,13 @@ bots.botInfo#e8a775b0 name:string about:string description:string = bots.BotInfo messagePeerVote#b6cc2d5c peer:Peer option:bytes date:int = MessagePeerVote; messagePeerVoteInputOption#74cda504 peer:Peer date:int = MessagePeerVote; messagePeerVoteMultiple#4628f6e6 peer:Peer options:Vector date:int = MessagePeerVote; -sponsoredWebPage#3db8ec63 flags:# url:string site_name:string photo:flags.0?Photo = SponsoredWebPage; storyViews#8d595cd6 flags:# has_viewers:flags.1?true views_count:int forwards_count:flags.2?int reactions:flags.3?Vector reactions_count:flags.4?int recent_viewers:flags.0?Vector = StoryViews; storyItemDeleted#51e6ee4f id:int = StoryItem; storyItemSkipped#ffadc913 flags:# close_friends:flags.8?true id:int date:int expire_date:int = StoryItem; storyItem#79b26a24 flags:# pinned:flags.5?true public:flags.7?true close_friends:flags.8?true min:flags.9?true noforwards:flags.10?true edited:flags.11?true contacts:flags.12?true selected_contacts:flags.13?true out:flags.16?true id:int date:int from_id:flags.18?Peer fwd_from:flags.17?StoryFwdHeader expire_date:int caption:flags.0?string entities:flags.1?Vector media:MessageMedia media_areas:flags.14?Vector privacy:flags.2?Vector views:flags.3?StoryViews sent_reaction:flags.15?Reaction = StoryItem; stories.allStoriesNotModified#1158fe3e flags:# state:string stealth_mode:StoriesStealthMode = stories.AllStories; stories.allStories#6efc5e81 flags:# has_more:flags.0?true count:int state:string peer_stories:Vector chats:Vector users:Vector stealth_mode:StoriesStealthMode = stories.AllStories; -stories.stories#5dd8c3c8 count:int stories:Vector chats:Vector users:Vector = stories.Stories; +stories.stories#63c3dd0a flags:# count:int stories:Vector pinned_to_top:flags.0?Vector chats:Vector users:Vector = stories.Stories; storyView#b0bdeac5 flags:# blocked:flags.0?true blocked_my_stories_from:flags.1?true user_id:long date:int reaction:flags.2?Reaction = StoryView; storyViewPublicForward#9083670b flags:# blocked:flags.0?true blocked_my_stories_from:flags.1?true message:Message = StoryView; storyViewPublicRepost#bd74cf49 flags:# blocked:flags.0?true blocked_my_stories_from:flags.1?true peer_id:Peer story:StoryItem = StoryView; @@ -1284,6 +1285,9 @@ broadcastRevenueTransactionProceeds#557e2cc4 amount:long from_date:int to_date:i broadcastRevenueTransactionWithdrawal#5a590978 flags:# pending:flags.0?true failed:flags.2?true amount:long date:int provider:string transaction_date:flags.1?int transaction_url:flags.1?string = BroadcastRevenueTransaction; broadcastRevenueTransactionRefund#42d30d2e amount:long date:int provider:string = BroadcastRevenueTransaction; stats.broadcastRevenueTransactions#87158466 count:int transactions:Vector = stats.BroadcastRevenueTransactions; +reactionNotificationsFromContacts#bac3a61a = ReactionNotificationsFrom; +reactionNotificationsFromAll#4b9e22a0 = ReactionNotificationsFrom; +reactionsNotifySettings#56e34970 flags:# messages_notify_from:flags.0?ReactionNotificationsFrom stories_notify_from:flags.1?ReactionNotificationsFrom sound:NotificationSound show_previews:Bool = ReactionsNotifySettings; ---functions--- invokeAfterMsg#cb9f372d {X:Type} msg_id:long query:!X = X; initConnection#c1cd5ea9 {X:Type} flags:# api_id:int device_model:string system_version:string app_version:string system_lang_code:string lang_pack:string lang_code:string proxy:flags.0?InputClientProxy params:flags.1?JSONValue query:!X = X; @@ -1345,6 +1349,7 @@ account.getRecentEmojiStatuses#f578105 hash:long = account.EmojiStatuses; account.reorderUsernames#ef500eab order:Vector = Bool; account.toggleUsername#58d6b376 username:string active:Bool = Bool; account.resolveBusinessChatLink#5492e5ee slug:string = account.ResolvedBusinessChatLinks; +account.toggleSponsoredMessages#b9d9a38d enabled:Bool = Bool; users.getUsers#d91a548 id:Vector = Vector; users.getFullUser#b60f5918 id:InputUser = users.UserFull; contacts.getContacts#5dd69e12 hash:long = contacts.Contacts; @@ -1395,7 +1400,7 @@ messages.uninstallStickerSet#f96e55de stickerset:InputStickerSet = Bool; messages.startBot#e6df7378 bot:InputUser peer:InputPeer random_id:long start_param:string = Updates; messages.getMessagesViews#5784d3e1 peer:InputPeer id:Vector increment:Bool = messages.MessageViews; messages.migrateChat#a2875319 chat_id:long = Updates; -messages.searchGlobal#4bc6589a flags:# folder_id:flags.0?int q:string filter:MessagesFilter min_date:int max_date:int offset_rate:int offset_peer:InputPeer offset_id:int limit:int = messages.Messages; +messages.searchGlobal#4bc6589a flags:# broadcasts_only:flags.1?true folder_id:flags.0?int q:string filter:MessagesFilter min_date:int max_date:int offset_rate:int offset_peer:InputPeer offset_id:int limit:int = messages.Messages; messages.getDocumentByHash#b1f2061f sha256:bytes size:long mime_type:string = Document; messages.getSavedGifs#5cf09635 hash:long = messages.SavedGifs; messages.saveGif#327a30cb id:InputDocument unsave:Bool = Bool; @@ -1457,7 +1462,7 @@ messages.saveDefaultSendAs#ccfddf96 peer:InputPeer send_as:InputPeer = Bool; messages.sendReaction#d30d78d4 flags:# big:flags.1?true add_to_recent:flags.2?true peer:InputPeer msg_id:int reaction:flags.0?Vector = Updates; messages.getMessagesReactions#8bba90e6 peer:InputPeer id:Vector = Updates; messages.getMessageReactionsList#461b3f48 flags:# peer:InputPeer id:int reaction:flags.0?Reaction offset:flags.1?string limit:int = messages.MessageReactionsList; -messages.setChatAvailableReactions#feb16771 peer:InputPeer available_reactions:ChatReactions = Updates; +messages.setChatAvailableReactions#5a150bd4 flags:# peer:InputPeer available_reactions:ChatReactions reactions_limit:flags.0?int = Updates; messages.getAvailableReactions#18dea0ac hash:int = messages.AvailableReactions; messages.setDefaultReaction#4f47a016 reaction:Reaction = Bool; messages.translateText#63183030 flags:# peer:flags.0?InputPeer id:flags.0?Vector text:flags.1?Vector to_lang:string = messages.TranslatedText; @@ -1557,7 +1562,8 @@ channels.deleteTopicHistory#34435f2d channel:InputChannel top_msg_id:int = messa channels.toggleParticipantsHidden#6a6e7854 channel:InputChannel enabled:Bool = Updates; channels.clickSponsoredMessage#18afbc93 channel:InputChannel random_id:bytes = Bool; channels.toggleViewForumAsMessages#9738bb15 channel:InputChannel enabled:Bool = Updates; -channels.getChannelRecommendations#83b70d97 channel:InputChannel = messages.Chats; +channels.getChannelRecommendations#25a71742 flags:# channel:flags.0?InputChannel = messages.Chats; +channels.reportSponsoredMessage#af8ff6b9 channel:InputChannel random_id:bytes option:bytes = channels.SponsoredMessageReportResult; bots.setBotInfo#10cf3123 flags:# bot:flags.2?InputUser lang_code:string name:flags.3?string about:flags.0?string description:flags.1?string = Bool; bots.canSendMessage#1359f4e6 bot:InputUser = Bool; bots.allowSendMessage#f132e3ef bot:InputUser = Updates; diff --git a/src/lib/gramjs/tl/static/api.json b/src/lib/gramjs/tl/static/api.json index 3d03916b2..c50389935 100644 --- a/src/lib/gramjs/tl/static/api.json +++ b/src/lib/gramjs/tl/static/api.json @@ -59,6 +59,7 @@ "account.reorderUsernames", "account.toggleUsername", "account.resolveBusinessChatLink", + "account.toggleSponsoredMessages", "users.getUsers", "users.getFullUser", "contacts.getContacts", @@ -221,6 +222,7 @@ "channels.viewSponsoredMessage", "channels.getSponsoredMessages", "channels.getChannelRecommendations", + "channels.reportSponsoredMessage", "bots.canSendMessage", "bots.allowSendMessage", "bots.invokeWebViewCustomMethod", diff --git a/src/lib/gramjs/tl/static/api.tl b/src/lib/gramjs/tl/static/api.tl index e319e0e22..4f5794895 100644 --- a/src/lib/gramjs/tl/static/api.tl +++ b/src/lib/gramjs/tl/static/api.tl @@ -100,8 +100,8 @@ chatForbidden#6592a1a7 id:long title:string = Chat; channel#aadfc8f flags:# creator:flags.0?true left:flags.2?true broadcast:flags.5?true verified:flags.7?true megagroup:flags.8?true restricted:flags.9?true signatures:flags.11?true min:flags.12?true scam:flags.19?true has_link:flags.20?true has_geo:flags.21?true slowmode_enabled:flags.22?true call_active:flags.23?true call_not_empty:flags.24?true fake:flags.25?true gigagroup:flags.26?true noforwards:flags.27?true join_to_send:flags.28?true join_request:flags.29?true forum:flags.30?true flags2:# stories_hidden:flags2.1?true stories_hidden_min:flags2.2?true stories_unavailable:flags2.3?true id:long access_hash:flags.13?long title:string username:flags.6?string photo:ChatPhoto date:int restriction_reason:flags.9?Vector admin_rights:flags.14?ChatAdminRights banned_rights:flags.15?ChatBannedRights default_banned_rights:flags.18?ChatBannedRights participants_count:flags.17?int usernames:flags2.0?Vector stories_max_id:flags2.4?int color:flags2.7?PeerColor profile_color:flags2.8?PeerColor emoji_status:flags2.9?EmojiStatus level:flags2.10?int = Chat; channelForbidden#17d493d5 flags:# broadcast:flags.5?true megagroup:flags.8?true id:long access_hash:long title:string until_date:flags.16?int = Chat; -chatFull#c9d31138 flags:# can_set_username:flags.7?true has_scheduled:flags.8?true translations_disabled:flags.19?true id:long about:string participants:ChatParticipants chat_photo:flags.2?Photo notify_settings:PeerNotifySettings exported_invite:flags.13?ExportedChatInvite bot_info:flags.3?Vector pinned_msg_id:flags.6?int folder_id:flags.11?int call:flags.12?InputGroupCall ttl_period:flags.14?int groupcall_default_join_as:flags.15?Peer theme_emoticon:flags.16?string requests_pending:flags.17?int recent_requesters:flags.17?Vector available_reactions:flags.18?ChatReactions = ChatFull; -channelFull#44c054a7 flags:# can_view_participants:flags.3?true can_set_username:flags.6?true can_set_stickers:flags.7?true hidden_prehistory:flags.10?true can_set_location:flags.16?true has_scheduled:flags.19?true can_view_stats:flags.20?true blocked:flags.22?true flags2:# can_delete_channel:flags2.0?true antispam:flags2.1?true participants_hidden:flags2.2?true translations_disabled:flags2.3?true stories_pinned_available:flags2.5?true view_forum_as_messages:flags2.6?true restricted_sponsored:flags2.11?true can_view_revenue:flags2.12?true id:long about:string participants_count:flags.0?int admins_count:flags.1?int kicked_count:flags.2?int banned_count:flags.2?int online_count:flags.13?int read_inbox_max_id:int read_outbox_max_id:int unread_count:int chat_photo:Photo notify_settings:PeerNotifySettings exported_invite:flags.23?ExportedChatInvite bot_info:Vector migrated_from_chat_id:flags.4?long migrated_from_max_id:flags.4?int pinned_msg_id:flags.5?int stickerset:flags.8?StickerSet available_min_id:flags.9?int folder_id:flags.11?int linked_chat_id:flags.14?long location:flags.15?ChannelLocation slowmode_seconds:flags.17?int slowmode_next_send_date:flags.18?int stats_dc:flags.12?int pts:int call:flags.21?InputGroupCall ttl_period:flags.24?int pending_suggestions:flags.25?Vector groupcall_default_join_as:flags.26?Peer theme_emoticon:flags.27?string requests_pending:flags.28?int recent_requesters:flags.28?Vector default_send_as:flags.29?Peer available_reactions:flags.30?ChatReactions stories:flags2.4?PeerStories wallpaper:flags2.7?WallPaper boosts_applied:flags2.8?int boosts_unrestrict:flags2.9?int emojiset:flags2.10?StickerSet = ChatFull; +chatFull#2633421b flags:# can_set_username:flags.7?true has_scheduled:flags.8?true translations_disabled:flags.19?true id:long about:string participants:ChatParticipants chat_photo:flags.2?Photo notify_settings:PeerNotifySettings exported_invite:flags.13?ExportedChatInvite bot_info:flags.3?Vector pinned_msg_id:flags.6?int folder_id:flags.11?int call:flags.12?InputGroupCall ttl_period:flags.14?int groupcall_default_join_as:flags.15?Peer theme_emoticon:flags.16?string requests_pending:flags.17?int recent_requesters:flags.17?Vector available_reactions:flags.18?ChatReactions reactions_limit:flags.20?int = ChatFull; +channelFull#bbab348d flags:# can_view_participants:flags.3?true can_set_username:flags.6?true can_set_stickers:flags.7?true hidden_prehistory:flags.10?true can_set_location:flags.16?true has_scheduled:flags.19?true can_view_stats:flags.20?true blocked:flags.22?true flags2:# can_delete_channel:flags2.0?true antispam:flags2.1?true participants_hidden:flags2.2?true translations_disabled:flags2.3?true stories_pinned_available:flags2.5?true view_forum_as_messages:flags2.6?true restricted_sponsored:flags2.11?true can_view_revenue:flags2.12?true id:long about:string participants_count:flags.0?int admins_count:flags.1?int kicked_count:flags.2?int banned_count:flags.2?int online_count:flags.13?int read_inbox_max_id:int read_outbox_max_id:int unread_count:int chat_photo:Photo notify_settings:PeerNotifySettings exported_invite:flags.23?ExportedChatInvite bot_info:Vector migrated_from_chat_id:flags.4?long migrated_from_max_id:flags.4?int pinned_msg_id:flags.5?int stickerset:flags.8?StickerSet available_min_id:flags.9?int folder_id:flags.11?int linked_chat_id:flags.14?long location:flags.15?ChannelLocation slowmode_seconds:flags.17?int slowmode_next_send_date:flags.18?int stats_dc:flags.12?int pts:int call:flags.21?InputGroupCall ttl_period:flags.24?int pending_suggestions:flags.25?Vector groupcall_default_join_as:flags.26?Peer theme_emoticon:flags.27?string requests_pending:flags.28?int recent_requesters:flags.28?Vector default_send_as:flags.29?Peer available_reactions:flags.30?ChatReactions reactions_limit:flags2.13?int stories:flags2.4?PeerStories wallpaper:flags2.7?WallPaper boosts_applied:flags2.8?int boosts_unrestrict:flags2.9?int emojiset:flags2.10?StickerSet = ChatFull; chatParticipant#c02d4007 user_id:long inviter_id:long date:int = ChatParticipant; chatParticipantCreator#e46bcee4 user_id:long = ChatParticipant; @@ -228,7 +228,7 @@ inputReportReasonFake#f5ddd6e7 = ReportReason; inputReportReasonIllegalDrugs#a8eb2be = ReportReason; inputReportReasonPersonalDetails#9ec7863d = ReportReason; -userFull#cc997720 flags:# blocked:flags.0?true phone_calls_available:flags.4?true phone_calls_private:flags.5?true can_pin_message:flags.7?true has_scheduled:flags.12?true video_calls_available:flags.13?true voice_messages_forbidden:flags.20?true translations_disabled:flags.23?true stories_pinned_available:flags.26?true blocked_my_stories_from:flags.27?true wallpaper_overridden:flags.28?true contact_require_premium:flags.29?true read_dates_private:flags.30?true flags2:# id:long about:flags.1?string settings:PeerSettings personal_photo:flags.21?Photo profile_photo:flags.2?Photo fallback_photo:flags.22?Photo notify_settings:PeerNotifySettings bot_info:flags.3?BotInfo pinned_msg_id:flags.6?int common_chats_count:int folder_id:flags.11?int ttl_period:flags.14?int theme_emoticon:flags.15?string private_forward_name:flags.16?string bot_group_admin_rights:flags.17?ChatAdminRights bot_broadcast_admin_rights:flags.18?ChatAdminRights premium_gifts:flags.19?Vector wallpaper:flags.24?WallPaper stories:flags.25?PeerStories business_work_hours:flags2.0?BusinessWorkHours business_location:flags2.1?BusinessLocation business_greeting_message:flags2.2?BusinessGreetingMessage business_away_message:flags2.3?BusinessAwayMessage business_intro:flags2.4?BusinessIntro birthday:flags2.5?Birthday personal_channel_id:flags2.6?long personal_channel_message:flags2.6?int = UserFull; +userFull#cc997720 flags:# blocked:flags.0?true phone_calls_available:flags.4?true phone_calls_private:flags.5?true can_pin_message:flags.7?true has_scheduled:flags.12?true video_calls_available:flags.13?true voice_messages_forbidden:flags.20?true translations_disabled:flags.23?true stories_pinned_available:flags.26?true blocked_my_stories_from:flags.27?true wallpaper_overridden:flags.28?true contact_require_premium:flags.29?true read_dates_private:flags.30?true flags2:# sponsored_enabled:flags2.7?true id:long about:flags.1?string settings:PeerSettings personal_photo:flags.21?Photo profile_photo:flags.2?Photo fallback_photo:flags.22?Photo notify_settings:PeerNotifySettings bot_info:flags.3?BotInfo pinned_msg_id:flags.6?int common_chats_count:int folder_id:flags.11?int ttl_period:flags.14?int theme_emoticon:flags.15?string private_forward_name:flags.16?string bot_group_admin_rights:flags.17?ChatAdminRights bot_broadcast_admin_rights:flags.18?ChatAdminRights premium_gifts:flags.19?Vector wallpaper:flags.24?WallPaper stories:flags.25?PeerStories business_work_hours:flags2.0?BusinessWorkHours business_location:flags2.1?BusinessLocation business_greeting_message:flags2.2?BusinessGreetingMessage business_away_message:flags2.3?BusinessAwayMessage business_intro:flags2.4?BusinessIntro birthday:flags2.5?Birthday personal_channel_id:flags2.6?long personal_channel_message:flags2.6?int = UserFull; contact#145ade0b user_id:long mutual:Bool = Contact; @@ -412,6 +412,7 @@ updateBotBusinessConnect#8ae5c97a connection:BotBusinessConnection qts:int = Upd updateBotNewBusinessMessage#9ddb347c flags:# connection_id:string message:Message reply_to_message:flags.0?Message qts:int = Update; updateBotEditBusinessMessage#7df587c flags:# connection_id:string message:Message reply_to_message:flags.0?Message qts:int = Update; updateBotDeleteBusinessMessage#a02a982e connection_id:string peer:Peer messages:Vector qts:int = Update; +updateNewStoryReaction#1824e40b story_id:int peer:Peer reaction:Reaction = Update; updates.state#a56c2a3e pts:int qts:int date:int seq:int unread_count:int = updates.State; @@ -1171,7 +1172,7 @@ inputWallPaperNoFile#967a462e id:long = InputWallPaper; account.wallPapersNotModified#1c199183 = account.WallPapers; account.wallPapers#cdc3858c hash:long wallpapers:Vector = account.WallPapers; -codeSettings#ad253d78 flags:# allow_flashcall:flags.0?true current_number:flags.1?true allow_app_hash:flags.4?true allow_missed_call:flags.5?true allow_firebase:flags.7?true logout_tokens:flags.6?Vector token:flags.8?string app_sandbox:flags.8?Bool = CodeSettings; +codeSettings#ad253d78 flags:# allow_flashcall:flags.0?true current_number:flags.1?true allow_app_hash:flags.4?true allow_missed_call:flags.5?true allow_firebase:flags.7?true unknown_number:flags.9?true logout_tokens:flags.6?Vector token:flags.8?string app_sandbox:flags.8?Bool = CodeSettings; wallPaperSettings#372efcd0 flags:# blur:flags.1?true motion:flags.2?true background_color:flags.0?int second_background_color:flags.4?int third_background_color:flags.5?int fourth_background_color:flags.6?int intensity:flags.3?int rotation:flags.4?int emoticon:flags.7?string = WallPaperSettings; @@ -1236,6 +1237,7 @@ themeSettings#fa58b6d4 flags:# message_colors_animated:flags.2?true base_theme:B webPageAttributeTheme#54b56617 flags:# documents:flags.0?Vector settings:flags.1?ThemeSettings = WebPageAttribute; webPageAttributeStory#2e94c3e7 flags:# peer:Peer id:int story:flags.0?StoryItem = WebPageAttribute; +webPageAttributeStickerSet#50cc03d3 flags:# emojis:flags.0?true text_color:flags.1?true stickers:Vector = WebPageAttribute; messages.votesList#4899484e flags:# count:int votes:Vector chats:Vector users:Vector next_offset:flags.0?string = messages.VotesList; @@ -1361,7 +1363,7 @@ account.resetPasswordFailedWait#e3779861 retry_date:int = account.ResetPasswordR account.resetPasswordRequestedWait#e9effc7d until_date:int = account.ResetPasswordResult; account.resetPasswordOk#e926d63e = account.ResetPasswordResult; -sponsoredMessage#ed5383f7 flags:# recommended:flags.5?true show_peer_photo:flags.6?true can_report:flags.12?true random_id:bytes from_id:flags.3?Peer chat_invite:flags.4?ChatInvite chat_invite_hash:flags.4?string channel_post:flags.2?int start_param:flags.0?string webpage:flags.9?SponsoredWebPage app:flags.10?BotApp message:string entities:flags.1?Vector button_text:flags.11?string sponsor_info:flags.7?string additional_info:flags.8?string = SponsoredMessage; +sponsoredMessage#bdedf566 flags:# recommended:flags.5?true can_report:flags.12?true random_id:bytes url:string title:string message:string entities:flags.1?Vector photo:flags.6?Photo color:flags.13?PeerColor button_text:string sponsor_info:flags.7?string additional_info:flags.8?string = SponsoredMessage; messages.sponsoredMessages#c9ee1d87 flags:# posts_between:flags.0?int messages:Vector chats:Vector users:Vector = messages.SponsoredMessages; messages.sponsoredMessagesEmpty#1839490f = messages.SponsoredMessages; @@ -1565,8 +1567,6 @@ messagePeerVote#b6cc2d5c peer:Peer option:bytes date:int = MessagePeerVote; messagePeerVoteInputOption#74cda504 peer:Peer date:int = MessagePeerVote; messagePeerVoteMultiple#4628f6e6 peer:Peer options:Vector date:int = MessagePeerVote; -sponsoredWebPage#3db8ec63 flags:# url:string site_name:string photo:flags.0?Photo = SponsoredWebPage; - storyViews#8d595cd6 flags:# has_viewers:flags.1?true views_count:int forwards_count:flags.2?int reactions:flags.3?Vector reactions_count:flags.4?int recent_viewers:flags.0?Vector = StoryViews; storyItemDeleted#51e6ee4f id:int = StoryItem; @@ -1576,7 +1576,7 @@ storyItem#79b26a24 flags:# pinned:flags.5?true public:flags.7?true close_friends stories.allStoriesNotModified#1158fe3e flags:# state:string stealth_mode:StoriesStealthMode = stories.AllStories; stories.allStories#6efc5e81 flags:# has_more:flags.0?true count:int state:string peer_stories:Vector chats:Vector users:Vector stealth_mode:StoriesStealthMode = stories.AllStories; -stories.stories#5dd8c3c8 count:int stories:Vector chats:Vector users:Vector = stories.Stories; +stories.stories#63c3dd0a flags:# count:int stories:Vector pinned_to_top:flags.0?Vector chats:Vector users:Vector = stories.Stories; storyView#b0bdeac5 flags:# blocked:flags.0?true blocked_my_stories_from:flags.1?true user_id:long date:int reaction:flags.2?Reaction = StoryView; storyViewPublicForward#9083670b flags:# blocked:flags.0?true blocked_my_stories_from:flags.1?true message:Message = StoryView; @@ -1770,6 +1770,11 @@ broadcastRevenueTransactionRefund#42d30d2e amount:long date:int provider:string stats.broadcastRevenueTransactions#87158466 count:int transactions:Vector = stats.BroadcastRevenueTransactions; +reactionNotificationsFromContacts#bac3a61a = ReactionNotificationsFrom; +reactionNotificationsFromAll#4b9e22a0 = ReactionNotificationsFrom; + +reactionsNotifySettings#56e34970 flags:# messages_notify_from:flags.0?ReactionNotificationsFrom stories_notify_from:flags.1?ReactionNotificationsFrom sound:NotificationSound show_previews:Bool = ReactionsNotifySettings; + ---functions--- invokeAfterMsg#cb9f372d {X:Type} msg_id:long query:!X = X; @@ -1913,6 +1918,9 @@ account.deleteBusinessChatLink#60073674 slug:string = Bool; account.getBusinessChatLinks#6f70dde1 = account.BusinessChatLinks; account.resolveBusinessChatLink#5492e5ee slug:string = account.ResolvedBusinessChatLinks; account.updatePersonalChannel#d94305e0 channel:InputChannel = Bool; +account.toggleSponsoredMessages#b9d9a38d enabled:Bool = Bool; +account.getReactionsNotifySettings#6dd654c = ReactionsNotifySettings; +account.setReactionsNotifySettings#316ce548 settings:ReactionsNotifySettings = ReactionsNotifySettings; users.getUsers#d91a548 id:Vector = Vector; users.getFullUser#b60f5918 id:InputUser = users.UserFull; @@ -1993,7 +2001,7 @@ messages.startBot#e6df7378 bot:InputUser peer:InputPeer random_id:long start_par messages.getMessagesViews#5784d3e1 peer:InputPeer id:Vector increment:Bool = messages.MessageViews; messages.editChatAdmin#a85bd1c2 chat_id:long user_id:InputUser is_admin:Bool = Bool; messages.migrateChat#a2875319 chat_id:long = Updates; -messages.searchGlobal#4bc6589a flags:# folder_id:flags.0?int q:string filter:MessagesFilter min_date:int max_date:int offset_rate:int offset_peer:InputPeer offset_id:int limit:int = messages.Messages; +messages.searchGlobal#4bc6589a flags:# broadcasts_only:flags.1?true folder_id:flags.0?int q:string filter:MessagesFilter min_date:int max_date:int offset_rate:int offset_peer:InputPeer offset_id:int limit:int = messages.Messages; messages.reorderStickerSets#78337739 flags:# masks:flags.0?true emojis:flags.1?true order:Vector = Bool; messages.getDocumentByHash#b1f2061f sha256:bytes size:long mime_type:string = Document; messages.getSavedGifs#5cf09635 hash:long = messages.SavedGifs; @@ -2097,7 +2105,7 @@ messages.saveDefaultSendAs#ccfddf96 peer:InputPeer send_as:InputPeer = Bool; messages.sendReaction#d30d78d4 flags:# big:flags.1?true add_to_recent:flags.2?true peer:InputPeer msg_id:int reaction:flags.0?Vector = Updates; messages.getMessagesReactions#8bba90e6 peer:InputPeer id:Vector = Updates; messages.getMessageReactionsList#461b3f48 flags:# peer:InputPeer id:int reaction:flags.0?Reaction offset:flags.1?string limit:int = messages.MessageReactionsList; -messages.setChatAvailableReactions#feb16771 peer:InputPeer available_reactions:ChatReactions = Updates; +messages.setChatAvailableReactions#5a150bd4 flags:# peer:InputPeer available_reactions:ChatReactions reactions_limit:flags.0?int = Updates; messages.getAvailableReactions#18dea0ac hash:int = messages.AvailableReactions; messages.setDefaultReaction#4f47a016 reaction:Reaction = Bool; messages.translateText#63183030 flags:# peer:flags.0?InputPeer id:flags.0?Vector text:flags.1?Vector to_lang:string = messages.TranslatedText; @@ -2258,7 +2266,7 @@ channels.toggleParticipantsHidden#6a6e7854 channel:InputChannel enabled:Bool = U channels.clickSponsoredMessage#18afbc93 channel:InputChannel random_id:bytes = Bool; channels.updateColor#d8aa3671 flags:# for_profile:flags.1?true channel:InputChannel color:flags.2?int background_emoji_id:flags.0?long = Updates; channels.toggleViewForumAsMessages#9738bb15 channel:InputChannel enabled:Bool = Updates; -channels.getChannelRecommendations#83b70d97 channel:InputChannel = messages.Chats; +channels.getChannelRecommendations#25a71742 flags:# channel:flags.0?InputChannel = messages.Chats; channels.updateEmojiStatus#f0d3e6a8 channel:InputChannel emoji_status:EmojiStatus = Updates; channels.setBoostsToUnblockRestrictions#ad399cee channel:InputChannel boosts:int = Updates; channels.setEmojiStickers#3cd930b7 channel:InputChannel stickerset:InputStickerSet = Bool; @@ -2398,6 +2406,7 @@ stories.getPeerMaxIDs#535983c3 id:Vector = Vector; stories.getChatsToSend#a56a8b60 = messages.Chats; stories.togglePeerStoriesHidden#bd0415c4 peer:InputPeer hidden:Bool = Bool; stories.getStoryReactionsList#b9b2881f flags:# forwards_first:flags.2?true peer:InputPeer id:int reaction:flags.0?Reaction offset:flags.1?string limit:int = stories.StoryReactionsList; +stories.togglePinnedToTop#b297e9b peer:InputPeer id:Vector = Bool; premium.getBoostsList#60f67660 flags:# gifts:flags.0?true peer:InputPeer offset:string limit:int = premium.BoostsList; premium.getMyBoosts#be77b4a = premium.MyBoosts; diff --git a/src/styles/icons.scss b/src/styles/icons.scss index f8f866e89..e809895bf 100644 --- a/src/styles/icons.scss +++ b/src/styles/icons.scss @@ -158,110 +158,112 @@ $icons-map: ( "my-notes": "\f17f", "new-chat-filled": "\f180", "next": "\f181", - "noise-suppression": "\f182", - "non-contacts": "\f183", - "one-filled": "\f184", - "open-in-new-tab": "\f185", - "password-off": "\f186", - "pause": "\f187", - "permissions": "\f188", - "phone-discard-outline": "\f189", - "phone-discard": "\f18a", - "phone": "\f18b", - "photo": "\f18c", - "pin-badge": "\f18d", - "pin-list": "\f18e", - "pin": "\f18f", - "pinned-chat": "\f190", - "pinned-message": "\f191", - "pip": "\f192", - "play-story": "\f193", - "play": "\f194", - "poll": "\f195", - "premium": "\f196", - "previous": "\f197", - "privacy-policy": "\f198", - "quote-text": "\f199", - "quote": "\f19a", - "readchats": "\f19b", - "recent": "\f19c", - "reload": "\f19d", - "remove": "\f19e", - "reopen-topic": "\f19f", - "replace": "\f1a0", - "replies": "\f1a1", - "reply-filled": "\f1a2", - "reply": "\f1a3", - "revote": "\f1a4", - "save-story": "\f1a5", - "saved-messages": "\f1a6", - "schedule": "\f1a7", - "search": "\f1a8", - "select": "\f1a9", - "send-outline": "\f1aa", - "send": "\f1ab", - "settings-filled": "\f1ac", - "settings": "\f1ad", - "share-filled": "\f1ae", - "share-screen-outlined": "\f1af", - "share-screen-stop": "\f1b0", - "share-screen": "\f1b1", - "sidebar": "\f1b2", - "skip-next": "\f1b3", - "skip-previous": "\f1b4", - "smallscreen": "\f1b5", - "smile": "\f1b6", - "sort": "\f1b7", - "speaker-muted-story": "\f1b8", - "speaker-outline": "\f1b9", - "speaker-story": "\f1ba", - "speaker": "\f1bb", - "spoiler-disable": "\f1bc", - "spoiler": "\f1bd", - "sport": "\f1be", - "stats": "\f1bf", - "stealth-future": "\f1c0", - "stealth-past": "\f1c1", - "stickers": "\f1c2", - "stop-raising-hand": "\f1c3", - "stop": "\f1c4", - "story-caption": "\f1c5", - "story-expired": "\f1c6", - "story-priority": "\f1c7", - "story-reply": "\f1c8", - "strikethrough": "\f1c9", - "tag-add": "\f1ca", - "tag-crossed": "\f1cb", - "tag-filter": "\f1cc", - "tag-name": "\f1cd", - "tag": "\f1ce", - "timer": "\f1cf", - "transcribe": "\f1d0", - "truck": "\f1d1", - "unarchive": "\f1d2", - "underlined": "\f1d3", - "unlock-badge": "\f1d4", - "unlock": "\f1d5", - "unmute": "\f1d6", - "unpin": "\f1d7", - "unread": "\f1d8", - "up": "\f1d9", - "user-filled": "\f1da", - "user-online": "\f1db", - "user": "\f1dc", - "video-outlined": "\f1dd", - "video-stop": "\f1de", - "video": "\f1df", - "view-once": "\f1e0", - "voice-chat": "\f1e1", - "volume-1": "\f1e2", - "volume-2": "\f1e3", - "volume-3": "\f1e4", - "web": "\f1e5", - "webapp": "\f1e6", - "word-wrap": "\f1e7", - "zoom-in": "\f1e8", - "zoom-out": "\f1e9", + "nochannel": "\f182", + "noise-suppression": "\f183", + "non-contacts": "\f184", + "one-filled": "\f185", + "open-in-new-tab": "\f186", + "password-off": "\f187", + "pause": "\f188", + "permissions": "\f189", + "phone-discard-outline": "\f18a", + "phone-discard": "\f18b", + "phone": "\f18c", + "photo": "\f18d", + "pin-badge": "\f18e", + "pin-list": "\f18f", + "pin": "\f190", + "pinned-chat": "\f191", + "pinned-message": "\f192", + "pip": "\f193", + "play-story": "\f194", + "play": "\f195", + "poll": "\f196", + "premium": "\f197", + "previous": "\f198", + "privacy-policy": "\f199", + "quote-text": "\f19a", + "quote": "\f19b", + "readchats": "\f19c", + "recent": "\f19d", + "reload": "\f19e", + "remove": "\f19f", + "reopen-topic": "\f1a0", + "replace": "\f1a1", + "replies": "\f1a2", + "reply-filled": "\f1a3", + "reply": "\f1a4", + "revenue-split": "\f1a5", + "revote": "\f1a6", + "save-story": "\f1a7", + "saved-messages": "\f1a8", + "schedule": "\f1a9", + "search": "\f1aa", + "select": "\f1ab", + "send-outline": "\f1ac", + "send": "\f1ad", + "settings-filled": "\f1ae", + "settings": "\f1af", + "share-filled": "\f1b0", + "share-screen-outlined": "\f1b1", + "share-screen-stop": "\f1b2", + "share-screen": "\f1b3", + "sidebar": "\f1b4", + "skip-next": "\f1b5", + "skip-previous": "\f1b6", + "smallscreen": "\f1b7", + "smile": "\f1b8", + "sort": "\f1b9", + "speaker-muted-story": "\f1ba", + "speaker-outline": "\f1bb", + "speaker-story": "\f1bc", + "speaker": "\f1bd", + "spoiler-disable": "\f1be", + "spoiler": "\f1bf", + "sport": "\f1c0", + "stats": "\f1c1", + "stealth-future": "\f1c2", + "stealth-past": "\f1c3", + "stickers": "\f1c4", + "stop-raising-hand": "\f1c5", + "stop": "\f1c6", + "story-caption": "\f1c7", + "story-expired": "\f1c8", + "story-priority": "\f1c9", + "story-reply": "\f1ca", + "strikethrough": "\f1cb", + "tag-add": "\f1cc", + "tag-crossed": "\f1cd", + "tag-filter": "\f1ce", + "tag-name": "\f1cf", + "tag": "\f1d0", + "timer": "\f1d1", + "transcribe": "\f1d2", + "truck": "\f1d3", + "unarchive": "\f1d4", + "underlined": "\f1d5", + "unlock-badge": "\f1d6", + "unlock": "\f1d7", + "unmute": "\f1d8", + "unpin": "\f1d9", + "unread": "\f1da", + "up": "\f1db", + "user-filled": "\f1dc", + "user-online": "\f1dd", + "user": "\f1de", + "video-outlined": "\f1df", + "video-stop": "\f1e0", + "video": "\f1e1", + "view-once": "\f1e2", + "voice-chat": "\f1e3", + "volume-1": "\f1e4", + "volume-2": "\f1e5", + "volume-3": "\f1e6", + "web": "\f1e7", + "webapp": "\f1e8", + "word-wrap": "\f1e9", + "zoom-in": "\f1ea", + "zoom-out": "\f1eb", ); .icon-active-sessions::before { @@ -651,6 +653,9 @@ $icons-map: ( .icon-next::before { content: map.get($icons-map, "next"); } +.icon-nochannel::before { + content: map.get($icons-map, "nochannel"); +} .icon-noise-suppression::before { content: map.get($icons-map, "noise-suppression"); } @@ -753,6 +758,9 @@ $icons-map: ( .icon-reply::before { content: map.get($icons-map, "reply"); } +.icon-revenue-split::before { + content: map.get($icons-map, "revenue-split"); +} .icon-revote::before { content: map.get($icons-map, "revote"); } diff --git a/src/styles/icons.woff b/src/styles/icons.woff index c334a07b9675cc7bf3ef096add10174b319a1737..f944e4d083893bba9be67e500e9f3dfec8c40c8f 100644 GIT binary patch delta 28195 zcmV)SK(fE+<^lBS0Tg#nMn(Vu00000bo2lV00000-Vl)#KYyiTZDDW#00D>q00c1r z01iAVM)|5|Y%lL!H7f0|JT$dzVvXJ7=h*bycs`{WcH_h#8VEBoI2x zMOf&F7?Gjfu;~4m#Eae!g#8nJO+fp>sK0+hYnay1c_4a?5xO=If4XBhv57<6(EH*O zK>`wzh{PlzDalAq3R04a)TALT=}1ooGLnhRWFeBQWFtE{$Vo18lZU*a=jW#Y1t~;f zicpkd6sH6wDMe|@P?mC(rveqJL}jW_m1+=(3W3?wU(jQHq<(XTGvqP8ESn)ZD6Pk4YiS>Ha65IhT7Cnn;B|zLv3NGEe*Amp|&>E zHip{PP}>=5dqeGDs2vTplc9Dt)GmhF)lj<`YIj5JVW>R~wU?pxHq<_b+SgF~8ESt+ z9bl*fe+_kzp$<0GA%;5CP=^`na6=tos3Q$^l%b9`)G>xS)=Ucw)V5k!fb&{b@ zHq)=<|O>Uu-nV5l1ne|3|gZZ^~{hPu^Iw;AeoL)~GhI}LT0 zq3$-+J%+m1Q1=TyFoVW=k!^^~EWHq4BM_Rtg4?lE|}#}hMVY66q z)tfUnxY)oui|3e~efT@4ptCr1459X;aEw!JHs6$0w#L?xWli^?_0ZH|9~*lxos5pi zKAah0YZIxv0eWmO9Ge1@f9VLiVu)?UP8dCV)Nn}TUiKolarAy76sZX%MO_NY=lkE2 zv|1ajR`O!ki%MQZLa!8g-Mfgwa@V+L)P~Xq&>Z`qK z$z#5KFHXICD|I(a+QY35)XzZ{N-VVSuO46LZx<}O)-YtT~NJiUQ`Rs&l%=)t@!mV9bfbFt(<1wVN|{`URzoxePO z2s@S~^z#C;YIUr2f9nzJP1dtOS0-79v?+|KN?_^_dI~ycj3atTj>tq!_H*c{!EibN zYH-EkfIDF`og9&3h0H0)4jHIkNRqaxqFNf7pJdWK9dMX@+-^V7w)I|c+8yP$kK!SlXf3$HG$sCHpSqgo2Fh8k!gRv&%Quo;S011uhzjq}4N~OQvOA`3BTI;RW z1HvZUwjG-j>2W^{JifvuqpVaWvDKv)iEm(=@^vTWXcyBb6m} zUz{X$>sISU>mOQQuzuV69hhNIbCu=ONt?hFN)x4*o9c&1J&MIP80$_M<&!B;RVV;6 ztAi)@I|Sz!bPZ4k0)=|eKQO&u+W}^%pvOXBQdwR+v<=*FT0C?zRT6slh(P)21Sh2$ zbr{}qe`v^dn&8Y1$@c89jirZ!36eTP$NICKX@BqEhN%*Q3+_-M6t|H!rSZAj&czAt zI$R1#m5^KrC-s@+sbtJAdF7ZxmY8XvGSEs?TUTj1#Pr@la;Dl5L<%Z89}GxT3}f+oV5$836y&LF|+_adU9B+&N0!nHMoW!j;*CbwY}V8Knt>7F_m zoguq>L$y2JOH~Tn*FWPWDs_l%nw`qTW6xg(a_!=#^^6Z#MM3)l>C^Yx;?6{fPz(tf z>J}w;3i|^FxvjW%(~CZeO@1K?e;ST=7YW^G@j=hJ;mC;zDLLeMVdpSp@}$GJak=nZ z!CIkszpbD0|6iZvSUS%_vO}?Wn?y*&)ZRFq?y9|XcQ2nNrvOLq?VcjvMxUtVK7pzC zo%D&yWk|)g&9}Mk6WjC&b##aD`8>|7fpr5=?(6ix2*9me?f|8y^dZTTf7u+L_T{2W zu5RTI&l~wXgUQ_jZo&r4*D6005mMc$Ie4%0F&kyIa_*m4($fC(VIPN zah!|?R2NfsmmFs0BwO9N5j0i(|i+?kqzLUKSUeyTv8 zrAQyD6^f(bRBCH1@ag|rkC4~#2416YQ#0VOs1i>#EFNUiqXYJ1m+{%MeXxm{a;J0!XNEt9*&|vHLtUm-vcGa4I3}HJ_rba#WGYiCZiiA6a0P< znEuc$3vrhl1n!-GLX=%VGU7avi1R}BDS>{3>0G98i#Uzolo)zz{X61XBkLy3IeH-q zl0b2%doV&MAL_+?NM?KbY`&MlxIqiHX>PzZu*%ua<#?qAunX`t1TGlQi&v7Br?ibQ-0!>R{77u$`z8wyfk%;>e`ukwqr`)f*W$(OKcI!S! zwcHM*E8`x=t{2@H4gwI;ezj`~APYBlbRVlaK6i-{(yUA6Z|8 z`O$CUNZN%p*cABN`Wvzad}L2^scn?nfG7jyFGw?>?IDa5oWfI8~>= zWz!(5+V|Q#38SU`5zryx0hj2)qPlna;C~*4i6gy#_xSa=*z+3kp-|#hU{~_F+0KlA zewFmC8uE7in{ufZ8CGu4|A#^XNrBn_BoO)&%Lkve#UoM?{xRV#_GU6iAD-*$-Zfmu zV2A1a>GLMSccv~6&J70VUWJ>CFtLV6lH5hSMpo!{%3*u-O{~m!~;5JJwv* zS%cqyt-=bjrt>DK{=9KGltcXeg6)}0u%Jx4f42#Z^Vm~N%59i35y)ojOcEx1RSNzT z%IgtKE1>>R1mI%`UB3OX_1BoD`=scF2jhCh6CVS7C?63v@#njiCFlHl2hibp>o%b7 zuZNZ1rld9RbNAj&=2Bm144F3uHaexMV?B(7D+^BvrlgB$nv-v+13LAT_6 z+>c2I{zxStE7yO<(wW~d59!XHdSU-X{L&B6kK{oG@$%QdZCO*J-)JFB zW7H`C+lIRXZAAcc>-qhWZyQb*WZubdCV z`;?vt1ognE|9!g+D9CjOsM8s^u92=msGjY7K(g5Hu`rH9N_u|GB)LV+>2+d#&5Epw z)^l7b5CQZZ!`~}k#7C2e7)uIk{f&@IXq%mXGLzjHCLG9|xFT!8#jdo`Vmh8`-AI36 z90H&{6QCi3KLe8=85Mtx(mRxMfJ@@QQFkz#Fp|f?Z#jV4qj zij(}rVmHfIR<>7Ga<5#@%H=OzvhtI&88-nklj|8u0X&m7 z8a#i8K8CiLBhFt$b>xR;Yrx24HS2^y*-KP?2~?@^OxT!fla{2jL1*0Qj1O_MMQzt1 z15OxaEv-2_*~jkbla-=0Y+fk} z!{(mlf@WXvQ1q>tJ|F8DKs`6D8<%Zp+jKlVR_!af>ha^zVDXdBE^2-w09BTuIqyLx z1WWPoa;GQ0$!4NWNARcRr74;_7MeCZLTf=j ztWq1bTj?rlsQP}n_ z7#|8n-|BMZGXI21?szhJa_eMr5;!{guxz`!FQ6Q(;elXpb+y}qcS4biPgb71A4<+? zQw7jOds*XyA_`QCh9pA@48&@bUGAOg^-kS#s+VUR37sH#^S8wd1d?w&XZV&wm zOlmpf)e6va44i-ZjCC(^!ouE=6zF+yFq}EuY4Kz@p5R%Shxxq78B$zT#dkWtG`?AS zje8oN^{L=eVy|B`fYxB4L_j~{6ALOLNQFB_)#vaVZ1E1b1nU5CDmUxl9l|d7 z(n&z6i8ZipM$D-_c#@75xwV;UnXc_`D=>raQLWS|1ri^R}sFgt|EL}?4v+_!O5HpwoB5|&Epv>2vMKd_NBsUEQ=0A*Sj+}oUdA(NrAqhW2uAW-&=HgS=oL#ko zLu~>zRY)C|=GsmC*kqeg-*<@e;|1*nvTDQ4k1y#f6YC^kgr{ND(j=Wv{nR++%D%3> zS<%`XTg!+e)PW&I9HQ9)eRi(n#I6_7RSvqt!Hd{1+f(s|CjG9eo~zpKf)}`U^#eWK zLTG=kH})P>aagk>H`bI6h+phRcJ2K96s0i8(?Hp;Y|PnMQdP@OT>6QN1$*l;c=Xfs z8qX_EIn^*m-6TAkBQ81azyI!U(|ufj{*nfv*C$tr0}?=fen z{PL@hc?NyYJ-EHdxp9G{1vXM353d_tw!wV|CQv{-R~doHxOWt?#?ebC3Vjx3rHg++ z6gQ0&bOch+5lTT@@(4y6Cf*kTynpWodH^{5ENsuBx7gB8!NNPEhlrvVPJ zRHF$JZkz;t-IAX6pXuWg(W|^eaJL|JsEoi$9)a+#UDgYgAMDCEGgpLx%|yHcV7^%v z)l!tCZQ_Qu4OGCkLzi^YByik%sgr+j&*QXJ3EgfkZEkxBDve~;@q8d-W!tYP0TeqZ zrKAoB$}M|RW-N_Z$kX$;)|)P13I-qQwi>ss^b!w1I#3VyC>ozSX~VkWa2H^k6Vrnd zLu>>1p7VvzTS!8yY^5OaTNO>g<*+Xcw~>7{9Y!=AP5)D()UPnP22ASTd;zy^P-7vTDS3pX%Dj4&S8WOk#YS5VN@SoM9{$M=ZAjDmkzy7AT-l!e)ZDtq0F8|c=12=n?7XY^(Pg1`SNxp{g$ zxjDa{-2A=p(D88@d2+Sb{0~4xu0V^#0XHJ@n7fD95}S<-<`ZdktRw3U*4wP-p-(Vq zpiL1P@0cmQZ4~_oJ+=w*G#a7JaySM01!uIi2w@3Y8!&=Q&;2&iJfMGnz*~BT9pK^a z4$-&6y--XCj!mZfxQwKg`9IF0svH@i6OPm13>o?oAT3UZ80jz3paun8@UfmAr zV!vL^;!-8>MywvQPV`qm9zM%3rmh{hb`&(qD?ydJuMMjKwKL*5nR}}~AEw@kxJDYh zz=Xc_=h~Kb&Uyf9yEOh7b^^l+)NnRw)F$Z=yg zN9yP3CprK^mTbb%4>)GK-_S;}6tlEsT)S)rqf&~~+DLzo7JSm$A`&PqY-FzcXL=Ay zjUa-9#cpR7pVXN-lR}k>c$p#6x-}RD!z-b4`v#i~$Aig{cJRzP6d9EygL4VGwgvL8 zyM&-hk>nh#5Jx@Kqk_tSbsxf&MtfhS1;l0%#Q> z^3tU`oI!u;g1WCf)k-QL>lsQnSOG2Gz|`ntl!NL}U7!PXjNk%X1p5DDg7zL#IOtGE zrKk{h-35>xs+*hxd?WB?1AGm8zp$ zl?E{YF02mE56-Y;Ggffj=J{?W%L72D4$L$7TtYVOGN0STeyz3#{;>dt>UEzW5^4vf z*c)Nhd4Mcuyfh;bthfuvOI6a+aTLHb4~Bm;ysrD37Qj6p56zV=Is@_P)$&V&LGMOi zhev5_Rx9lyS~4dnkawj+o7G3780H!^14l*o zDs$I@o?vWtYMrodFdhn8>(wC!59}a4nYrs~)#nt=4H6enUf36q%D%^UnuOj0T|+@1sfil}?&lmJ2JWq%)1>shh?YNxxS3Q`3yQoO9iNh)hHWiye_DGwy&K9CyGbt~ zc)-7TJrhy|IXMILfUBDr#q$W}%|y$9Y2F`d-Q}|IWR%k*z&xYlVx!R%fTWG)6kH!I zLq)aqB-G&yW-WbGuo301L;dqUjU0bAV#3Kz^bm!Wp&PYm%#}?~QtG_%3SrrkWh@u@ zOTu#bN!N8`tPgxrq3Zp@;as#@3aH!rf!GWthdN5UkhVY1LH=SVwP7Ab+{!KUAHibg znYS3(77(C{|C>TlY|VTgmG#G#2b{AH9OI02r->#hGz|UGLfe4)s>QyR5et7Qa%cob zBNydMrS@U<*uqEs^awXEp!(zmIrA*JtiOpqb*M}^Unn21>4TR|*sJ+~z@*@FLF(gM z&}~ksljhoN9Rke-SsA0ck$I;&R4&!a3SF{CS{E{!>I00EqyvzcFuDu<0|8g=X?Od{ z_%f?`q9mlk6!Zf8DJ$ z(1L9I;$H!*Ro0#ww=KNPmTU~iQMmD$%8CH>1$3Xu@O>kp3N^sq+=ov4Z?)^v2-nz9 z{p!AUB{YEjv${*ya9l1aF~BaB`^z95o^c7k*YIYI=JgZhn(q1~KgB=tna&) zwlqPSisD^>k;{UhaWHLNW^-0a+nzDCNijf)(=QF*XEs~>b$*n+yqf8Z#wJrC%K zselSA_0@W@9s$xqFHWuV*1N3dtY1K_&lb88qaQv7t|Mtu=unK54Annrq1;36elXOL z2Qc~jli@@&l|J$&2&MZ{e_jW6ZYwVhV2LmqM?V+Euxz}yx}nF26MHs$fVmMYE!&Nq zUlsv|p^K1kaSnULJ}Y^E>&5i}*-8KJ2ZB9CSdAjfavC7zv|Z(beAeQ`ql$Wjw=jr4 zX8;%^tFeC`*>NmG$#am%U<12xY)9c*z~}=}sT4gxS+I7Z#3<#Ze}LF^3YE4&bT2&u z54LX;JjDv7T-;{E2@whxHhj9S(oNFIW4I_G)E6i~h$b zCmla?2JJL*d?$1(LHt9ddZ!+B zcY2nk3QVlDE`0!X#3;3=uB%bMqRt0XRHdhjz>Gl-BnO#gI#ZFED==e`NnGQZ7v{MJ zK(^RywO;Fn$s`F~uEYm~y0B759huu30!MG>i1snlv~ zwc3}ZuaqyL?Pp91jZZn!fe+U+%pH5Grkx{`n(}g3la5NuVFF|fP!_8Y`;NH};Hb7* zudmjuIekNYN!>baodpVaKlPblj8c?!-IP@wuG(k7aRPI@?}~I z@KTnae^!AfIZtB6+wNvf);DVRw*n_{66bv0sBPBn^-2^-pA9(AwpZ>%I`%MnAw7(HcjDf?xObrUl3tR==NWV% z-Q-mAw+kU=vWfK->u&%N-CRTx6)7WTsUx6ge@1&4b~BpJqq%YMs@ZoD_l^v9I-2(1 zECH`&NSo`9PD@ln4>CO2cQ9W9v2#4zv{PNiCYUk-uSs6(+kF`6RUoiiKvg%nbmZEm zkkk=t#kmcAw7S9NtG4E{RhclWirS1d?dGdFph*yw8ST!*oSPydpP7%f0*3@7DJ9iP zS|v`ZutQkAb(-1yrdEBYIvQ0|>bpU=%v@fMOM&YX@>`Xras&@U4oj$2>8)+7!D?LF z807txm43VCmpO<4oJFXXEBm#%e+|~Lrlmir`7;XH$bDxuQGeBw-!CZvo0ADJLI!bs zxYc=UlTk1_f8<1Q1vY?RAJHQFBSPLV;|-Q|rN7`1_gq>xtck?AK^qeg9V(Qf+GXI6 zl{dH*f4l0}*J39R;(syEyL3L^sD|Mq4DMFU0pJa7s=7+n25EI8|7aZr@-m3BDF%T& z0kT5Han=rE2jgvnLNEJOE7Gxa2OwwPX1&_FsBInZw%%|3P$BUxyOdq&^S@+xoL-f+ zr+-yo+I(mD?G*kB!o`<#_=pY`c?rb4Dehd*fASs%sR26@S_EG)N8e+Pw#?CO-@M3I z($bUoGf$S%sx6+xr#~s|i>9mBmP6OB-VT;E0#|<)zDAg@2IHIWG!!Py)I80{P$!zo zXPIlvJTt*tXiC~9YM#QWkVSP~0=Na2KRL=uwJ77KJ0l=MHK}SK4o=m+nu1K&2EIX9 ze^-ljU4~MD!^sM)w$rQaQks_9boCS*eHGjMWtfjUEv^Efm#rN*cw@>ah&6dz%Ze)* zb&ell_X3*5SPp^~VsBrDo!rW56G~k3Fk)d>lj`#Bv7Dl(Ny%LK!;zBouds>&8 z_kRwg+pvnO9#FZufK~ipP!Cmtec4(&Lhi{~o=ljFX5dMS0|esgCeD8la1n2}IpF>utmLgzs>#*=f41$aP!m!zko-z#HHA^8XVw20;sOg5z_~_q}E`TyME<6hd+F z@o#i-&IdDS3wrls#FjPHtx4MRf7}~7!3G{ojhx@p`791hA`Y_@GH6w(4T6VSC8ND^ zP)YFsr%BY#u%t`nrp`?b)u!xUYVdF6P4j{-;(B+_A;7h!r)v5N^U`DXx` zCEJ@?@Z@YLMhnb1g~wNm5zie5HcB!10nOA}b}hva&VUcAS&L ztrfVbR7-nFW6&Q8vECarf0AChAEgm|=JE#mG;C^owU4rw7K^XpoOTl#n-nQfPff$} zbb1-}XQ47?3A+L)B&lIob;U;YxQd)O-_KSuQX>_&oCh5Tqg6L%1!ni)iOA^$dD*>K zM^;uR*4&qF#X14}_th}|x@y`jJJtR$I<8C=9%I8It_rKyCJOrwf5hLsuj7$g0Po;F zihk{M2feKRl@O6K8Mr91BcwiWOQoct&9xV%5OHU1rBbb}*2%?-Wi<<>lkfJp-lu>| z{)naM$qTXtyCsu?Ej=-G!VB;RtxV%ig~aXkN?aq=IK`~5=&*ZpER78TDCphVo?tC< z%q1`$x0rlag~`n1e_~SU+-Nhw(7%PlONXXLRL}yWQM2kel?z8nTL(|OXSF%zoD*rW zubG_Fwwh1wGjf2wjI9T>v&(B*u>44+m1+>koPf*>IZU6K8+gv|b14td+q0#EYg^pa z*mGtFtXPg!LI10CI!ycNXq@-QD#tL$^x;eU`ko7m2cQEO6{8nUe>t3yqVN?hO9amN&z$nSy z3SZkRt2}gL6+yvOr<|0Xw4D~Rlb}HGC?|7CA_qCYR60c7OCvGZ>(V#~K?19E){fR* zaLX=yqBLFDf8><)b)AQ^XQFt#y2#m5{%vs6+dCGU1~h2-NAqEx54Ul%f;nnP3w2yf@ulCd6a`@O zC_BY5qG;TNc}!p?n=!0f|Jo`62exL3=ZwEy5ks?lJ|e&8DQd&w`EIy>j|rQ2YyF$Yeo^N-_`q8jrrLQ1+OW%$yEim{r1bks z0JTDUMjwFOg)jUt^N<8U$J*j~1st`3w1H!$X`~-tg!RVJPDp`}VitzCW`Na7P@u-( zj_)p0^zWsN)c>BQCDwvwqI`y$PmoI|^OPFXLMdi49HDrU&Qj178Anwir-BT7FnN7< zy9=Kig4m8qksUuR>}>7CT88O=fHxa3CmWkJ^>W_r=0~`BeHd_RWZAZ6^d)bd+O-<6Nr6h4nvj49xMF02BR2Mhs9pXjaGxLCTHM`-sW?^lv!?3ThH^V5OwZ2x^ zmygN!>C(P3L`2IlFU?E>bJM_F27h_J_uzc*owH(dYztIY=Y75b?Z6cv2Y`#(CjKgu zO6RUD+;k^Xm19C)DlzSU-#{<4gK3W0c7ZAOlk9m3J;2-RAoc_4cea2SY4G3c?CE){Zv>%Z`pcT;(YNs=kzi z@PDBe$SA3eT{k;uRgW+|?81-hFM;FrtV6`A+LGEs>QlIEXC|gKHJmB5a|2=v8>y1p zbRJ>&OH|kn-<7s4cV+k<<-zFK!h4ybKU+1YL`YVxQDD1x#1*amg_9sUFae{JQ94V1 zyXYe;994czj9CoOp;n)e@oUP;oY)rpyP&1)yHK8-?KyaGgqttnjpkvV`Au7v(5D8b zvx*-h`b4}nd)jq>57qoi%1y3~23_1&Vi^x9E7sgUm4$c1LE!|RPUpKO$L0W|Zz=sS zB||FU>yJ1GaK&Rv2Sk$l2aLl>PKQ{3g#I90X>neGD+5$L6twM2)>q;8jLa00B5GNy zM1G62SE0-L&F75|`zK)Dyh=+fH=hS0hj}uKb%`$AVESMGTH!kwB5r z+Kk>M(;P7v5FNQQ(|2wYoxui{=Ii_Cf=)`BAmoZyaP!DpTyZOxm*P_HM?49CPCr@> zPc(+jwEoT&H*o&V$YpuyGg3BDqJ9N8kG$n)BtQ(_kK0bpvwE34%Dlcx8jYl``X_VD z{xjDVkdwr-9@G{TYoRHx=fCnED4)C$nY zK^Oqy09-*cm4qvsi$F4}UtS=8l?ok@W~nWhq!NVLNOFguzc7Hsitj2PcsU4*u?y#w zusxVDZKvd|r6rv-K8S^sfwK~>jBCxh^pj{u?k7RRX*r?ms5)IoLR$7$MYnLOH9lrG=*c1`RAwfKZ*cbRvje^P5LDcjjFTX! z1fLidX9s8B><64Zpln+`5XRObPO75yUN`C7FUM3~!{chB)GzWDNG z^x4JDXJ$ExUHf(}I6pXrP?0Kn3LRwyXSH^68JdfmFNWSFEP2U)3u_=xk{dARC;Y#0 zgaz+l!qoHYUk5sL(nYJ7=?Y4#Vxl`Tq;|0R8Eu(VHDLfZgAC z`Z1xt(yukr=n=GkL*NYc|D%1_k^%Xkq<6F=%KC4Y5+Hnmx+F$Awqav4c zWjXFy*23PTwB_yw)Eibn*h^;yoW-v!rRD;5rnUaYkIU$%r&SLJZRA zr%NfOii;k3zY_0eCB?J0 z(C-}iyC4Ke%;PoBJG5^7In3-W^!J=1VMaQZ;_)j?dEycZNnYJ zj(Ma`*!Grx9g0|8^ivStLSU;Pz}0}WhH#hy)mp@aV!i9uDUk9XKreF*^TtCU>Be7J zn?1EE>N{-|%u`ubnT_7Rxh%^Nfc>M7_SL`n_8a@d0SLHd<()j~$rylQpenMHWgS@= ze&^k=6l2+h@w-vyQ|e#_P0gLKP5MPQ7~%r_6*Crp6qyb�KVA3QN@F_8Yz?OaT+P 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 diff --git a/src/styles/icons.woff2 b/src/styles/icons.woff2 index 70eded375744ef7b637fbf1a67a11eea788693e3..1a74a357a17e97ed1562c97ebb3d3dcc3f476d41 100644 GIT binary patch literal 25064 zcmZ6RQ*b3*(5`oEO+2w}+qP}nwrx)|(aw%-CllMYJ@LfnJGl8z->lVdRj=xsu3G)n z>!l>g3IGHA7ba%_g#Uf+p#FEy`oG%$&i`lNt3w+D^7!FHpK(G99l$uj$swYc5yEr< zki<}7t}vO3c#`!|ut^Z8^V?*Sq@f96#Mz_X=EQ5<0AUL$%kS@Ua=a+_2u72zo~U`d z-x8Om%)>wnY~|Bg0xh=aiBa$YiWs9JKAl3QK_B1l(jg;+xLhTtlvZad+rV(uDDrx;t|NTlbb22 z^BwJ-le4KQc(YSTvsd6bvy ze(BU(-2Nd}MIrpdQqPpTQ_s{o#)KjPy;{twk1aCOI7xDfh@2%TY9H^9|0%bb{*i&Z zP!I8=jkn*tL7qYK=_;J^Z(;Eo-PZdh8hDN$5=G2dmw|O&f>Y1=x`N2&`;7=LO5CEZ zunA>^l`+>Ny227`@2Q%kD<)GK+>=#wL`Z7VE@`O;+Sj{T?N1-!VTU;+p4!8IITif5 zz>RjuubZ!DkLwaY_KALwLpJ#JaY6eTFqORU_rdc=TK7Tl>mV!fcsE&r=6Ri0H7cU< zq!cH}1)TJ)_GU_JLJ;0KzWE=wvCd0}B)Xx86ZVV%Kpq7fFbm@+D8A};7c3pV`SY@A z{uDe@s9%o5h5AAiu>T;|qn)@UMO9^Wzv(9?#_6bOX{tb#V8oDQ)RE}q!za!@{vpcb znbH=n5vs#qMA56(9=>7o=B?Teo>7a(&)xxn0943GVH0P_9}y$QF5ciN;y`5^cj&bL zSz5O8KkAOJ4=-VYQR9E(DDoSTOR&+8A{0MUcQRp49omFme5&N*nAq| zo}TQy9({R4lT8gJoXm(e;xgQ&pvw(nB(6kIa`NRIHAI}vO)ogG15a-oZ&@C zXfPsx%ov%2D&DceXf!`0fYj8ov9ZNKYiixt#Nu)sYRT9bQ=m4rW^96KIXAUpY}^6R zo7ylo>7X2vT0}Pb2T+_^MK=CNIXShAY-}pfoLWaVF|{0nT0%BP6{t?FA)BCD&Q7f$ z8@B*-r#6sHS|~@P7MqA>116A7;6 z{M1SlarZ!fYNLsy`*LuQFl{tEP!yz08xLPj3X-OcjRl&5v}qG#%YT5xX=7x8svvdR z1le*{kUVYN1ke?vPn$GR4i6HojHU(3f>bNxY0GIrvX!xwKwFS*WnyLdPmp9~j4e9+t^<~OOTFj;;(Wnkc4fF zE>IJsVVj^^&IwYmjoScvf(&evHp-DfVi(c8Kt+(+MLcggBS`KdwiD zUBvhT4MAEL3BKimAf=1AH((&h=pyN@Jh0>X#1EGX*uNsTGr1 z_rvR0p87~ToS!|Uaq+UZRK_MkRuL@G9{XuSrE@c7DDgOrA@hZNzZF@7K{XI_!!Fj_!w#dWm^W+(1uq4@pJCi%PT6p9IB!`M*)VYpr3?E8}`(U>hX|D@s?Qp@T0wH1zaN zTRcYlV{cqrc|$__NofE4DoBCzu*H;0#Vcr3Vwlgbtt!VJJ+is&%Rh41iu-e;9;*Wjj7G4B zRsCQXfMSE4bFO#<*9_@T0MyOnN==JE`8-Tg3e=}5gk%`D$oS_dkP3Pi__OiV~zY3Ul^Zi*oM2zKj*LT=pbO#3v0{^T|rO!Ir> z$|-$W9AVf-^9v}tWS7vLF^n(lD)qGL7*xn+s%)ui&#^&SA^G0@_6wwya|Y}~zJ5qG zui&khAVY^7d-Q}~!HL0@Qp8-9hq)#v(p@nWK6=q8CJtj)q4Jp65SJN*eaAlv8n-}- zeTUsk%oDPdWEaS9NGA7ZSJgH;zPtrK-qSR(N>En{O=+)6lY$goeviwO2y|-fIxc12 z$bR}i{EjyIUKd(9ixb*YJ9Ml7bt!jZSZxyNC4ftjs!3CL(Ws(9LEGw?KD#rTFwe|u zgw6buR-yeT?$=KEYTs<|z9} zPHdpJwUa&F6xRGC_Nae*ZmOS}i4#EEpJs;7aJ&PsPV*oH=FHFGZXYGt8;3_&cqIMQ*!^p2Ko&)S+r0e{4 zaS(>^w!25$atBXZ*5s$9R6WLpW1OeObTbb$$&9ShQ#?3nhjs93X09mICo~gk|GdUb z7rYNZ(%Xy*HfJ_HrOg7N@zy^2{~Ns9;($649~4n$>zmJcd4e4@2;qb1O{!Zu5A9n; z0huR91-eDs)OGj#Hm}3{=?F;6brSe2@m0hrD{e3Q%M9dTXgQAsVYPny(QzaW1e@t+ zV`TT7^p~Q^jHTfW^BB5$j#pGW#6Q&*JUwKN43`P{DmHDO{%#UF5Xt6_G+fF(?(Jp> zuLo#t4tAGMg6~czPo0J}3zq0@o4w927B1Sda88+RyhYVSZo0BhR`n1H%0=M?4gMw1 z78I*hxL!^q@@?BuuRX7wI>pqG#Ey?gvQLzlB<-daR*#0w*tiYQ$?MA|PuMN84%#_v zpn=WqR$jlLOissn#JB&d>Pe?v9Pc#dnc_zn zAnKPN;Kr@atAzI-!}*Kl1_bTO@OiA{YQZY%UOPY6GshGq;XBxFjcbH!?Mi!w374l! zjXbm3v@d8<4sXY(J#?~j_HSc!qZ@YYH1YuQP8n(V9XQBjGeyM&{Rq7H8mGSJZcM5H zDbgPFR7SIisFPP3G}b>)z5_RBx7Q>-AHRj`!|a%z@| ze6zRK8tkTG-Rh;&>&|FbFs=MDz9i%d|IR(vs^D)3CQgS8|LpGoUrO}H2ram>N%GOb z5RG!46GDES)w#5xXSSpjfv3A={|uE^xU^oUS}hi7T; z4ta9T;}t#+64hlr8Mk=O*v6Aezi4yM%SZIX+Q7*0I3%#4YDtN-4?(`(#ulK_s9)8- z?(*|YA7Ny&oK^Fq8;|s$7B~UEpX=yz;yh10kbZVF^tk48bjxn74(PUsoPCfq7(VFnEH#$TI6bVtWflr$p9S)r}nbl zlQZ$p9}9{FG2@0Pu^eB@pIUM)8OJom>(fzf1RDVkTT1NScO$7Jb)=@rIsPZ+(T+8hRqGiK#4O)mUNE-=M|2wPv$%v>u-Kaiu~p zWuiWw zSR5m1Y|o7HAZO(OqP5j{H?UKewSLlRXZg*z{~#zVnG6Z~WoAm;v2h(wYm-?@{P^=B z+IngX=M>jmme&HX3vpkN1r?77DDL^xO3T{0#Z{KP8Gw@NZjpDd6(6zXyZ>MWbYq$o z)*S(4+{nd{;HNkT=m9Tx@-j|xUc%}tZ{O8m$y?B9bqP~edDEH@$W21hEtZ6VgL;fp zt*_{-eY-;IQ#D>{s^#@eDWBUY-aF6`mhO!!I|s7_9qGTKv51g3QheS&R(m5DnmL=+&QqZrKM4<95o9^MOKwFQbplU!7oNL zBV|#PxB@UcZHuLfO~>>@oGOF+EW1XT9*r{E}w#t3Sn}39g7hWkqXVN-!4= zHj!eF&2sf^1DVf}4p@1gRC;Ur?NfRSA1k1%az23akbH&Z{m+KR_iw#GtA)o%@z#moqnjVn*%qw}w4 z-t@ujZc)vU*aihs(s*olDf4I@<2!@>*7h2#%6iS< zbdt{D_;iydXqJ*L$AAYvOa@STMk9dh&-*-F2Jw-pdOue!g2sk0IoUg7nhh69d%=1e z_a@~9hd8r$oh3?Dpne|!9^*_ogi4u z4hv_gs0Uo-ToZfgvpp35k9-|93-f79=U4D^b)5>whd^vz37?$b*2FW8gej$9I786F zzpB6gG+eFCj}szIBtE;?$stsmRMW0dOE`#I6p+x{h)3g9h=d_>i5p~g+uMwdNytQI z&|lc&3$WQm6WctiUCyT&=POK3aK>u?Q@s_dLPT}jWkRW%F48rXnEeumZ%YLxIp5MbC zA0*29FEeSyRO?}=vC{eGr7En+>X2_WPp2LzmJ^}4>S(Ie%Nv=3FR=7A$`x}TB2_<9 zO%xJ>3k_|t*3vB3cB0g?w;d>nu0w1Rd zucasX>pi#nLhY(n-)RAj&)%?U*!Ip~&vmHzK5|eGd6{C+c4i?DKOZIjgQ^eRkMI6( zJBEE$@hPSl$(-|bmQ{R}&41&JwR3%jB;d074C-#*x%Mn>1lIfmc@?4gJ1XpAV69yq zgl|G}iFWFuSzE=A)Hnfif#x5~$#mm}%qpx}M>6}&yGDi4Z(9uR!a*+kiEE~xFs4F5 z@7+&cOr9;3T(=gcy@Z>+&6=-+4!L7}YiPxe%{lRl*Ny3&GIVsEBn%%VvCygz!kU${Tn%i?&IpD-Pe8S`<%Tuu_Xbj|b ziJOi-%dxVgd`!`7y(l=!NBHjTfeO?`78Pd`8gLbm{|=FFSJIc@vI1$N0+6Vp%*GO)H>14@GvREf@GE4q2TghLZ{CBAH&IMf1wP$f zN$QOon9B;{9bSv9lzksZoX{eom?f$u)tB7wUN69CetJ4~7+P zzGab!f716Pr)nA>RJYTx!h2yJYaFbUaJG@fZK@`?_QJGgp%##>fD(xS?PR`DRzjwA z$UOAkFjDq+k!x207*uIz1k^Y;_-KoBQ7L6rlOH}0EiQ|sIMkskeiF!S z+iu6=j7m5B?OM+oq_^cYT*bG2yte5%6stIE;#jHg*&~Nv=#uRy%TU3}3*?t{E)^mu z(O-WFaxbD{uFhvhyG$zHE&XzSO_L!hwUQ;>g~FNVrf3|Y({d>lh&`8{jlU>SPge#P zvS+uC8A%T>aQzmTgR0iq^CjI&$^Ha3|J5&sg%;g+nJ}lxIB@u_y7eX)KVlc4H*-Vr zXU0Q!%LRsC-;yQytuYvNtfOHl0xVP;EmKFfCDWRL_HIc%SkyO zR1d*%-1eC?H6liW_$uI?)o**Wo64O0NbPqG0V_9yYN02#*2=Yj>uQ)^ zvD(){pI35L`1SpQdRg2J9O`cEvPO0cGEeGwAROeUeChiBWK1(9c_=FAd!ZpC>$rFf z;!yG&7JP3KcLbrcoMw}oG6kX&3x3R)F~05mL=m@7Q+-(6sIC!ij>3T#VJD=RHDtB3 z!OUc1?L5b5~_lbE|$s(tWXjHvpp?1n6X*+-F0_Ec zK3x@bQ|)75kiK0%FC1qE0c^wbO^qUhxQK+a>dV4cC{{lB$^esRJCduxXmZPaA{alX zUVaZK7aw6!iG!wBons5u%qr@C9BUrkaR!O@`_U1hRCBfxY#vyY!0cgNR}~OwfNSgS zL1&{VEmTNpRqIi`UP@tnPQKW7X5(IytcbKY*)M^4R5Us;J=tnui(Vlk4})1=xfUb+ z7CrEzqNGUCClLm8BX>#W+~U2i{6c{erEF6T?pnHb8D$G)i4#&l0ehPidU)x<<<20? zxW^nNbA!WjkT&9sJ}|23o0>=B7@>$lHLqw4-8d;8oYGdWeXZP4Mal}t_oI-Vm=LEO zC@$yD4lw>kmQ#Gk+W3JMQUd+V0SS1)g-XvS-fO6@lclT&+EZXsfpBPg9?zZ#ONhwl zMLaUZvuyz4+xT7Qt-~Ipfzx-BHK&U!7&WLjW(+)hNL_8_)C`r(j`2UagwA#XvW>&B zV$s&$E662%Xm3&B1t)M`D%h_o7)Tu3e75z14D#&y?OE;^p5w6n#{RB0F4P|49AfVW zK*HH#FI_{SgtHcl?uQnk213`maq@bQ2nOuc7N%5@?t=QfpJBFe!TC3bZM;yD2KYBf z%dHYJ&NyWQFYK-SFcIte5EGpQ?`+-?ClM2W(8F8Cybs122$lxF{2R_=-|W*B{~~p( z2(4`-_7WJGqxtn!*+tw6b!h@qa21p+0yk0D-=T6_=l5jMOcnD!>y_KWV%^o?41^B7 z=6;*r5#e*mHOBMtDWm6(*xZAnjIj;BP5D3Q6ZIq4a6syWiVA19bvA3t*P%fyb zRgxp$LZwD=WS35)KhXl(@}YPsKM7luqWQx z{e-A~NI*cbbBT;m#*?QihRKdYk5{aL%> z>qf&hI|v{HB*sr+Ye?Z}Kk_5c)F#O)w8YhX)2-}z3leb~j*|H%2~YKWH0!CQW1R^f zEXOayMXwH15vuh+p1O`n+^M^}Heygb5~Q(+ugQDjbN5WR(yQNYGl&J(FWfporSm`^?KxBpRe;c!8Jv?mHc70j(!E1;K32jLzmi!U!P9AWt0UI?_0ecap!t95iAMH-9AxlPjS0*bPwhpTY$sV zg$_#kKUs;BTyQ`6`3EjFV#9!+r0fl$#2U!m=-*5!ONZBH>Y744Vj|#<;jT?I1wR0# zABh+JeTj~CD>K(_E<}JC{AkIFLPKV{D&jo}@EEv0d}nRdlVtk-q(!7z|qfUCPD1-m@N{bsT%dGx}}d9E?{H z!^oo9^L3No_c@o*h9`DsQQaoJ=#Q>3DTD`l&QQ({(h12I~{!~k(`b_^6gW<>2 zFTpG8ItwXlv-#rqEh~9NX$tEwqV=*C4tuUtGHPRs1KAP}M+ib!b$AT@x-PIXb=&ghCIKKN{jyH9`>5@l- zMMEgxSsJ!j7qRiaiTTx0@LKVkq+HkJR6I;pP@&3fzIpS$MnOvZ^&6q6k}={SFC$N^ zY4Bzeq+-nJ7PU-@!5V^a`7*p*PU=MxT5xJI9U%hx^EDT_;gZuldojG_2L>E`)ZjhD zpr;Q@Tn3IOcZ5~!Ay*hZf1q|?m-asO$kBUV27dB$-`w5bKOK@p7;cs}I6c~7(~^tB z;}KMhr^+82tm9Vq_Nn>!K?1`XHaMGtR(XvC`uB1iZ|Ttsf9WLayC60$2auwpXtZmq ziyL#Fk8FFaueewTUrhc+(LhVW_j1ZQT-!uaLjdR^DG_$Nhr@uph5JSAN(n0b`!i1C z?{79*k|S)2L<{dT@Zta+z+fiq0C&-Rla^M^lhvz5z?u|B#HLsv^@L2~M|++5T{~fI zWL$cDsxE#YH{C3YOqA^}QS%Z_?^qgG**Dnnmh<_m9n&GVd75g`l&HA%N|Qa0Y>iAe z{9Nef&89A|u9{p|{^O2K14+J}lY_*(qgG&=0xH(CVq3Wq$D>+=V=~C5^#Znu3*0^g znAr;rh$@1uDK9qrCV>v?r1c9UKYnzPH}ZV9X|eq{D6cKJ>K0tLj}`yXcB4Lb!RmG< z&bwhH0MR?;Tqud*x1VuP4Y8vDT8_yU15VkA=>lLf7*aXD7C_fYlEOW)-2_|5H`R9W7n+(OfZ`Zf2s+z9knRZ$1hQDXmk6K z(l}Gx8g&oY*alaXl?bgPj(rlpwvPFtgYiH{6O2o(yvL)ch)%y-Dhi$3{7GaArF6O+ zVaz5o_vpk{ILzY8Xid0{rVcCDAzqckWkUZ*aZ}DWG@#;F?~ZALETLS19twkVr(4sx zodBD5=YPyuEpsQjE@CFlw^F@_jdAHH@RM4mTyu`YH)uFohA{j9cE(m$$HC;+skTXk zL+Mb*jKNm<*(-bCO=8+z-RZ!L>^XGDc-rsn1goTR*&!%8m>PFyM^qOWUbv0 z%!sB;lW@<>iEmKgb8$pFiVV{-!noQaL9oMY)B?uJf0h57XO%W4IenM9v}o8YUvPOn zZO9Q24h;0q&TgKcTh2q^`D-6!_zt06QpcECRtH}1dq*rbci_Xbe|a6#bUIE9(%g3i zDiowdp-Di_=)~~P`2C@3%T^hB}zSZ1&*R%ZU1OP=0<_7n6rZg&xoNJfBP<8UYi+2=10~x^w&*3 zXp{~(kY{+tCfz6{X?!(q)js|e)#Xsl{{UsLNLa*Uj`=3aa_i9~|&Kg@f(a2>9N1x4_ z@7`f?RZbce|H$Ar6f=0jIEMxmcv^yZcns5KCL=q3j3`O6kF~ajg6{G(^ch`H|BavMp|HoH(Mv6S29%-^{ z*tfnpXg(Tx3kIbV0@UC_?Kt&NUOe?s3x5$9#jsOB*TJeaMH7i8s#aDJwx|2Ts#rgf)$Fm6l}?WaV}!T#a6@gxyqK|R zM(?p&9D9y|$VQUIxNgB1LnJp29zVC7Tu}7bRf%MBR@m|Ts`pj4TJ%{nXS%#s%i0J1 z@^9pEY)607_h)CAlUtVOYCx;ey+yBb(mGIS#!UlnXigE+;>c!o>y7*+P0zOG9Vn`s zwP{A}mLXr@IP~+yig#c^0lp1}gce}x=|UaPh9$5 zLy=^Ym>Xk;Kx1WO>kkWPU<(x+!`fPR6wLLyJlGgwV$?m#eM@wjAFM04dta{AjA|b1 z@M>S85|m|8_++X=(vXXd9t3ZnydZcej)>(Pe*ATx@GEe;-4QlW8rwTq30PJi5#uhS zH7hG0&PtC z$~}mEtJS^du&aBoI|-YG3h)C+qQbu>b>VC&2fj@6E#aMNOm3c>1jwVYrE;|$#XQX~ zv~#0c(TgCEL0JH8JnYHuJhv@YEAXlap~7}?pKE3f`k2~saoXhqDyQQXjdEDsCg|9- z6jn6%MYagADu^j4#bFis;JWUJy{VZnQgh~lkDjgu#TX$Y_Z^eoRVj&CGB0dv0Q`>? zrO|AzKg@Lw;m5Dnp`_ewvH!gmJ!B3x4l@?`g@A?Ow%W?7bl#|mu z9ga^(YOmB0`eqZ}j;|kP*%ShtZ+C}A7n4xPe%)p<3ONb}Vj6y|4TdLV zR*?vjCymKvA(f*T)$}xi4idEGh$OmQs=A2|ZzQ$#n?By5R&|4#k*%6-C2)-&fbkn%5|3Jn(_@Fd> zTmnLo8$#e#s_{VC3i06zxY0cw1$1{@@@P=R$7>gNRm*+yFvnKe8TtMvHkM5qcb>%GJE3Ns=lrJ912c661uc?8Irk2#>!jw=ikZ15@*hBoz19$0N4qR2j%+(>1ROlLB9{m?(Zb|jBPIrR~BjNvA-PxR}!|ezSW7Tf-8lQhvCT2si z_k4{Yhm#b@I7h`e)kSQ;YzUx`Yx?Ij0n|kPF`=OtDbJfN&N`zZYg*4*bAl%r7jW*i zNW}CREzGd&Q_!;|LxHyWN%M8R=hib(?VHee?B@o(J#`d!-58Z>e(q&=)_+@P?wkJ}zf3N%vIQS?;NkjFSVz|aGA)`h0nQs;- z(gc3Ci#^w@ro__9@m)<+u{`?NLiY5nZ)Qf_gD5kxl4^^=fCTs2u5VN9j}JEx>WcAt z`2#2BJV3lwN3h9PmGK5@95krR5+>vbpR zxXVUG`|UmJFss9d4F`j&zjzoIK`8(8d~n@UFKvbF13Vk&Y*e;QN#ojNOOGJzfDmjXQx$nBx6nzWarw}c|270SK||VBO!GskIP^lHU^){qu(A|-MzfMDS4gKOw&;`cXCgV6r{`- zOiTpXr6>``c?!@#EV;mH@#%gKZ-7G$T$3Njhp+wj;fH!UVR1Z7tL6bMR6=XuKgRf3 zXew-ka{noX!bO-iH992ckGAp)skk@fhwXZ+s?iHE@37NdKhmE3ON#?(=ho+0`c&!Z zjc0$TI#1{&S4gr^+rLA>DcdC}w~mDZ-Pv5$dkKyGo^|y}9h~YKY$wX?>`dJXA?6K} zS_OAZicC1bj>nu10fk>Iq5MXh@LN|tj%)8Hns#- zo;Zk+(vhm8w-6r|wEVNT`z|@<{qBCX$x(>?As?ysp;yks*tV5wQZ{L=QLxWa>owS^ z8Qg!wYIjUMR?}GR7;H9UFJ%-<(3AX(9EJO``#ZZ*?Nj@k>AUXro9WYvaFup8KEHA( zssssF=^1iH0c;k%sT=cNJc0{qQa3y#0YClyh|j|F*$3yxrX6iCTze)N29#YNh^Xcm z=-e^^eV5v@gb5~+XMDDhcmFd$p+;Ahjf%2zjf8V-AxXzAno8PA(I+sFbBs)B%dC|d zONX$ak{)G6^&q}*&rft$dh8?_mj?$wuE?y?`=m-^%|?G-&MBW{NG#WQ6fya%^0-$a zt)0a!0Bl~9;jAxzIz@hfps+1r$#p$6#JDplqk^LyiA6FCcMwxrmdh-1#x})oeJME! z=vwT)<<(u;k*J1ehVF;7?Y3MxZ$`fC)`jFpWf~0A$D<0(QO=clk|Z^Pw^0M{w?6ar zM7lh0>htN*Ta|Kz315Kd^bZeYU_TZrcy0OJzL(@s&MAo83>e>1fIGD(~+Jl-gh za4=`0fQJOlhs9V=O$tw=?jUlf>AXLk=ABm&S)xqiTqlTP3|YJDR7626kmDTpw)C6Wd{9>CZo;ZQ1dOW`22gfdc0Ik?Y)E`A1I}*v8z$Yo}e<8^w zqK{`}SbftO!JgCtuI!9+j5;sGcwG1XwtJhK2==y3lun{fqy{LA39|}%XIm#5m$Obo zVvG?L`-y4R#C@#F8h~Dk;5^>nL{i*radnpv;Ei1L@y8>>lb;G|Vc*g|0`*|kd=zYr zNmSa`NQxh?593p=gdaxF>QmLzZlvE|S>+@sZMH2tJcW8!?x}8%ob&0cN6)YNUK0-J zy2Yp6TaJa;?Os~yG=sZY&N>#uAboMarMNPRtX=H`X0*-tdZx(!aL7r@{+VzvV*+butkJWB}=i3(r`)Q8lKO3`kF)jGVh(g`! zkJlwkW)oyBvzwU=hvtI%Q z)6h(=VkCnCHPUB}TAAG$0YK_2%h49M;TLls=S&BY3OiD3Y9SpU@uR|9=Nd7`y}V${ zO&NS|C2ZRIJg3TPLjk8|MVP~=eVL`mj03`$OU1^zA;^$R-1FcSShyNjg%|il#Sm5$ z!VS6Vyu-l3H+rGqIVe!+qr!G!`LNt2NpFA+8zC0L zyHWZjP)y`yiyHmcaqnQ}j&bh<%~}&pWZnBfBGglH-4E-x;64&!vtZCX)oE`)*ZHJX zuf;PPHcUZjpM@~pC(9uO+2*YEymv=I34e@IE4ZhtV^^~X^;VMx_a#qNpJ&_kq@&l% zTA11bWlqtc0q3K-hH@CoeU+>5pWO%|^`9|M z1AY8ZASvr40$BwQWleZWlgHlF9@vc;#6NOTDkc3bzJ!KM7H;@feZg>7_e_iY1xPw< zm^@KSO2+reBp>~?GaI*K@b4|+k+q?oQN)`|zI=od)Ty0zmFs6w9-63R<0G3fv~2%e zX-a|5Gf6lj3VY@WsU;Os2I>gYCItf$?m`o3aioMu>#h4ybUHgG3iSpA;ilL^KI}%YY*zs62zFX@NdfUHE&EHG! z4Lu0K<%fxyeikQ@1EJZs>OF9%cfHkS#r2wpmG~F_b_~;M2ioB9YsEK z69OAAmLHdF5(7_}&263@S7Uo=dR$W3(X=`Lj@tYoxH4Sgmf9*faDV03MfyJVww2}b z$dY(OD0Y{nK#F`J;f|zh(Ob8Y5T!~6rLstN?;Q7q*lu@`+Dxz)A4p(L3>z*{u3fQGWh-_dRb~&N((&}Z!jUhvyl8Br4NHZ`}gPI z$KcD$Bw~EO!dwQ8*DuercSr^0CY$Aux$<2WEtJFhs=sc9nhaGuy)OKgpofI|Y zfE`hcjmV!lMSf7*%p93nv3~pQ`UDF`Apeq@<^(?H@XXmZZ&qu(z7G~vgBpmWkG{Yw zBDt7@k3oMiF_T|@XTd4bJG)MgbYIXe#(x%q^x@45tY+)-;Bdkb4c=;TYb=#&fe)kK*NZQd+ zg1+~V?OCV^FT9Qqnb7Vy{@-=(^^fX{bqex_h8y6rLv$S*2zzNMIvFV#M)HcSpPQuJ z82{(n15A@W?@;B=VEz!G9!!?*AG&gR*_Cwmsof>vLF%x_W%{^ad25}_aEMc%Mb(-l z=UBlKWQtbCiTHvHPDBDTxYCc548rL;AT4JS4J%P3wljsJDdl1;H9CvK(}*8c+5z1n zh6{9Pxcr?S>;F;0IANX&ri=w;PESB8X_uvZ$k-P8vmso@kU!zn5N}xy63c6Bh&57U z?X}saQ5DFS`%cf1=Sfp$EcxKX(AljX`WLPNFdI=RM0G#OQ&^QWG~$(Ka=*kwbB+A| z9)j&iigbrdeUC>;=!%m|!YAr=LV=O#vr%`a&R&nm5l3`3v|q5UD4OOmKEC$L;=z$>A${s!tcSt>w%iKb5)=$%c_?nX{bHda5=wJ9 z>Br-WdQPZw>hxKz&@XqT6!LCofyK|lG3-rw@_s>D$8Laly*L1}`T6ZU>R==>wRg51 zR?ZH(&ov%PavCdoW2RzyiFR9g(bO`cwL0SVJ*jUJbRi%W2yN-fHI?0OJ^Z9s4^N>d zB``Vi+{81P&ryO>bKAMsh}4+8&s7*Kx5C1N*NjR|rTRK>|FWHtL&L8c*jn1g*b9LS z%WI4wP_^*)jw+yRgwx&qrNgC6hvU%#;gM70`)i8Q=99q466Cv1Ddo{fX$@bQ*3}=FlSS$z&<-T}I*@j>T&KNX&+NK|IoNucDPX2)m!*$ucLP>Ai8!# z8RFss0Tly^5E5%it2q=+N=y*>gsy$cmy7!J1XjzP+8#_c38no%cv5ierj{;+`mrC^ zemgW4c+5}cSQ8Q4_~#FL(55xASiE5etq zUojPhcm@+41u5=9E$4imoaw$4^Xva+I~XB#nluHBwLJueTK`hzmL;7RLv_Z@|62&y z8~85&x>Mbk3&K#8r}6ra?y!8C=%WnsNFJ%>LWIcxl_(@gd4j&cX0;LLNV~Z;BaV9p zQt(k_V6;&aJ)IjQQ@hNXaM&PHXcKu3bT%1sM69?MNJc7C+xfWSS`zh0an%`|+;Y$4 z^y>I~_9$QfBsQHH>|yOY``5#v!6H_Nwg+#$4zI`sL>gWx+W`SL#%O-Iesi0< zw#W!R?g`K^r@n+R$k_%Qo*pQTQ@Pa4Hg+lDCr55)GuM*v$p$E6W&-%}VE$JCgduz0 zpEqkBjR}C|aVyUk5??rcQgiH1a%W&Mz=;X6`JRR~hYeH*SIZ4+;|baWTa>V-XJA_) z{9u#XO1=6JM~flLSDlzJ_8%3@`5*kfvD429Sl5~j3m@)#j9QcT(5sY{$u8!Vmjknz zn+i#B6CD0Zz=!a%HrnxLj>xOk_5s}mGeHS62EE;WG{A5~SHY|>)rA=Y=-Ez(*U5j_h62mgXto53j{C?zeh!r#)^U8tMPYJ%pS(OiSyK3aE ztBTtgx4g&`Uel%ZN~H=>-95&tl$sqQzc~v;sKhv|A7CQJ5OP78f?Bg$Rp7~ZKmUBy zY=NZ$Zis-AKyekHHyINsGJ;)P6?M}gO+K?)wfb2?aZ`6g0Upj=`SXIGS1y>mkDJ5P z>NOOB$ygMGeo<0N*vm})niCs!PuON7oCkNpFl>pz1T=04g4F{<5O*Lj2vx=eD}ubRX86hh)iKvf zy?4)bOm%#Gcwk>e!yRNwX=yUGwy~mDsQz!eNQqaqG0`u>zk&*jD*PG<jBpzd`bKf^wIgT8%Ds2&;C_b)W!w5w(P=x zof9#95{9Cg5!1GBt5Ev_k3{Nfb);B7%Z^t4xlKkb7SJvyK}-ZdJLOF>LCz!Asn-$n z$OO1Q1jBSSTnABh^6p7yoO|Lq2}8cnr$Oc-Q)_$lyRq98S7=mi{KCw$LqR#jouOyl z2_tmGHOE5V{hOh=z}xN#kUFf`^z=;@FtoNTggB|A0fJj$*#3uE$+lbTC(dS{{+Nc(tJ{ zgq)6JRI#rSbRdlqQcR(6I*DY3wB9W;!fT-yfS12uwKo&C!OnTdMOr+wPNYPl#_c~t zY`y=G>2j$xl+M+g@w5o{(jv}ozRqfI0PPobTy*5!wcV%m4UfyCGAk?OkB5CKZ>T4? zGXKK&pB7&oP6ZRULwUr;kRE`d*dQ&6jl}foWOA5vL!LZpf%AIUNEJ8^_evu*M(MfN zO(eB8uW7Dz%bqM@*#@T)CUB(^j}COCkO)EI;qS0YuDmI4*`?yUmJ5Xr(?MM7J>t$P z+9SRH4|8T_)q~`BR1S5s%Rds^u&nmdh!Auax37f)m`{x~ON?Y0dx;N-y}fZtQ>i|shJXD}YGR{?lhT#Ik1Vai zF#aSSa@81M7;b{qOb6TyBl+b-kIXrh6}JAWRm12Pm_)h)?p@GgrYe)r)~pxXuCN&9 zK)s4x#qkPlroGbS#$)!K+>-K_5q-d3>%mQx_9XM9s-(ZMxiV(nQVF6DNsPeQ+w=dj zKma8mVhGNcRf#TuOBxGfK|~xtb7cE61jCX_!j5GYH{-5@*%sonpjMc@!wsHz>2{Xe zM3~%Jw_keVRz?3*%etco`~PK01M6n609k2YVFds|06SydK+>}RgEJg+1AS{ipJx-Y z_iVA)1`R0lonj7il?(9MZr!?@w>?t-9UHlNHCaJ!*g*Qrm+XStGWBi?CKo6N0|PNsbFNF1Ln{lGn<%inTH>fiNZeG zLf%<9%)VH~6nrn-Yd zVc*G1omBtntXlOL6qCdYVWcVF8)oLKGb~Be-)&CU-}L?rwai2YES@&-?LnAKd@}hN znA9_82j)v=++63^deBv<2izWHuFwmZivtU0@ihW)hRDZLIvO)^6c@9`t45WkuI-N_|o@?ZDln((c%73a9q zVKaszr8J6}{(N-%hyvGhp!zDp!6-E3fBJmQw@5k$6FBEukkoPRJ_Uf~-G{nqd^;W5*H?;O0GU7$K~oMgDSd?swfIb+0@dn6l)l z%AQ>nOMK~pr>tvcW{nH(GTY?jl8R>i%+k4-4!^2N>7IdDNP59c{yvlx+bFA!B?PumYRldeXS=DdrHZ=NF znqtCx#;NL4`5yD$9bjdqq>yg)%#CuV05iE)g&Ld|SdGF$K9m&1Hcz)Wwr>W(&NrOyQZ;Bw5!Oq)qRObtjAUr~`DlVjuWz5GZxlFxXc}EwwB$dkO3*u*L5lLNH>wWPgVh{??~(LN+h4Hq(XsK-dZur~+pFD)ef;*(?+IO|AZly9ox6R^66qE1gPN zhfi|*w;blYkF_kN<_OAq8(U=x`sZ+s58RufiQ$g=JPyy>yRE>5*H%jW?*c~Jcu}oT zs72mJ;{5NtR9TC=3byUd!@0bA2h2$R9eDg&Ot{{i?}5{+04OKxUfW+;H~itlK|ATn zbZ_8toxQGd|7-O`d1^UPzrU~lL+4d#D&@=m;Y-w!<*Gh|@_`OB1#q{)D;CdgUp+HL z?>G<(dkdJG%_o-cSQ5h!LhB?j@9zn_jho{&p@hs42bP(RD}{=8u{rho8+0^R=C0f|X4mX}#Lbq?2$Qu-xEYV3Cx{?W`= zQpRcOKIzfiU(coZgER*@rypg#U&r;p@Vt>!=CA#tVT>{){ap2#PkK-v8*TXfj(i1W z_>h@~B=q|2UwbjqsU08<4GeZ zFK;qub`BYbK>0+;#>vEMH3ZIVbU=5}cQO~M#74gpUI`BJRAD(jy8n>AR;WJAZ`qn9 z?1|=_on`cBpo+PK_cZ&ElVOD0t+UOh{rR5az)`Jm6y*1RpFVqKp*j)@|vP=;(m-uPdfEPD>?}-BRS< z`Q7yIcDjqoc01I|%9g3wg3AwI+qE|!pEj{Ub~^l4J$=FQ*)2%S~$e9Xt?z}{WocWFVNB-4SaIHj_D!aG)QcTWE#={HCerf}W`QD88_ zizOJP<8*|H5w8qCl=ocNjPxlh(1+9y-u~gnOvXzE<;o9_XJx*Oot*K{Mmnn zK_z!7C}I`w;03OTq62On7cN*7;AMi~;6jQB6Q4x?_9adBsrockL7WDAd<)sXOao{- zP2YDfO@z&fmBR#+prfeG-55T|Xw;D#Hz-j;yA769=XE?t2B~7Q_->DsOck4QFOI{H zmVKCou)x2O%h)V!N&g5>X`_Pph8sc~esaN38`twbp*b6@)%8!m7KmC`YxCAjj>wS7K) z4Vv|zKXJ*xZ$~R}39m%A^9E6nD6uJ9FX{oNKgS>EU+jNZ_(ke0eU6AQ(dSF>2D@H# zN{n>c9~A3a^YCIARYal9TP8E|zt4zI-0AkCQMZ@mg8;f!c!T(}nKb__HsH$lV`qe0;<{}s42JLxk67c`dN$B-i$ z1uBcG5VbBVd$p^S@?JC_^I_ByF!%`fcA6#aZL3Yv|4qTrCd>&DHrT9y5h7%EW@O#A z4l;Ge-?b4D7(2W zVgJ?#D-^Vofn)e0%-8+JhqlKigD>6j$YS zBOP;W%0(Y5T2HXhnU3@WqI%;sjJ!`KDR;a zUbRLg=1nXHXwt z%TP*0wE`UWM;L(~`bm{12!Dp+y4Y9`)m5e>bw+JB5yMxhmW+?N`^BVFb=i3hap< zSCm{>n-^W^DXP=JSH;{M*i@_Y1{I?eJ}8+PKWYoFZLc5 z+(}60ONb#hagrOTNkf)_Wb|G#$!=iBE{LHxT*smIHB7<4Oy2;9VDB=K!l|Lr&E?

?rAV=wY{rD6a1s>oM#uOeOXCdNQ?ecXdAf5fz7qWM6%|Q>N(htxfeldFW6Dnd>$B zbfsaq8olo!bTV!y3RubmRSl?BLS8D%xz>3(MZ%Ouw8~O! zoMQyv_yKsrDRp!^$dEBM7P@LxlEy3}sSId+L}M{yh;(#!NY1Nyg3&1Cov61sKsS4s z({O{sA|0f~;d8I?O#a@}2d_QL+Z}wST?@-b~Sg`8c1lK;s_x2X6rp2M?s7-;|jq6UW{oQjKrgfb2G))5mzrMO2Acjuou1DJQgv7tns4B*P2+Sf z_vOw41<7S_By|fYP$nk4Z5Lm=vbtuHR*4qWJ4U${PKM_C0#wPRaUU<_b$?0v1gAw}{ws$4sb0V&w3*DV-{`w$50@R| znzUmPe=3)vvWThifR@o(uDR_*_zCE@mX9|GS0-JF(|Vd<@R=y(;`<)puch15uh}Qt z=vd1Q^Uw3cmL165u6ozq$c`wRN1TDZ_aX>TEJ(n{z@6PDY*UMptP2aHp zsacwg8}R*^{Tg<*uZs<4{8m6bZv7DZIBl}lmvf2DPv1}8<++Qz-@-md_tIzB>KU0A z=YG7ydVudW9c$~yb1#Cbzh6Tj;nk_HPK3ED^eXxa7fz_pyRdDPAd@nUN8E%?)u(>CuHYqOBB!xrHry1yzzM6Q7ypU0zcBv{m`X>LVxT)xa^BK>^ zQwSA0r~T;f3VsX(Ea32$JRDrjtxL$a%fG+J&dP5Z-gW7$0+=t~M~Y{j&pQAA4)_;< zoag&{|CT)IkbHA!=!QTWg(4+hyk@_C(M(rS=3B-bE&%$?>+BV zkg5B}zxwi(OWdVb4nNdWKPkCMHT!HJ0&xI>R7=>NoSYwQi7m?btH5Dq&9@Oy-<_^5 z%%B!_^Mx8vXR?S|V473l*L1P5D(Ap}bL}O~m_{>OquO#n$NpnCC9@gNlv~Wy;3njN|0ox@Sx~fSU z0KT8^!oGx9QkE*|BilYgzsF_P*5tUG@;PgAXN5CX>%pM?)6ZeMF(Ur-;kHI+MtiBb zOi&DI6q1U$i_btZj4iz+T+?!E%yg$chmh1<4}6c!9VRv)`{pn&bCO((5b74zHL=tU zi%)#}7l6wtC3@N!ThrcE1-)=2z3e0$eA&z|J<)8`qBds0Bu5SRTucc$6vFktH3$H{ zJRv3T?<9RoiV~9vklkAPGPFjwS)h=eTM<3iyF)XHliC>ny6Oi2Fa8g#HMJSlsqXl; zxNku@q})Z`dP(@3ylBFkT@zLo6=vreGzCs_R;4fFeo843WUJKFn=YgtV8ng47xVc4 zL(OA%mVm>QBi5W*^joG4*yI#rw1b2q25l1edpa9*^zqg~WJ*FgT(3}g zpCSk3Uig}HX=)M@)Ot2U;XC&rqovVl3w?D2)#Jx-1#c@H2;)> z1V?TfQdTR}W7*RnNpo2F9ck{?eS7~srP->L6*kt)n||^%A8pGTTLCQbW6o<@3-j72 zuGG1Yy^<=ZwmAYI0LFv=btS(?L3Uzv{zgFlWSe&{aF#j(VDs_G_s3KFH$MBk;MoJ^ zav=B{mA%6DQ-;nto~h)2IzQ&wjDOB@@nC=Q|EZ^R|E2o+K!5O1mc7D5Sb{2gSoMPj zuc#L%g=YZ_rV%7+{#i=|ARDq0B;XH8eu+x(r4DNYBoxpC$y|zNxTAo{?B_3nSK%iR z)dT_tjl~@()VSjg3=B5<@WZ`#K;FQFU$UuBHdV3L7$!uAh1+~%WfizV=(^%;XEYwg^*8}ASnjTWU)D1K7Jm6lT`^PLLGMupBRllB}qjZkU$s zxSk(`QJkb%UX)ecv|T@p)4Z(Pew^3q{rUa?5P}gD!-=_Qt&tSXupBRl(lJv0+m;no z(+$(I9oOUVgD{GdG|P*!s++d!hjE&hb=!~c?+?KUis1xF(G1J+f=Dcp%H#^AO0CiA z^ai8JY_Zzx4yViQ@%sFwE=O^BGKAQWLDA0^RDuGA3uxz!c-R%J&@?5cUMJt2tv0Ba zMhbS9t)NqMd45)&VO*CqXPSr2+DzOeEsHga*YeevnjpA zbGD<#^(#!6Em{hppb-1d->cKd*)x$6PrmuH0Cia3FoXny zyIEhM=T(S9h2tV`P;2tr+gGr*nZ7dKIp)ok_apU88aR^ra(M@VTaYT=$UsSr z0a7=TkBXUo$|u9sNYr9g<2jvNKFIg&#I503R5+7*(l-V#yjttH&y9&#cS4Jq`o`=g z6tFk+zN|a8^+Khwt&}V(a}K+Hnw9VK?&YqRU=7ALdo3oYYWPUp?SHR^1DPPQ)b4;C zj{9;5Y7a!)hY5$II;nk@{sp%#otinO)T(Wk`0Y*JJ>2S}pi=0#YTuFf8+V>Mlzf=D zjYs*Uj_97o?fP+`2^0 ze*C;tkZ!)plV?s;&E zM>&}8#BB&_JdQUfjy{L8$Y{WB-a_05cN?(5{q!6MY8wfEWIP6gS!?MBO1y_h8E@D7=X&29E27O$&QnH zWm@M?m!jhDNyW|9W~9o=erUP(qf6|7N)sw5Ud)(AkH39E!!TU@&FO1WSJp8dvqhB$ zH{{*%9F{G^ws9G;HpG+7%O(+_#lR7b+yGjYEWcT0q_1mEk0sbpX`KOr6V_9SOZy7r z9$q_ZTska|b%7RnJSmYuS=gUU_r-AU^gfs#e!2dcy zrn2Cg)UqF@mw4a-Q3GNUpo|WQfEKVMlqO&jzkkcfa3ws*(~NU7^2nelwVf$RdPqa! zZYIy5Cl%OaMJWgxM9WDVZ*P$m)E`+jtu|M73Nf3zNSZuhlc?k~$>AjvjQ3JemL&n? zWqba!+z&O5#!(Ssu1WyQbo@j#xp0e`>f8~~qwQe&c+&ZRqr%8N5^&Yt_7X12*fzp`8VXTKED^0rQb-;1`}TS2Tv;X#E#mjY>f`7D%)LxfJ= z8={zU4juEdeI|+g*Hg9UcMUpv52jQJ6saXkFgTkwcQS}pTyF{EEj;fD_?4)Ca9p-8 zW)J?>=D&;T8;RTUfN?t!$k6|L9CC+ca4=w@R}9^N_#j~twVTBgFIz#F;}?}LZFLZ z!~h7vNf04viV7wovm7ABM!`v(MEPV2DNN1~BBaG^qDkw7WOq96zZUk=ok+?lDz2OQ zN++$|9XA&@k-dG=0U)~@U8Af9g(Qv$m+5lCn{DOupxaQo=d^g&kqrR*fZh>5-bg{Q zyBGH|$As@bgU{c96L!YB0t#$mntlFo(Y>7C(bv#_6u-RadT5BqQPeOf;>a2m0s?qo zcP!IbR*NQ+c*|7{p7iG~@^dr}In-62>mcPRp$s1BhEt_i*d?d_NW*(5XNv}}!0al( zFd~O82&}2{`qP?(bMo<*dLroBdcY9*zzFs2>X@gh%=DB9X8O4WQH z-huh^^UUf7;ustR-EViOM3Uk4;pOS=!NtkV(bd`AL4}Epk(HU9p{1#Z)>_vQuulbBKdf@{4qgla+QGwS=RV z`m44AvzLB5|KIgtP^gpb@zS`LKH=2=Z#R9W1GaC_9YTu(!GL04?D#;ebRn$d0jz9d zti%GWOe3t+eXLw$tb_!t3?;0T1uXm`09>rT$&uM^bjSmn@DKnZ z8xPHFL@_9ufrSb{kxi6hwxk#`&A>|nz{n<0GnoUmH-gb z@z~5J=7X{s*sK7I=|nANYx5zS4E!bl!gK;RGvH)UHv`uhKro%;$!vczjaws$g6n# z1{1eI`E_hw0OnPqUW2vUkli|d7Xa}pfv*AZGN`|f>kS~hO7d;6e;M*yC;W7uyjmg- z>;@S}pLfA>?jNS=k83^=V7~VG8*8|=BU-TEB_$z}9>{EMMFoZp^9U(cP*Py>NDL~* ztORxJpvK}RyO1tUqitBwkKB%g@Kca{MhgYsg3#Ma2xZBiKlIb<{q9#1*au-e;u8$z?um6rLCPLD1;l|iz>X_A~G z{d0OPw{fYeHebo8Jz5?JK@Q7YEKutPfry0JYCn=Q0_<(1KIVX-J5(i@PK2uHE>NTQ zAQ-L@&UUA*Rj%f8I33A1N1c`+q{;K4JcbJcs|N4|r! z{tp3}mLrDEk>`@jyh`~v3w4}eXM<7QqI}FHM~T<_W*&98i-e4;O8WGEGwv8<6ux4% za(rR&-i8{IMnnG6HRwbW2zK-{w#>~HA3o$PwP6*!nx7I~Rcftstn!sDnaz;hS!)zk zC&9Ac){t`hXf_4CtuG~12ku^={N!~GZri~{9Fh^{O4eWpr?t+tli>l*0y+IV**@@0 zUA)~wB*Aq{=V{qrS-}l`T3wgj8rb7Dn4%)An(g@UVQzq=r-Fw>>+_e>&Fgf5B0QI4 zFYHt-nzrao;uYanPw`G1)ttM;>_lR)4onFWyPyIfP0p-ZWiv`t_^n+*AkyZGt1gkvn-d%{9XCtUp^MjC_?RrXs7>=-{`)S3lnG#w-x(( z7)pp1Myg9?SvIG|K60kV8s)%pYaI~C$bf~Ij~Rpf&_Yf6juAZSGD}I821Nm|_TORJ znjo$KqF{$>kj@TJ?->4GoEA+S8c7Is-|BMu+M3K@X~m_oIXtO?>=e9&D3tN(e@%w- zB*w^vqtn?!61ZsSrf8r5k~bh~?WqWTuoG#8ye*3mB*W-VSFZDSi2HZ(Jy~$5U`am+ zJ9rJ=+)hm@4G|J(8ssJlZ0;f?9us&oSA%GvMyb9zn_C67?71RzBuY1#@Sj@qJX%4) zVLq!)GAn%dhl0u8O^(X$S`ACowoFoIakS$TV!o=p)3kfBhUHbEsG0bd+14#_32)dE zKA>T@z6-THLKHx-B=j)TBgWA}GI7y2@kKpS%e@m*)G~!cqefrcmH+ezi#tCU5hm0$ z;+5DKZOP*TWx$F;YF6j!{AW9%QUZ{bDE^W^QrXlW!mOo>B;Na*rLQ+P-%F(w_2-Wt z4!cQFdP1HURO!^_*vo{#$BLr|pVz0@qH*HOkH36WRH=FVO0rd`X)r`F~#FOoDbm=FQgd z>90t@%M=?3_Sgcm3Od*?w}XSn0z{`@=kk@9JlyE)bR>_~&NlG%4osvpptUzW)`E3a zK{Tc*F_7Q`{Qc@PrT`aXSivXYTX#gJf2|HQ$Fr!<-g5!e`J-3%Pb^9o{D9&7<>r4@&2q|l8z(21h59Xpxc>NCr{o#RF-Bn^s9Q>B*AUgn z;hqxm=!6*vTg7B?EK7<)*K7KhSL2PSYz!%eOCm)u!8z3C8vZs4PQ9*ktsHwZhgxY;u=BhgHB+ z(00zPeoFr>NrRCwH4*oRkD&;+J5bAWrCebVWNAPa<>e>hciTH|^$nlL{k!F*IH6Ds zAXKga%6!$0>xTa0{O1J}`+3@V0ekm`6bFFv59WytJ zA-^uRqKO29^ogYlikGJ;t(mgiv{wa@Juq?iK+?!G8k4@Y7y9UpD`c+CGA-b!pCXb4)FB-U=#j@J41mj$3^KqPDKuGdwD+=RU-IG?$>M0 zGc+bwV7BE3TT->))%$D&VKL!y zNOSBmqEy`~7!PY{7Cb9+dpHVLltnTut=0}A{cp)5AnjbT&Y+JPBh29JF+OLk2h ze-@67;Uj1s@<4agOAqp~0PES!_kt+?=KCKYCW$Q!Pyd~O=h5XPv|DMf40R>*CD)yu z7;mlv^w+^XIZfrD*JFRhHzF?XV|oy7t%t;J(+Sh^ugz?pGG;pO1PUD8lcxQD;RU)&mO%xLwU;P(4z9dF;0}kK<2RS*9>!d zTim`ID}k_;{q!O%;8`ObwaSSu<25xC>~D`EJksp+EAw7`vrO0!`B6N%RM zX7|i)aw+B981LF7^IHiD?TJg`<2W+e-Wcw>JwI8tRiCAFO|Ld0^2yryG+56^I@e1k z*Im)9q655JzGYf{2jw=q#2qa@xi}y(tbtBp6fcjI;B1`o`A*D~pzsHUez}eW^4c$p z!`4^Yc)LVRf%fphc6>Ps*i#QhgkWF+<#vL%D~@DpH+KLyC#&9qjOmU?o~CGe>l-nB z?Wolo3C2xN?23QOy~>*i(8NH-xA|!xKyRqtm1CW`1hq9lAL*vah5QUW)LM84(1BIj ziH-t3=? z2f{R$>Y3k(O{Ar~gv1h#VM9Ehf85ublCH+-m2oF$prLh&56a|y`py6>;>CVu5;QW# z47$8~tmy<&zO*?FWhc6*_G@tVs=a#2?U6o)ayl(Tpu{4){HCTYMTZ#Q4+30;WR01= z)pGW585|9i;-ros4^(3U-~~I)_1)F~Y$;m1Kk=fZ%-$Hd^p;is-_QiCDCp2!Qh^c2oOv1Wouj9ie6g=kI zhlrY+!L{GIEv5l!yNy*b0|6tyAHWhgaCSK<5nHBBYc;J#vEh@Sr^pNG3Cy!i$<&9* zfya78x1L)4<3L0koBk`F=ij-&B}W9h4#PTA5~tF^)v=^=w;)OG@>4iY`#w9|)7VIC22Pf54AO=8fk?0BQ^w-{y8vUtx z2_0zvd@)!)jm)XUhwbRKHxzHq(0k?N$U>xCJ*tU^(_VQkGbLHQ>rXML11duLSsa^da1#QcL}JHfQX1>^ zmB}mu1zG>NsPQfJFd<;6=5i9RT&Ma;D%>>T5f+iO16TAjnNm0Qg)<16?k>(qbySTf zc*yv|VyGXEaE4sPX?ed55;9>CKT&Ut2x0=gfgDmAs-PHyB-c=ecM<6rsz>ZAR;PMh zd~Cy2H3BmoaQ11`;W$DE=muDp+gRkOsbfpj!dyjWw$j0^oh*ZrD!jI(6)49}sF<>A zGh;}RB^Rl?e1!;KXz5fhE3_f@M9-=hx!&A+)lxIIEg@$(e7!{*rjTGzXMB(LJYcCB zQ8it=(MtdYr1zu-p=`OY_DeHw!`sCR=gQ-?IEqUgQFz0G7B#3%2-+^dRAWt$CTqs% zVHlaCX{hY^=M{pd6e}Y$#TELwh@!(dQ7iA^u7yO}5+&yPrcE>>B2I%g**mt%E!&DR z@p-JHZ4rb#k@QZ_T>`|Oww445GgvRzR3`g(0gd(p*UJp}A82x1 z4V%`%)5Q8Iucm^e+gH=9szz>vM+%5k78?=UnL==ymJ?qzCYxD@x9cXGOHLT){VcFH zQ6P)j?jZz#AHummbZ5uOF;{8@e-dSn*<`SCNV)JOTprTRI(#;iel??~Lrrtvc;N(# z{-n^N#UQX+3$g>u(Y)KOMS%;6&S>`vB3rynNSX<9TQI%1`Kxg_=XQV47Jk1Ewh`^W z_Z0j&YPg<#2*cXiuNp@h@WXV{0=9M;wmi)`pJft(9Dv%jR!=56jD9YKJ9?3OYD|4k zSK5z|&>Am%^kIVuMd?{=*&XMgU@j$6AC-?#K{rHD+De`}6Abt3U6ijFJ8yaHc8?Pn z#S6jui}R@J+}DI~2T3uRyGLLoS%s>*h_$7K)OqTpgSFr_FdwnmEweYsv;-z`9&>GJSJpPTq&P z%({_Uf*ZqX^g63bMIl;XQ!N>%y2}9_&d(pcw|~WccK*(smKDkNCuNcHAp`T-5j=VC zeT2Qz7IxDkzo*LqH52yyLdDZgXfY|VXpBppGwmAWg@0_(9|znY4B~f>e7FyL{=9fz z-s;;}x!UhcKKbxr_*%+6j%<)9c{GrUuUfETmu;F+nK$nnCS&l6Lf}?nZ*WBeNM^#`}u{WtEr3`%@$9c@angIO#S=L#a=zEA?2R}_@ zIe)-u`SkV5GW%?EUe>tHI3#?CwNmtraIjrw7KFnpQJE-hL~I-TEGJlhBcZ0u_pR$h z+;3R1SCSiH`(6f6?07cXC5ePTMw`G%P-gvi8U^VUQSUqxBfO+m5|dRxg@wzv-Z>br z`U?|Wo>zjIxFns)MQRrrEo>m>nb7-O9&psV!GN>{Pw~_z~M-2htHkAvsWe6A2`|l70h6%`>)@M^K^lZJ%EaRMoGxJB%VDPthAP>=qMtfs z`>M;G5Hpbj`8wGvee~V@EdKPZArZsUG>ik9O(p0=xMZ>HKS*^e@(ChHw@G%X;G^ThrPG1aaqXvh zfvz`etlD~ujZ`uzXW|kdQHMba1Pfu+@D~D?>1k+L<#`TpUbGn;ZR-DJ zy2610UnRQA|Co%zR*+}-qz1Jf%7S!>XPQx?a%94 zeqhXWnAgvawZ6F1%Kfi)?p37k3m{@EzS3y6UXn}qtu)B}mlv@E%gdS#iCIHxCay#b+va@J>BG4q4Tj`|Enm1Fg4cIVK%dz@0X?GWg8l&{O0OsYEhM0 z{ePpLn}weWh$hl{SWrTo`tQkXPGGnpE?Cg=OnSW{x@d%s=khQsi3F_9XjMb-fIw1WPv@#e7)n{g1uvVEez4P&h) zI^8x;K3-M_91oB4);D+HvZdps-vbU4I>4fMOzCi!4|dD@rWfEXd&RUjn~*x12ZI=2OF=B#ulBM1UOfl;V?6!MfQltCFCr ziFKq#kSoOx2uZzi3}60&eXQt$FO}f{DRGY3b=W#?HxM>`IbFUtvx_kXC$%LuIsEG) z7qL|8a5PzNr%vkmW*UH^PbO`ARe`1}tLPD@o2N3FkgE|=u!VK(nz@|)z&+3fHIIt0 zZ!qYVBodja?6!UzK?(oY3kS6bxl9g{DKCVl$aUBT-gIqnO2>vH?Bg}YCqSwp)~n=y ze}!1iA?i^OwRDp!3SMN9MK_H@yI`~YwX8Y&LW8C4j}5oxbAh`0p#}|yzDU+CGl{AG z+usFt$J14uWd6JsIc{Lekg~MGFuoOAvWF(-KBJefBw9rZ2|MyjG&U(za#YJLv19P+ zWg+ez-Tv#-riDw&$cZ_-jAX(a>Q&`BFTZ8p^S8TO86$l7+!8=ivT`$iM#Dv?%_h#f zc}p#9i`eG(_vI|17uV$vsi+g$z|8Uh$`9{~yv)yTpK6|!O)s`$7OwWP)JyKVjBnp= zgUl=ytN`xTJAqCmJKcHY7UpW#U=NUlhEaHnW%{E?Q^~X_0z3Kwj>Y~Z)9Iq*0xQ&6 zm=faFNi0Br*7mNkU<72xr)_6j;_SZD19eo2 zf3syT2-F(44hbnI%0WK=L18VL%6r&LbGZ^tHRzyJEK;jR;Xr!gloClaj$D{R#yKCL zOc~Kn1;k_=t+q{E!PA0aH^RkwOg?2hPeJcRldjE-dd2?8aV0Fsl+OcgCtKL!-6#cw z6q1bC=|UEo>6W`Hx@pGeyb2+!165%R)?g$b{{Uq?8a&BBLOgKDr=`0&ZdY z1&BQFncq#JwIvOTmjJ(YxoM#) znpM|I!FBK+{E9bPw?;3D#lIUyWC*A}xAvqULRKY(bdN!md>3xosVoqoM zQ9Q%6d3!KBkrYIzbgtK|ywpcG6vCzrOocS~ZE3Uvhf5hj*HArq z07kpMR6%1sP;nuM?e*_R9P~jUGrEv=_I!0}p)+s3rwxMOYCGa=lW@B|Ld-*#EH?2_ zn|SdkBwCT?9EV#pC5D=^D4JD||6IUN>~2LTXq(l?MRWX?)HIf~AH< zt`f%f6t-(R7^6?Ty`7}5G!am7@JL56mc9*QHneUYzY4GQp{FyRofiUguqf{R zqVs|6=U5mVM^M_G>+r1WOA@xI2t8l8IGMP9_O*>R z?5EG|ZYMoo9agdRlb?4Nvw^obQ!z(7gaAqq6{IUS%S~k1mp=Mwr*@y5jB(<%$Wt1_ z2Q=?jr0=(1)7%%uvB33j3~&Y(hF!+NJ$z$sQ^_+ZYv#z8twhQsCSJ!OqhTo3aEwx1 zZTbcqG}|wb)xubO(Luwke=UM4Cq8&!s4!nSfGD8x3d1n{anf=AOhHnjN+cN}zcn3yZW zQYlOg&07te!6)lM-wN8U9!0+$8a+)M8cao6fHfVkwkg(J?b^p3PYg+YUJyaCO@eRwIxn0on#=%R(MdSJW61pdSD zh|0MHc!z-l?b?| zGJh0G^^}i8CvQR-Q1B3$k%dpzI~hX4(#gXlzLM5oRa7?Ho$R4k z38szYyc@V$td{%y)+&x+p_EY|{e`f!)T*dwD5i5P4f;WCG=^k?EjUk!boA@!#O<22 zsfopQG7Ie6+Pid7p>ZOA=_Z=WzGClKKy{-lHrIB?)F&EW-ss%68w-caUq;?y+#?Ew zD+A74KC7*bnykZ9{N~Iae+#pG^hi!pH7jeC3d<+j|moTwg%Pfy6;1EXp6Ov*n&O%S96o+PcTmS(?|3z^HT$x1;}hFkt(^L&4kXSL&%pS z<4poKK%u}nM{@jj%J1G@6mT@GQ}k>6L{=^tTTBLort)&zmX>A;DQ%&QLj2BbC8~SK zX0>k3rl;}hn9@W7M}K4gh^@(Kaf$hj)lsuNFqMW6a5JJ1TK6j3M#5b(KMS*$62_)4 z>xlc6YX>+|fV);R?5;YYhDSafd{bzed0Q=S5ttp1HC9Z6#0JY$I-msCEx|ss3FIgpi!NO`7 z4s(c|#Du-ba*qX;F%J_)+7Uxl>qse9nbG>xz+MVr6>(BR%O&|VhrM26j@||lipGgv zeKJ3u4etyby?-u_6#@m6ks^2OxIt^Jr4S`)@k)0N8WIcP$+tpj2*pYB(HGi=zI5YEgz z$VGgg4nEqyf4jeX3I!Ut^NY~0zj3tdex)W==5#43&S|pkkMrAP7aB|KYL_DK_56?j z+}_au@3Xt?^zrJJRDr*zIM9TtavjR;;1e0Kja!aWG ziW~Dp!xTnK+-62#VT1=sl8 zf~T$vIHj|^j{J+>cj;>J7l@gYrCsXg?g&?pBBvSMJ?=OCq5Zb@DQ{eUKB{*o1B+ps zB}&YWi)bZ_vPq{%7b`n|-M4$&=lai5Wo?ar*5yuWvblCcnTRJm1B){-ZIHxPK*ny4 zRI)70lG~rGi(AoOK8)aTyhw%FQ_%q-!YN(xe`>k+%iGQ3dMRW>_0K+zpOf2cQ38ob6ci0*A zE6)^V>*{vO&(~ruLxU8~KoIXHn$cRA8tl$DxFaHzLdiu;k7`^=uZvtw;K?*|lN6Ij zPOp`BlX_G9W=1bQ&S7jWw+aHYWO1FNut5lHr)M-!Ce`f4#eSI!1cI z?bGTC>RT2Cqg&DDLMG(6f`E=Nzq_c&hXwdP_ret$72bo|e5@y`=t*^@!Hz+hq7}#c zVle(*R^ImdrFk88^O${Z6(Ulj+-B(LL=8_ZEVgsSo6-@(l7^U;nzhxJSB)jZ_UsQ85NG=Z)yRNAf7A z!b{D#3pjed8W>^#6W`a5>!N{;$CA<8t_S<`6j3b6;)KE0N{ODh*#zl!az$`=DB`aZ zxrh5=SSyY|(*nGV~DM?XvFha@R7xBF1h{w(&uA z5VINfiT#7|{%w7;Wk3n!VHl$x#?L1ZD%cuDE=&03e5hKJB@yp;xeeQ>WOK#+f>O`m zU63%+j2<50yCiC1-Q=P@CtR%H9o#DT@!Gs=3CCL}kvwDZSVo5;mewC-JNx>YKRUsSS*ci%_LKL)e-AhdG!w-sFc4-Cou4 z>)N+6@N`%$$Z+Ad6uSlen@^GIqEPl9L2%~JXpnp6rXYIn{U2Y$VOEfr?O$Q+DyBNN zc^J=cEM_!Q*5kp@P~p17|7NAhr5U&_P#xZuU*$YoSsuOx_M{ft%E2&u+rAVMB_-{4NlsPNr@rcK8Ny?e zmE_d)-`0E!%+9e7T?vqZiE6V!&RDYKv4Qs!qnJ0GJ4W5VAq_z48*c}Ewe=(jwP^U0yQ1us6zs^&Gmk_Cn@(4~H?9fYFxOaYB?3|qi~Y^0Qz zBY*nmaQ}s@!)3-az^-6P@BMe^r|xye(8yUo!ems|3@kK*XVr6D38{3RY@^m}g` z?@wq|a%TR=9yD&*N(&#$y%%WCgjka)SpP&xNI2LPcfZ8(0-OdVeyti z7W64b!AL9vSjc*N0myOJJjbO)h4~dLKpLKGQgSp5+XhQ9qFv9}6WbNKwm`SW7lxnK zOWPNP&^;W>d@1-Uk(12M|F}m&We2kJsljsh(U@!Up&Pz!B%LE;s_E)tsQnycd_71Y z+y}56VL%|!(3s`3bTFno+D8G(PIx1FhTL6JsGVEYT7|hK&YXT!myb^mVKF?fAkTGv zC<2PGg(2Gd(aZwcGytJI`aA0Vw&7W?R8@rUj%Z@v=fBMz+jYE>oLc4ikxg5)EZ zpJnl_jh!QOaVlQ+pSE^SVGT8TUc9wjavUkKreX|s!tdCD50?Cznrcj|4bn9=#|*jSz86b2KOaDU?n zH>^O$_r&13kxtSo=@&>k&c8s7Q1a11ZHQvW=&Ls)rRPGzN}N{~%M`ASYl&x@FBQGeo876A&AnZR0!o(0ry3n&@G zPBPB+hmz@Hto3hi(2^uP1dVA8;mTR-@&Jkf%oLGR zOjk~`{k3&!9mQ|=>c*rFS*FKK7`+@e)Fwr!_wC^lhHx9iZB{GwQ1yu(CpOjfjkOgK zm@KRn=DNLuO{Ed94^400zTbeZtLW7f6m1QHQ>3|Z3wzsZf#&fsn*}k2Nnm)qK{0V$ z0Rx>vqV{dk#0ccB7U|mJg+HU$C#E&TDeCOy2SM@eI_4|IHQ^$%I`K{ObT8}*gCZWi znCVuxBO>)(eY2hLlBr##YI3nH@O44N^{sbR5*u}A!JGpK45-(RZBNvN*9cbz#zoE6 z&B?a+hWR==9ZoZQ2X~3zc@T<9@D6fVkO&APZbneIf-vm+!ovfk>E@uJPWizi%}~+? zMaZgAmP$u3DpYrnN*5HIMCQ}c4s1({mjn*@qKbH8hBPpk#*4FDYp*Jxz{oZGQCW!C z9k+Ep?3Zg{=Dj@wt^@8Jz_K&1M_T8|Iy->1YZ}74nAHG<_phuD=>-^@N|L<}9G;iA z!LhiI?4yEno?E`!jbgv<-?HD8-`ldErnssUfP_5f-q5BTw!$mek2XjyrMai|hY9-* z9GyKj1c#I2O%k=4TP$H{!*xq?Kbr0oa%5sl9%rn0JGHLpx{L3`#xOdtP`2sWWYC3| zuWyaE6e}fV&=nG{u_cE!#y!|MT{#1Td>+Ze5uZ7%Ny70<#e|b}O>_<$m;?jNzCJTp43qF~Q%ucf5(@t$VF8 z$>1qWI4~9eE7{>a4zl!wK_uq{*)#LO`U?3YeGYc?qKs^+oVy&TRt^U%6Jz7P0zhph zn^$zPmtCCEuPDgfUYq!2{>jtmNDdqL~QJNJ3F20uG!Ty{@6sFq(3^e854- z-l9&~9hnNG1hLwlo;z?qmahN2u#Dh=EXXkMxlTldN%7&OA(jJ+z~hStKVH|AdhKW3 zBbk@>@%3{1N^helA&K|$wQbDgXsg>Z!O_(FQp)k`_4@1PnEV*3e?qi9Mz^;j_Nz*4 zYti6B>nMl+_gWl(3MsxIN?8qZc!IaV_YU}v%(x@*&lxF3-%Lu7+kd+&3*~&h#v4Hn zyQBBz0nR?-e^(fC3t*d~o!FSak4qRlZCx*)QM`BcQN|D3t}yUuYY;)?d$_`hOF&PD zPyq9LSKq{dK{;5H4$l{9e^?tR!YVs3jsVv(Gx3*uu{4j7(u7VGD%Jypjd5ixP{m+oa{%<#2L!92N^X4AWgbjj^R4j`=`9h$9xfRQ6$ zbE$#pz~{GLW%B;EbDQ-~-J(*#MPD$RlOp1>Phg&^vWy-sVi0=K^ZcEW+o zOarRnU6XY7Rk1)L?WY+KhHl`a{>muqIVJ~9=TXS=CI&)7SirTC1~uWZYyMeE{}%NQ zUmUEhCj5JT)iS73p#TcWbQBmOuE(~yHX2Dj=6yv!U!erkm`#EoNJwrsWd90$`INKZ zUJ6P65MsF+FEZoT)|tM&&8)-U#2XkaXl%CQyjJ(_QFY}RT3Vv$hkUJki#-e=(Whi9 zJIoIt#D~UBY?f_^W_szj_?cOQ2eu?L|9l@q6)CE>mGl0L*tc?Vybij{A6Vv~FNX!FeU&Q85spZdgc zYnDWyiSR=iRfIxJ{LrFbx+@>Z6l`#=ejCv5=Tt<~4@9Id~&- z$oAKa0bgGLj1gYYI_@r8SC67R4G9^RHx3CHg#l$^R<^fIQ842o2bKis22}z&Ua(b@ z+#llhcoWGH_?b`-Cp`I5^;LcOie|Y`bF(NnNzd-P_*Suwd9J(*m#Cn~zs!}hA();rxl|IP(ret48@g zhjM(V_DiV(_mWEhj4H$T3d=hm?nMlZvz_MYa8AXR8BPqJ}6Jy1{U?s!Stf#6`L`YC4#- zgeo&R+p)W0`75st3-qfm-Y7f% zWNg}qPvC~I%_qQso=TeOH3;B2y*h+hE_tRk=7Nq`aPwEs)j1tN=Z3+!uT_7bSgGlI8*WCWp^OptG#KC!QLX}sp>&Z8WqWHf( zdfVQA+XZI+Nm3) z1$P5|STm`#LgDm9qh-nnCyIEP-kK{Ggr1cd0>!KJ(z5x4Eb$(VUMI?(OBVNMg z;73%7eRE8!V_59MLkNcgg6-j{fc(XU%U;4Sd+fIvwUWNBwv7eNj1wY03(7g@_o>A?o}+y%&bzkv_1}Hm%D!tn4JgjpGF4eHp=9z4Ga}yZ@hC9 zwXmdSe1AWBmB7LMwjAy)B?f)24*Xbo9>*5txveWpnx4wA->n=objl~GJ-lBwRR9XU zI<6*GvrG$RPd|SP(N0_*g5Uv-b|LIheli6gOzY{go75wnpLIQt?`x7sJGDD2(SskD5 zb9w7_yW)Hrp=?}bBZ*3RfXoERcfnH(bnTXVuw-{9Z2sv&=rl}@6>&5Ba-nqYFFQ27 zY^nsL#ZOCg>ZrF7cg*JND;h8kItkVThWSBdQG#G83JUr>nC41Zt2dN7y|I8e1TDe+ zVJ@1J@gp95iuZ{b^mN=%z`@xmm*fYyY(kkmBEx&I z?hiWEM^1#qPE_{AbmcPhCyGgChh=GdCUz!@zlL4J5}^gfOYh8Y^Vet1vRxq#o4Sc(;yvv@4F)49dV)VAc@~m2{CO^GI5v~ z9WO9oQe9T6?o`IB0a~I^P9ueBkD$5{M@?e17sHl_LZA6}{F5QV5#N7g_6-GZboCEw z-f7%e5-lXpgRJ$K*>7H3euMn{e$=mtZRbDGlzCiP&M))0ZJ`L!b@m;uGZngJPNf3v z>x5wPl5mW>)1TIJa_eXfpzj+8sZF2WyH8qZ{(26!{%h=cA?Jl=Q!_sO*$-+^>Ra&l zJ3T4wox=ZGUB6yb0Pa`x>>hsZ_EpnqlaCBmjf%|Tjo~iQ3AdX!P*JmfB%_8cNb)3eIL7Y9Y`s!e|VPKu57d} zjzs~70vMf0rZd{l0Y)n^c$PRP(j*>abtr#2b>^psP+Z^bs9>FsgsJ9PJ9 zBSXPe2ek)my}!3k`G(^EOL)-*-WnizL3nK)CqU%-Au61*bq_d3waf=9o`Gg8HtmqE z$`rBv2>LcgWtS+ieI6o{g-unUMl>b?z?pA7?j^XOeVh~%dfw&2VNH3@rIxhx-J85q z9wl)t0X8=&5hRDaWY1O=u}XFj#i4-^#{#{a*G-_|>e(#C-i(ZpqffF;KI! ziF7P+R;@S{3AO3it6eEA5N*^3KXwAIOYXjBtZ1JvMDXZC!3}JUgEsvYnK1i)Pk-h7 z$*|WXSS3jBX#!9(m?owHC*Ro1*|xg)s{y$1VHTF zwI>c$!K<%Kd1#HmU44Xy66MEB4zvePIm_IvzV*jzqW&iaAo<^ML{UWB2Xq(B1SQNE z^!E7C0K*a8HAh>lX>eK%Czf>Qvpehz!L7s#pIYopgJ$rXmY}WG$2@dI8|3`7=UBCs zBIhbWB^=mIa6v8Ey$u?2Q^U9qUy23E5VjOApY(MF6%6~j50mBi99AHGIIz{&Q5nlp z?Y3=N9EoY+G=pC2kvkaZHRV`>4Iu;qUVTWWE%WB-wX+_N+pR5z5?kMuS>&oYlbU^Z z-cP2(_{%61uK{h&a#d)G;m)axdP|qKMAdi81)Ftk-YH8A%M7#DYwC;pkt<=AJao(} z2Ub5N_?l=Yz8amU5FJLX-iDYdE}PjC;p0c4?KhOouf2%xcx@X9>kE-Ax5} zICtfb3w~U=Ap8ioM5)zlC<2qQTH?Y5vQ}+YfeFKq?vgMhT+&6;PF!GaDmLj#K0BKf zH<@*nxR-PmI(KRbEzm}^{W9jm5X_5JVNMK~egYE{A{}QW^E!1<9ixjwu?`NNX>DBz z!*I?wMv2PM1l5a$p-AV$upYR~ZDlSa8_I6dXiy_nA>%Yi{K_0icCC^$6u;U=90b)P zGf}Hy<}KRWH07FutdBLqI8-GxMVk7P8yc6ZUlxP?m%D& zs*EXC1VvHJ@YO@Acsf)z=4{kJIIX6%5-XNbIlH+?%$mvC0^4eM85=w z4PwN6Eq=b8U-M7`{PwFM(CkktrZi(j*87i`u2fpX*<7O;&x&y`E#mCv8?5#w(50eIh>oJWcKVdQ z;cQ!7H<8rZqL#VVt^4wXWgDDIn8KAxJU-BsK_Uc+N592tx$2gp zWtYqES}v42Oowr4$1!(a**@vLznF7#gAbD5QU%nlZvRMP!?MWb5h3I*b%(7Z2sv6u zCtb?4ZcjQmxV^b~$HBjBMO6V6x^=Rr7Y1Ojr{6(KU_Ld{DlyX7+)unu>~D+{np*W~ zwbC~Hq(&Vz7`ByBC>?1PM)4={u&dqxqi{2UA*w0iZ}% zz`YCF%v5a}+Mf4f$5j@?9H>{Zr#xAs&9&E>+<3yinV_@Hn4663y_ue6;=Qc1h6yK z4WupmA2`b~H_?9%=!N&f}Y)rfphA{|0_*WR9f8(+)TP|mDeDRj&mLAy9xAeI+v$hIH4C^`v?-HheU@90J z=z<0GN6cpC8|LB1Wuml;wor6V8jygDpXL8r__q#`vix~nm`2n1(kFc~!$t4F2&1r~ zK%(mgq}eeFRKg_49?W!ygwm!nEpt-iC$l07*yqpM)Shb#`FBWX8>PW~~QZg?hlRgUnTW0dr|!L6lk}0279C zBBQ1;6GHJYYrN{LVVRb|IZnAPb)P5Z>HFI_k&8W^;aUq5mu{DFZ8{_uciC&;*jB`E zW`A>XX}SDYy@e)xn{357?o8B-p-3f-Vx~VH+c~1Z^&F_XhHx+r4aJ{4U;hn~jlmSo zxfW!#K0?<#UB7G9A3cA|cpjwXZTs_t1gB&FaNx%JC;ZA@x7_7y7-0VMDi0D{guUC! z`2EvHjZBX>7`UPXd%nes8xvx~Vp$d ztl>reYOpd_Qb@OZA(OI62=ay3gnGOgvU+BLeALTbQ}q7HW|jwKMh;pO@wl~~QeC~w zZs`R7#0!I0w!J+nN+bI<)NazbeY=y~O=*bDDD1mdDBd6zW7lDeXPNy40Pk{K+N{&$ z>i6CXR?PH9!MEO9O`gWbg-z6{^q>A&JIX~XXP#zmfmjZVHQH>(eWz#Ed*r47`iVHK zjdMR)WD~zSnpPOA=j3K)%e*rpZ2`?@%|AsPEP^R8`=s^{Cz*}dfBrFRl_8bV#FK`x zhCgi^l7H&6B*Lh^15pmPEYQA|-T7E!*D}^vUL@V_aOSpe$&3sZ4Vt>o7})v5j00nV z595JWW$R>%V+Ups?0mzSZdH?}5@EfxE3S;Y>>!J*>;1D4m427yv%je-NE)Kbe5vzNf00$cs=L1a+2Qpl9bb~UDMugd}kL0;{! z#^3%FPRQmZ)>gXo0Ek+l0#(3WzZ$)oZ#ByV{_u8x&FusO$g1necT`TLtb@n8{acT6 z-bYxLQdU9PXk&vWF8wRG#s}`r(Ijw3V-bfJ?cZMF!Xvd3|C@l3HeOUK6l#&TkvRVw zFV#kHSIPGMML1W~=zuxtzY~vNjS1Jfivw_a6#&&_!)pg?8-_o?&Fy3>v%P^U4fclG zgReCb)tS{qWAa1$KX6`=rBc7>AG}HfS*_~h!tUvChXjP4C+aV3Up+Ge>+gw$J4%>a zttXf7T9UvJLhB?j?{6u)jho{&p@hs42!qqYP=kQhn-^9@HmBn?AdvSV0*+V5T7{y?*Cc zUW{~V3C?=ouK_6Fv(jukm5aF&ApYMpF%5hz{^i1u*68fHiCswz-KfB-d{?@87bDI+qy%d;{(#)ubSRCBUMm#OPPE3x6{Af?Jld@ z>rgMNTBc@8t~`8w&;EdX#>9r$>A~OjOlKX^HVR%J;9fVL=OeOtG7*Qy3!d z6->gTG=S!uO_v=z1(f7EvL}hfjABB!XnQ1mkp)jxn*K z6GR;yR>bJk;yYm+_JTN~PnA-yQ|)Xe*QXy;nHGp=y*<1K|mtmbXJ z#1&I?!B5x4ixvfVnIMkfY>F6@oJ9Zf1x@y;`ZPhyM;CiyE7`B?R|S?c^nLfz#HLw^ zYM5eDbR4a?;bsH8w4xmScH;F%*N%N0l6RvzOVKS^gV935f<=*F2 z9P{4Mo$(;UzdW)t);`p0+Cvezvny6XMRQl?Z+vx&6enG`Kz5+P&R0;n`xGpNC-Di7Rg%=#}?vL(D?ApCYF_x5I+?%l81 z$6T>#F_MIQRf%Dr_R%svC7gp_k#_U@X;K)Ne-$pxZu;!NMUCaR5k!b)iOQlXjarwL zJG85m@_w`!^I_ByF!%`fR+c5}Eo(@!UHeUK%A67dpDhX)Bf@59PTqCvAXj(d9UBpY z2_*fOXIpGIi1OH8jY8w20uf_UYml_gd1uxgsiE^2q}6g&TZM6L9gHOrd0Ot7TA?xf zOCK}#vD}5>XlgcGv1s^d1J&5|zn0q(OpVQ4q=KwN>4XWXxu60R)etV9qWM=x5y67R z7OIQd-S~QhCLQb=)}gizoJId;twmN0@v)v0^S#=J6B~Lizi2#$lxOn-1;1NO#rh_b zP}o!E@m?mav5*G`o7(FR)PpuP;OWMic3(1+K}sAKyVNh6?%K;f`K~$tE)NCIfB%?N zt|S%vUw9+|`dymxEnRu)N95QPY(Frvsn>;h6#5!7DAA-`D`mkI0-$bWp>K~*KX z!+hpHn7;5G(Ea6BMYb**45Ip;Z$DQUeqSMwZ>^sfIXp7(qfKSVaMj*0(g{}u6?H{+ zSh}STAH4iOUV6k0&xwZ83cM4tEZ*E5#qEDwGtb=Mih=QfBvtJbK*qKU;I zi!1y)(qJ*5R=>Hxi{ah^v)_t>+5PgJjCD6lX-puagxqL;j}hkDKnDE{Ln#r}3a~jG zV?=roCRKqT`YDR*5@Wqoca@UV8HX1WgS?&-77x13dN=>nju-D3n>1@xqu>WE< z^-d%V!Gx=b8;fSIw-oypTh`BcTxMd7{J{s4w&eo{Uf@xk4&}36+;LQJry;p7A%?`n zQEs3n4S5EV(R;}>yMY~fAcpd21BcqzFnb1m?j|?_JC}tNP7jT4Is8pu-tyAWQJq)s zc095~;PvXRrt2vM6z*E@ShsE&pxmc-czrc3)?yu)G6m?0EiD0`cgJZr#nX2xZtAY- z48uQGHr`Erxxy3@0a8HS(`49Yd6OwcfEY5Z_>itP%tLurOesrIEt}7x1O%ShYK{!azQ%T^OwkovTN-`x(2*Ll&};PRPVX4o^7293 z$9A07`SdPTe;(K8rD5v-^<52kkel2rlx^E5nC9lpwayDE6Q(qyK})%DjuCwA2jB^( z)Yao4!^Xszy{BDC8uN^#(hBqejU|j>($Ui;Ij?6$Y;EXyE&!tt!DFu4bJ9mJ`1OKKI;HrC-j%K?H}XbttQVe6dKo8PxPP*#a^c=z9GmgFG_dUR0&$ee@w};#4TFVXd&-25U zUC7<8M%UfQF2|GyoP)jlCTE_IcyxW{m}<&BS8_G)%;+!HlVO)l-*oV)S(+RIe0OF) zyIkn&W zZU1QQB@q16XEz8hPGfZ{%3Y;b(O0=>N`2a;9it>y&XFS>j@)_3`*`Ty-A2a<$?c9( zgv2gmrR~|Af_Er%b6#%D)KrXR)Rxfb1NEvc0rMn zGUTRFilVhw8b=dppNfJ$#57W2-}HX%C}psxQKL<-y*^VWOg)ADzQ|yZHFr}Us@u%; z_;)b%{=-U_qTS3_9`@HWJN!MztWU~Q-!5NqyZqE|a=K@sYX>YYCO>_F6h*j-ig_|* z3k-g$3I29UKD=c+Oes>3)b6pxGrz@ZSq)z9g-N39iHt})V=as;1*?tM5kPYS0b7L~ zBfEEMYK!6$O;R}Id>W)r`ufu8C}$a%g$3vSDkj>xx$ zhHjS7MyW`Nm#*7yTr$%^%6!{cU{uy!5*+9*&TD<|o*ldm+i}l(HDu<&@h`u4!Hcm=!QO*9pPl&`G2vKcOdwP0ts4cN5=l>-RGi&}80gXM`>e3u)VGm!b0SzXL zs0F4uC4Nmen+Q4w2ApdzYsNI1*&5Z>L%Pg=;^rLtf5{vZ&}JfhW1B`(np3aIZfoDd zX=-aJA&hxV^CCKbHAf_8y*y&CJQ%B6EYt(1WDqN~*Xu^fI@)64hAqQjBVjzW)ba8E zAAek3a=HB76FTB@tt=QL=b!7#|KUGxJ>1Cx`Zi4+puWHaGUG4vWk1=rGh3gJ$=RO? z?EC*)#r2BNRi`$7lrsGzj(}xKF{*|G@_^K3+7h{|kS!WU)#A$AG{gYl_xTX6t01o= zV^;N&D{f+czevop zR~UPce-J@zlW|*rxX>{s&fnTR7SCW#fMWx9q*kIW1MFa@C~@W z4%c)zA-kpeRuhWgFhUVNs^mUxi`A)m^kg;iZa;iI70^Nmdah?Y4r$bE=MA9`p*7+2YH8xQ(ms-im@BD*Zt>F7JhP9OnP7<;Ps_upcWG;oWFm&3Psna5~zAI;WI&soJ^XSLr1@VWX>w- zdb-TN5HBQT2r6lNCx7m@@S3XXNDq;q-Zf3tPs(v>9`pHpuDn0jQS;b#zUmZ59 z$n}4;hZTt4c)Ff0qRB zm+Kd+vh1W;8q@m^=KrsFN%;CI6H-w%-7qcNaXmi>zm3}4Nt)$FS=CM3^}{&L%ew8y zdEF0y2ouV-j+##YvjwMOoEN z+x5dZ&C9y&$9dh)`~3h2!3c`s#81mwqZyXt1yPcfzaR2HvTm4`?YN#Fgi)NNSzeS? z-LzdljMKcV+kTwa{k-1~5hj#zA(b}P`4CfHlvUldT|bP|ysX=PoY(!l->+m7WKT~9 zCwn9M*d2wSgkb}1yfXK@oE0kP%oJASmTk2~Ia8U?v%J73&+|M3@d9?He@9w{EM`I`t0w7y{wC2We#LV+Hq5H|&mcT4lYrHMh#k&9C_H(!+Hsq!W@6ooUC9!v7B{Paqp8z_{iKJf4_!?Lf|2_Z?N5QyEj7hK(xD`rctgF%ZKPxur&S5PB z(;}B)ajdWkI_Blqb)~Y!oNTdZU^#GJSkvo8`Ah zqY`K`_bJY!alc%jIrmy}uT-CpS<}+BqudreA zS`|iEV3A;d4 zn$x!*c&n+r3=kc)984_k6~`m|=&UX1@OiKys6-wQO_5{A`6mDX0GN(7WB>pF diff --git a/src/types/icons/font.ts b/src/types/icons/font.ts index 57739f1ea..8f49ccf13 100644 --- a/src/types/icons/font.ts +++ b/src/types/icons/font.ts @@ -128,6 +128,7 @@ export type FontIconName = | 'my-notes' | 'new-chat-filled' | 'next' + | 'nochannel' | 'noise-suppression' | 'non-contacts' | 'one-filled' @@ -162,6 +163,7 @@ export type FontIconName = | 'replies' | 'reply-filled' | 'reply' + | 'revenue-split' | 'revote' | 'save-story' | 'saved-messages'