From d2c54825f00c65efaa9a99e9d4e2ef557c38971e Mon Sep 17 00:00:00 2001 From: Peter <> Date: Tue, 8 Oct 2019 14:30:24 +0400 Subject: [PATCH] Refactor wallet-related modules --- BUCK | 7 +- Config/buck_rule_macros.bzl | 5 +- Config/configs.bzl | 207 +-- Config/utils.bzl | 167 +++ Config/wallet_configs.bzl | 58 + Makefile | 26 +- Wallet/BUCK | 71 +- .../AppIconLLC.appiconset/BlueIcon@2x-1.png | Bin 0 -> 7776 bytes .../AppIconLLC.appiconset/BlueIcon@2x.png | Bin 0 -> 3871 bytes .../AppIconLLC.appiconset/BlueIcon@3x.png | Bin 0 -> 6013 bytes .../AppIconLLC.appiconset/BlueIconIpad.png | Bin 0 -> 4276 bytes .../AppIconLLC.appiconset/BlueIconIpad@2x.png | Bin 0 -> 10649 bytes .../BlueIconLargeIpad@2x.png | Bin 0 -> 5604 bytes .../BlueNotificationIcon.png | Bin 0 -> 665 bytes .../BlueNotificationIcon@2x-1.png | Bin 0 -> 1781 bytes .../BlueNotificationIcon@2x.png | Bin 0 -> 1781 bytes .../BlueNotificationIcon@3x.png | Bin 0 -> 3428 bytes .../AppIconLLC.appiconset/Contents.json | 119 ++ .../Simple-iTunesArtwork.png | Bin 0 -> 162976 bytes .../AppIconLLC.appiconset/Simple@29x29.png | Bin 0 -> 1202 bytes .../AppIconLLC.appiconset/Simple@40x40-1.png | Bin 0 -> 1840 bytes .../AppIconLLC.appiconset/Simple@58x58-1.png | Bin 0 -> 2993 bytes .../AppIconLLC.appiconset/Simple@58x58.png | Bin 0 -> 2993 bytes .../AppIconLLC.appiconset/Simple@80x80-1.png | Bin 0 -> 4568 bytes .../AppIconLLC.appiconset/Simple@80x80.png | Bin 0 -> 4568 bytes .../AppIconLLC.appiconset/Simple@87x87.png | Bin 0 -> 5071 bytes Wallet/Icons.xcassets/Contents.json | 6 + Wallet/Info.plist | 264 +--- .../en.lproj/InfoPlist.strings | 5 + Wallet/LaunchScreen.xib | 17 + Wallet/Sources/AppDelegate.swift | 221 +++- Wallet/Strings/ar.lproj/Localizable.strings | 0 Wallet/Strings/ca.lproj/Localizable.strings | 0 Wallet/Strings/de.lproj/Localizable.strings | 0 Wallet/Strings/en.lproj/Localizable.strings | 193 +++ Wallet/Strings/es.lproj/Localizable.strings | 0 Wallet/Strings/fr.lproj/Localizable.strings | 0 Wallet/Strings/id.lproj/Localizable.strings | 0 Wallet/Strings/it.lproj/Localizable.strings | 0 Wallet/Strings/ko.lproj/Localizable.strings | 0 Wallet/Strings/ms.lproj/Localizable.strings | 0 Wallet/Strings/nl.lproj/Localizable.strings | 0 Wallet/Strings/pt.lproj/Localizable.strings | 0 Wallet/Strings/ru.lproj/Localizable.strings | 0 Wallet/Strings/tr.lproj/Localizable.strings | 0 Wallet/Strings/uk.lproj/Localizable.strings | 0 Wallet/Wallet.entitlements | 6 + submodules/AccountContext/BUCK | 1 + .../Sources/AccountContext.swift | 24 +- submodules/ActivityIndicator/BUCK | 2 +- .../Sources/ActivityIndicator.swift | 36 +- submodules/AnimatedStickerNode/BUCK | 20 + .../Sources/AnimatedStickerNode.swift | 85 +- .../Sources/AnimationRenderer.swift | 0 .../Sources/SoftwareAnimationRenderer.swift | 0 submodules/AnimationUI/Sources/AnimationUI.h | 19 - submodules/AuthorizationUI/BUCK | 1 + .../Sources/AuthorizationOptionText.swift | 1 + submodules/BotPaymentsUI/BUCK | 2 +- .../Sources/BotCheckoutInfoController.swift | 2 +- ...BotCheckoutNativeCardEntryController.swift | 2 +- submodules/ContactsPeerItem/BUCK | 1 + submodules/ItemListAddressItem/BUCK | 1 + submodules/ItemListAvatarAndNameInfoItem/BUCK | 1 + submodules/ItemListPeerActionItem/BUCK | 1 + submodules/ItemListPeerItem/BUCK | 1 + submodules/ItemListStickerPackItem/BUCK | 4 +- .../Sources/ItemListStickerPackItem.swift | 5 +- submodules/ItemListUI/BUCK | 5 +- .../Sources/ItemListController.swift | 4 +- .../Sources/Items/ItemListInfoItem.swift | 1 + .../Sources/Items/ItemListTextItem.swift | 1 + submodules/LanguageLinkPreviewUI/BUCK | 1 + .../LanguageLinkPreviewContentNode.swift | 1 + submodules/Markdown/BUCK | 14 + .../Sources/Markdown.swift | 1 - submodules/NotificationSoundSelectionUI/BUCK | 1 + submodules/OverlayStatusController/BUCK | 16 +- .../Resources/Star@2x.png | Bin 0 -> 6808 bytes .../Resources/Star@3x.png | Bin 0 -> 11131 bytes .../Sources/OverlayStatusController.h | 19 - .../Sources/OverlayStatusController.swift | 22 +- .../Sources/ProgressSpinnerView.h | 12 + .../Sources/ProgressSpinnerView.m | 305 +++++ .../Sources/ProgressWindow.h | 16 + .../Sources/ProgressWindow.m | 194 +++ .../Sources/ProxyWindow.h | 12 + .../Sources/ProxyWindow.m | 573 +++++++++ submodules/PassportUI/BUCK | 1 + .../Sources/SecureIdAuthController.swift | 4 +- .../Sources/SecureIdAuthFormContentNode.swift | 1 + .../SecureIdDocumentFormController.swift | 2 +- .../SecureIdPlaintextFormController.swift | 2 +- .../SetupTwoStepVerificationController.swift | 2 +- submodules/PeerInfoUI/BUCK | 1 + ...hannelDiscussionGroupSetupHeaderItem.swift | 1 + .../Sources/ChannelInfoController.swift | 1 + .../ChannelOwnershipTransferController.swift | 1 + .../Sources/ChannelStatsController.swift | 2 +- .../Sources/GroupInfoController.swift | 1 + .../Sources/UserInfoController.swift | 1 + submodules/Postbox/BUCK | 2 +- submodules/PresentationDataUtils/BUCK | 1 + .../Sources/SolidRoundedButtonNode.swift | 10 + submodules/ProgressNavigationButtonNode/BUCK | 1 - .../ProgressNavigationButtonNode.swift | 5 - submodules/ReactionSelectionNode/BUCK | 3 +- .../Sources/ReactionSelectionNode.swift | 5 +- submodules/SettingsUI/BUCK | 1 + .../ChangePhoneNumberIntroController.swift | 1 + .../Sources/LogoutOptionsController.swift | 5 +- .../TwoStepVerificationResetController.swift | 1 + .../TwoStepVerificationUnlockController.swift | 1 + .../Sources/SettingsController.swift | 4 +- submodules/SolidRoundedButtonNode/BUCK | 1 - .../Sources/SolidRoundedButtonNode.swift | 7 - submodules/StickerPackPreviewUI/BUCK | 3 +- .../Sources/StickerPackPreviewGridItem.swift | 5 +- .../Sources/StickerPreviewPeekContent.swift | 5 +- submodules/TelegramAnimatedStickerNode/BUCK | 24 + .../Sources/AnimatedStickerUtils.swift | 0 .../Sources/TelegramAnimatedStickerNode.swift | 39 + submodules/TelegramBaseController/BUCK | 1 + ...ionBroadcastNavigationAccessoryPanel.swift | 1 + .../TelegramCore/TelegramCore/Wallets.swift | 1143 ++--------------- submodules/TelegramPermissionsUI/BUCK | 2 + .../Sources/PermissionContentNode.swift | 2 + .../Sources/PresentationStrings.swift | 970 +++++++------- submodules/TelegramStringFormatting/BUCK | 1 + .../Sources/ServiceMessageStrings.swift | 1 + submodules/TelegramUI/BUCK | 4 + .../TelegramUI/AccountContext.swift | 8 + .../TelegramUI/TelegramUI/AppDelegate.swift | 2 + ...rizationSequenceSignUpControllerNode.swift | 1 + .../TelegramUI/ChatController.swift | 1 + .../ChatMediaInputStickerGridItem.swift | 5 +- .../ChatMediaInputStickerPackItem.swift | 5 +- .../ChatMessageActionUrlAuthController.swift | 1 + .../ChatMessageAnimatedStickerItemNode.swift | 6 +- .../ChatMessageBubbleItemNode.swift | 1 + .../ChatMessageInstantVideoItemNode.swift | 1 + .../ChatMessageInteractiveMediaNode.swift | 5 +- .../ChatMessageStickerItemNode.swift | 1 + .../ChatScheduleTimeControllerNode.swift | 1 + .../TelegramUI/ChatSearchInputPanelNode.swift | 2 +- .../FetchCachedRepresentations.swift | 2 +- ...ListContextResultsChatInputPanelItem.swift | 5 +- .../HorizontalStickerGridItem.swift | 5 +- .../MediaInputPaneTrendingItem.swift | 5 +- .../NotificationContentContext.swift | 5 +- .../TelegramUI/TelegramUI/OpenUrl.swift | 1 + .../TelegramUI/PeerSelectionController.swift | 2 +- .../Resources/PresentationStrings.mapping | Bin 134704 -> 134704 bytes .../TelegramUI/SharedAccountContext.swift | 9 +- .../StickerPaneSearchStickerItem.swift | 5 +- .../TelegramUI/WalletContextImpl.swift | 182 ++- submodules/TelegramUpdateUI/BUCK | 1 + submodules/TextFormat/BUCK | 1 + .../Sources/AddFormatToStringWithRanges.swift | 1 + submodules/UndoUI/BUCK | 2 + .../Sources/UndoOverlayControllerNode.swift | 6 +- submodules/UrlHandling/BUCK | 1 + .../UrlHandling/Sources/UrlHandling.swift | 40 +- submodules/WalletCore/BUCK | 15 + .../WalletCore/Sources/WalletCore.swift | 1015 +++++++++++++++ submodules/WalletUI/.BUCK.swp | Bin 12288 -> 0 bytes submodules/WalletUI/BUCK | 22 +- .../WalletUI/Images.xcassets/Contents.json | 6 + .../Wallet/BalanceGem.imageset/Contents.json | 12 + .../Wallet/BalanceGem.imageset/gem.pdf | Bin 0 -> 96235 bytes .../CameraFlashIcon.imageset/Contents.json | 12 + .../CameraFlashIcon.imageset/ic_flash.pdf | Bin 0 -> 4199 bytes .../CameraGalleryIcon.imageset/Contents.json | 12 + .../ic_gallery (3).pdf | Bin 0 -> 4174 bytes .../Images.xcassets/Wallet/Contents.json | 9 + .../Wallet/DuckIcon.imageset/Contents.json | 12 + .../Wallet/DuckIcon.imageset/duck.pdf | Bin 0 -> 43310 bytes .../Contents.json | 12 + .../NavigationSettingsIcon.pdf | Bin 0 -> 5839 bytes .../Wallet/QrGem.imageset/Contents.json | 22 + .../Wallet/QrGem.imageset/QrGem@2x.png | Bin 0 -> 15212 bytes .../Wallet/QrGem.imageset/QrGem@3x.png | Bin 0 -> 17086 bytes .../Wallet/QrIcon.imageset/Contents.json | 12 + .../Wallet/QrIcon.imageset/ic_qrcode.pdf | Bin 0 -> 4962 bytes .../ReceiveButtonIcon.imageset/Contents.json | 12 + .../ReceiveButtonIcon.imageset/Group2.pdf | Bin 0 -> 3784 bytes .../Wallet/RefreshIcon.imageset/Contents.json | 12 + .../RefreshIcon.imageset/ic_walletupdate.pdf | Bin 0 -> 4496 bytes .../SendButtonIcon.imageset/Contents.json | 12 + .../Wallet/SendButtonIcon.imageset/Group.pdf | Bin 0 -> 3785 bytes .../TransactionGem.imageset/Contents.json | 12 + .../TransactionGem.imageset/SmallGem.pdf | Bin 0 -> 96214 bytes .../Resources/Animations}/SendingGrams.tgs | Bin .../Animations/WalletApologiesAccepted.tgs | Bin 0 -> 17922 bytes .../Resources/Animations}/WalletCreated.tgs | Bin .../Resources/Animations}/WalletDone.tgs | Bin .../Resources/Animations}/WalletEmpty.tgs | Bin .../Animations}/WalletIntroLoading.tgs | Bin .../Animations}/WalletIntroStatic.tgs | Bin .../Resources/Animations}/WalletKeyLock.tgs | Bin .../Animations}/WalletNotAvailable.tgs | Bin .../Resources/Animations}/WalletWordCheck.tgs | Bin .../Resources/Animations}/WalletWordList.tgs | Bin .../WalletUI/Resources/WalletStrings.mapping | Bin 6949 -> 6949 bytes .../ItemList/ItemListControllerNode.swift | 1 - .../Items/ItemListMultilineTextItem.swift | 30 +- .../ItemList/Items/ItemListTextItem.swift | 6 +- submodules/WalletUI/Sources/ToastNode.swift | 78 ++ .../Sources/WalletConfiguration.swift | 19 +- .../WalletUI/Sources/WalletContext.swift | 12 +- .../Sources/WalletCreateInvoiceScreen.swift | 4 +- .../Sources/WalletInfoEmptyNode.swift | 5 +- .../WalletUI/Sources/WalletInfoScreen.swift | 23 +- .../Sources/WalletInfoTransactionItem.swift | 1 - .../Sources/WalletPasscodeScreen.swift | 2 - .../WalletUI/Sources/WalletQrScanScreen.swift | 3 +- .../WalletUI/Sources/WalletQrViewScreen.swift | 6 +- .../Sources/WalletReceiveScreen.swift | 5 +- .../WalletUI/Sources/WalletSendScreen.swift | 15 +- .../Sources/WalletSettingsScreen.swift | 8 +- .../WalletUI/Sources/WalletSplashScreen.swift | 35 +- .../WalletUI/Sources/WalletStrings.swift | 4 +- .../Sources/WalletTransactionInfoScreen.swift | 16 +- submodules/WalletUI/Sources/WalletUtils.swift | 2 +- .../Sources/WalletWordCheckScreen.swift | 16 +- .../Sources/WalletWordDisplayScreen.swift | 43 +- submodules/WalletUrl/BUCK | 14 + submodules/WalletUrl/Sources/WalletUrl.swift | 40 + submodules/WebSearchUI/BUCK | 1 + tools/GenerateLocalization.sh | 10 + 230 files changed, 4534 insertions(+), 2435 deletions(-) create mode 100644 Config/wallet_configs.bzl create mode 100644 Wallet/Icons.xcassets/AppIconLLC.appiconset/BlueIcon@2x-1.png create mode 100644 Wallet/Icons.xcassets/AppIconLLC.appiconset/BlueIcon@2x.png create mode 100644 Wallet/Icons.xcassets/AppIconLLC.appiconset/BlueIcon@3x.png create mode 100644 Wallet/Icons.xcassets/AppIconLLC.appiconset/BlueIconIpad.png create mode 100644 Wallet/Icons.xcassets/AppIconLLC.appiconset/BlueIconIpad@2x.png create mode 100644 Wallet/Icons.xcassets/AppIconLLC.appiconset/BlueIconLargeIpad@2x.png create mode 100644 Wallet/Icons.xcassets/AppIconLLC.appiconset/BlueNotificationIcon.png create mode 100644 Wallet/Icons.xcassets/AppIconLLC.appiconset/BlueNotificationIcon@2x-1.png create mode 100644 Wallet/Icons.xcassets/AppIconLLC.appiconset/BlueNotificationIcon@2x.png create mode 100644 Wallet/Icons.xcassets/AppIconLLC.appiconset/BlueNotificationIcon@3x.png create mode 100644 Wallet/Icons.xcassets/AppIconLLC.appiconset/Contents.json create mode 100644 Wallet/Icons.xcassets/AppIconLLC.appiconset/Simple-iTunesArtwork.png create mode 100644 Wallet/Icons.xcassets/AppIconLLC.appiconset/Simple@29x29.png create mode 100644 Wallet/Icons.xcassets/AppIconLLC.appiconset/Simple@40x40-1.png create mode 100644 Wallet/Icons.xcassets/AppIconLLC.appiconset/Simple@58x58-1.png create mode 100644 Wallet/Icons.xcassets/AppIconLLC.appiconset/Simple@58x58.png create mode 100644 Wallet/Icons.xcassets/AppIconLLC.appiconset/Simple@80x80-1.png create mode 100644 Wallet/Icons.xcassets/AppIconLLC.appiconset/Simple@80x80.png create mode 100644 Wallet/Icons.xcassets/AppIconLLC.appiconset/Simple@87x87.png create mode 100644 Wallet/Icons.xcassets/Contents.json create mode 100644 Wallet/InfoPlistStrings/en.lproj/InfoPlist.strings create mode 100644 Wallet/LaunchScreen.xib create mode 100644 Wallet/Strings/ar.lproj/Localizable.strings create mode 100644 Wallet/Strings/ca.lproj/Localizable.strings create mode 100644 Wallet/Strings/de.lproj/Localizable.strings create mode 100644 Wallet/Strings/en.lproj/Localizable.strings create mode 100644 Wallet/Strings/es.lproj/Localizable.strings create mode 100644 Wallet/Strings/fr.lproj/Localizable.strings create mode 100644 Wallet/Strings/id.lproj/Localizable.strings create mode 100644 Wallet/Strings/it.lproj/Localizable.strings create mode 100644 Wallet/Strings/ko.lproj/Localizable.strings create mode 100644 Wallet/Strings/ms.lproj/Localizable.strings create mode 100644 Wallet/Strings/nl.lproj/Localizable.strings create mode 100644 Wallet/Strings/pt.lproj/Localizable.strings create mode 100644 Wallet/Strings/ru.lproj/Localizable.strings create mode 100644 Wallet/Strings/tr.lproj/Localizable.strings create mode 100644 Wallet/Strings/uk.lproj/Localizable.strings create mode 100644 Wallet/Wallet.entitlements create mode 100644 submodules/AnimatedStickerNode/BUCK rename submodules/{AnimationUI => AnimatedStickerNode}/Sources/AnimatedStickerNode.swift (89%) rename submodules/{AnimationUI => AnimatedStickerNode}/Sources/AnimationRenderer.swift (100%) rename submodules/{AnimationUI => AnimatedStickerNode}/Sources/SoftwareAnimationRenderer.swift (100%) delete mode 100644 submodules/AnimationUI/Sources/AnimationUI.h create mode 100644 submodules/Markdown/BUCK rename submodules/{TextFormat => Markdown}/Sources/Markdown.swift (99%) create mode 100644 submodules/OverlayStatusController/Resources/Star@2x.png create mode 100644 submodules/OverlayStatusController/Resources/Star@3x.png delete mode 100644 submodules/OverlayStatusController/Sources/OverlayStatusController.h create mode 100644 submodules/OverlayStatusController/Sources/ProgressSpinnerView.h create mode 100644 submodules/OverlayStatusController/Sources/ProgressSpinnerView.m create mode 100644 submodules/OverlayStatusController/Sources/ProgressWindow.h create mode 100644 submodules/OverlayStatusController/Sources/ProgressWindow.m create mode 100644 submodules/OverlayStatusController/Sources/ProxyWindow.h create mode 100644 submodules/OverlayStatusController/Sources/ProxyWindow.m create mode 100644 submodules/PresentationDataUtils/Sources/SolidRoundedButtonNode.swift create mode 100644 submodules/TelegramAnimatedStickerNode/BUCK rename submodules/{AnimationUI => TelegramAnimatedStickerNode}/Sources/AnimatedStickerUtils.swift (100%) create mode 100644 submodules/TelegramAnimatedStickerNode/Sources/TelegramAnimatedStickerNode.swift create mode 100644 submodules/WalletCore/BUCK create mode 100644 submodules/WalletCore/Sources/WalletCore.swift delete mode 100644 submodules/WalletUI/.BUCK.swp create mode 100644 submodules/WalletUI/Images.xcassets/Contents.json create mode 100644 submodules/WalletUI/Images.xcassets/Wallet/BalanceGem.imageset/Contents.json create mode 100644 submodules/WalletUI/Images.xcassets/Wallet/BalanceGem.imageset/gem.pdf create mode 100644 submodules/WalletUI/Images.xcassets/Wallet/CameraFlashIcon.imageset/Contents.json create mode 100644 submodules/WalletUI/Images.xcassets/Wallet/CameraFlashIcon.imageset/ic_flash.pdf create mode 100644 submodules/WalletUI/Images.xcassets/Wallet/CameraGalleryIcon.imageset/Contents.json create mode 100644 submodules/WalletUI/Images.xcassets/Wallet/CameraGalleryIcon.imageset/ic_gallery (3).pdf create mode 100644 submodules/WalletUI/Images.xcassets/Wallet/Contents.json create mode 100644 submodules/WalletUI/Images.xcassets/Wallet/DuckIcon.imageset/Contents.json create mode 100644 submodules/WalletUI/Images.xcassets/Wallet/DuckIcon.imageset/duck.pdf create mode 100644 submodules/WalletUI/Images.xcassets/Wallet/NavigationSettingsIcon.imageset/Contents.json create mode 100644 submodules/WalletUI/Images.xcassets/Wallet/NavigationSettingsIcon.imageset/NavigationSettingsIcon.pdf create mode 100644 submodules/WalletUI/Images.xcassets/Wallet/QrGem.imageset/Contents.json create mode 100644 submodules/WalletUI/Images.xcassets/Wallet/QrGem.imageset/QrGem@2x.png create mode 100644 submodules/WalletUI/Images.xcassets/Wallet/QrGem.imageset/QrGem@3x.png create mode 100644 submodules/WalletUI/Images.xcassets/Wallet/QrIcon.imageset/Contents.json create mode 100644 submodules/WalletUI/Images.xcassets/Wallet/QrIcon.imageset/ic_qrcode.pdf create mode 100644 submodules/WalletUI/Images.xcassets/Wallet/ReceiveButtonIcon.imageset/Contents.json create mode 100644 submodules/WalletUI/Images.xcassets/Wallet/ReceiveButtonIcon.imageset/Group2.pdf create mode 100644 submodules/WalletUI/Images.xcassets/Wallet/RefreshIcon.imageset/Contents.json create mode 100644 submodules/WalletUI/Images.xcassets/Wallet/RefreshIcon.imageset/ic_walletupdate.pdf create mode 100644 submodules/WalletUI/Images.xcassets/Wallet/SendButtonIcon.imageset/Contents.json create mode 100644 submodules/WalletUI/Images.xcassets/Wallet/SendButtonIcon.imageset/Group.pdf create mode 100644 submodules/WalletUI/Images.xcassets/Wallet/TransactionGem.imageset/Contents.json create mode 100644 submodules/WalletUI/Images.xcassets/Wallet/TransactionGem.imageset/SmallGem.pdf rename submodules/{TelegramUI/TelegramUI/Resources/WalletAnimations => WalletUI/Resources/Animations}/SendingGrams.tgs (100%) create mode 100755 submodules/WalletUI/Resources/Animations/WalletApologiesAccepted.tgs rename submodules/{TelegramUI/TelegramUI/Resources/WalletAnimations => WalletUI/Resources/Animations}/WalletCreated.tgs (100%) rename submodules/{TelegramUI/TelegramUI/Resources/WalletAnimations => WalletUI/Resources/Animations}/WalletDone.tgs (100%) rename submodules/{TelegramUI/TelegramUI/Resources/WalletAnimations => WalletUI/Resources/Animations}/WalletEmpty.tgs (100%) rename submodules/{TelegramUI/TelegramUI/Resources/WalletAnimations => WalletUI/Resources/Animations}/WalletIntroLoading.tgs (100%) rename submodules/{TelegramUI/TelegramUI/Resources/WalletAnimations => WalletUI/Resources/Animations}/WalletIntroStatic.tgs (100%) rename submodules/{TelegramUI/TelegramUI/Resources/WalletAnimations => WalletUI/Resources/Animations}/WalletKeyLock.tgs (100%) rename submodules/{TelegramUI/TelegramUI/Resources/WalletAnimations => WalletUI/Resources/Animations}/WalletNotAvailable.tgs (100%) rename submodules/{TelegramUI/TelegramUI/Resources/WalletAnimations => WalletUI/Resources/Animations}/WalletWordCheck.tgs (100%) rename submodules/{TelegramUI/TelegramUI/Resources/WalletAnimations => WalletUI/Resources/Animations}/WalletWordList.tgs (100%) create mode 100644 submodules/WalletUrl/BUCK create mode 100644 submodules/WalletUrl/Sources/WalletUrl.swift diff --git a/BUCK b/BUCK index 5122ec3b5a..934c87404c 100644 --- a/BUCK +++ b/BUCK @@ -1,3 +1,7 @@ +load("//Config:utils.bzl", + "library_configs", +) + load("//Config:configs.bzl", "app_binary_configs", "share_extension_configs", @@ -7,7 +11,6 @@ load("//Config:configs.bzl", "intents_extension_configs", "watch_extension_binary_configs", "watch_binary_configs", - "library_configs", "info_plist_substitutions", "app_info_plist_substitutions", "share_extension_info_plist_substitutions", @@ -43,7 +46,9 @@ resource_dependencies = [ "//submodules/LegacyComponents:LegacyComponentsResources", "//submodules/TelegramUI:TelegramUIAssets", "//submodules/TelegramUI:TelegramUIResources", + "//submodules/WalletUI:WalletUIAssets", "//submodules/WalletUI:WalletUIResources", + "//submodules/OverlayStatusController:OverlayStatusControllerResources", "//:AppResources", "//:AppStringResources", "//:InfoPlistStringResources", diff --git a/Config/buck_rule_macros.bzl b/Config/buck_rule_macros.bzl index 609946e1f9..57aad16c62 100644 --- a/Config/buck_rule_macros.bzl +++ b/Config/buck_rule_macros.bzl @@ -1,4 +1,7 @@ -load("//Config:configs.bzl", "library_configs", "dynamic_library_configs", "info_plist_substitutions") +load("//Config:utils.bzl", + "library_configs", + "dynamic_library_configs", +) def apple_lib( name, diff --git a/Config/configs.bzl b/Config/configs.bzl index b52954d5c3..75fa2d15c3 100644 --- a/Config/configs.bzl +++ b/Config/configs.bzl @@ -1,190 +1,25 @@ +load("//Config:utils.bzl", + "config_with_updated_linker_flags", + "configs_with_config", + "merge_dict", + "DEVELOPMENT_LANGUAGE", + "SHARED_CONFIGS", + "ALL_LOAD_LINKER_FLAG", + "read_config_nonempty", + "optimization_config", + "add_provisioning_profile_specifier", + "add_codesign_identity", + "get_build_number", + "get_short_version", + "bundle_identifier", + "get_development_team", + "get_provisioning_profile", + "get_codesign_entitlements", +) -load("//Config:utils.bzl", "config_with_updated_linker_flags", "configs_with_config") -load("//Config:app_configuration.bzl", "appConfig") - -DEVELOPMENT_LANGUAGE = "en" - -def merge_dict(a, b): - d = {} - d.update(a) - d.update(b) - return d - -def pretty(dict, current = ""): - current = "\n" - indent = 0 - for key, value in dict.items(): - current = current + str(key) + ": " - if type(value) == type({}): - current = current + "\n" - indent = 1 - for key2, value2 in value.items(): - current = current + "\t" * indent + str(key2) - current = current + ": " + str(value2) + "\n" - else: - current = current + "\t" * (indent + 1) + str(value) + "\n" - - return current - -SHARED_CONFIGS = { - "IPHONEOS_DEPLOYMENT_TARGET": "9.0", - "SDKROOT": "iphoneos", - "GCC_OPTIMIZATION_LEVEL": "0", - "SWIFT_WHOLE_MODULE_OPTIMIZATION": "NO", - "ONLY_ACTIVE_ARCH": "YES", - "LD_RUNPATH_SEARCH_PATHS": "@executable_path/Frameworks", - "ENABLE_BITCODE": "NO", -} - -def optimization_config(): - return { - "SWIFT_OPTIMIZATION_LEVEL": native.read_config("custom", "optimization"), - } - -# Adding `-all_load` to our binaries works around https://bugs.swift.org/browse/SR-6004. -ALL_LOAD_LINKER_FLAG = "-all_load" - -def read_config_nonempty(name): - value = native.read_config("custom", name) - if value == None: - fail("Configuration parameter custom.%s should be defined" % name) - elif len(value) == 0: - fail("Configuration parameter custom.%s should not be empty" % name) - else: - return value - -def get_codesign_identity(environment): - if environment == "development": - return read_config_nonempty("developmentCodeSignIdentity") - elif environment == "distribution": - return read_config_nonempty("distributionCodeSignIdentity") - else: - fail("Unknown environment " + environment) - -def get_provisioning_profile(environment, type): - if type == "app": - return read_config_nonempty(environment + "ProvisioningProfileApp") - elif type == "share": - return read_config_nonempty(environment + "ProvisioningProfileExtensionShare") - elif type == "widget": - return read_config_nonempty(environment + "ProvisioningProfileExtensionWidget") - elif type == "notification_service": - return read_config_nonempty(environment + "ProvisioningProfileExtensionNotificationService") - elif type == "notification_content": - return read_config_nonempty(environment + "ProvisioningProfileExtensionNotificationContent") - elif type == "intents": - return read_config_nonempty(environment + "ProvisioningProfileExtensionIntents") - elif type == "watch_app": - return read_config_nonempty(environment + "ProvisioningProfileWatchApp") - elif type == "watch_extension": - return read_config_nonempty(environment + "ProvisioningProfileWatchExtension") - else: - fail("Unknown provisioning profile type " + type) - -def get_development_team(): - return read_config_nonempty("developmentTeam") - -def add_item_to_subdict(superdict, key, subkey, item): - subdict = dict(superdict[key]) - subdict[subkey] = item - superdict[key] = subdict - -valid_configurations = ["Debug", "Profile", "Release"] - -def add_provisioning_profile_specifier(configs, type): - for configuration in configs: - if configuration not in valid_configurations: - fail("Unknown configuration " + configuration) - - configs = dict(configs) - for configuration in valid_configurations: - if configuration == "Debug": - add_item_to_subdict(configs, configuration, "PROVISIONING_PROFILE_SPECIFIER", get_provisioning_profile(environment="development", type=type)) - elif configuration == "Profile": - add_item_to_subdict(configs, configuration, "PROVISIONING_PROFILE_SPECIFIER", get_provisioning_profile(environment="development", type=type)) - elif configuration == "Release": - add_item_to_subdict(configs, configuration, "PROVISIONING_PROFILE_SPECIFIER", get_provisioning_profile(environment="distribution", type=type)) - return configs - -def add_codesign_identity(configs): - for configuration in configs: - if configuration not in valid_configurations: - fail("Unknown configuration " + configuration) - - configs = dict(configs) - for configuration in valid_configurations: - if configuration == "Debug": - add_item_to_subdict(configs, configuration, "CODE_SIGN_IDENTITY", get_codesign_identity(environment="development")) - elif configuration == "Profile": - add_item_to_subdict(configs, configuration, "CODE_SIGN_IDENTITY", get_codesign_identity(environment="development")) - elif configuration == "Release": - add_item_to_subdict(configs, configuration, "CODE_SIGN_IDENTITY", get_codesign_identity(environment="distribution")) - return configs - -def get_codesign_entitlements(type): - if type == "app": - return read_config_nonempty("entitlementsApp") - elif type == "share": - return read_config_nonempty("entitlementsExtensionShare") - elif type == "widget": - return read_config_nonempty("entitlementsExtensionWidget") - elif type == "notification_service": - return read_config_nonempty("entitlementsExtensionNotificationService") - elif type == "notification_content": - return read_config_nonempty("entitlementsExtensionNotificationContent") - elif type == "intents": - return read_config_nonempty("entitlementsExtensionIntents") - else: - fail("unknown provisioning profile type") - -def get_build_number(): - return read_config_nonempty("buildNumber") - -def get_short_version(): - return read_config_nonempty("appVersion") - -def bundle_identifier(suffix): - return read_config_nonempty("baseApplicationBundleId") + suffix - -def library_configs(): - lib_specific_config = { - "SWIFT_WHOLE_MODULE_OPTIMIZATION": "NO", - - # Setting SKIP_INSTALL to NO for static library configs would create - # create a generic xcode archive which can not be uploaded the app store - # https://developer.apple.com/library/archive/technotes/tn2215/_index.html - "SKIP_INSTALL": "YES", - } - library_config = merge_dict(SHARED_CONFIGS, lib_specific_config) - library_config = merge_dict(library_config, optimization_config()) - configs = { - "Debug": library_config, - "Profile": library_config, - "Release": library_config, - } - return configs - -def dynamic_library_configs(): - lib_specific_config = { - "SWIFT_WHOLE_MODULE_OPTIMIZATION": "NO", - - # Setting SKIP_INSTALL to NO for static library configs would create - # create a generic xcode archive which can not be uploaded the app store - # https://developer.apple.com/library/archive/technotes/tn2215/_index.html - "SKIP_INSTALL": "YES", - "MACH_O_TYPE": "mh_dylib", - "CODE_SIGNING_ALLOWED": "NO", - } - - library_config = merge_dict(SHARED_CONFIGS, lib_specific_config) - library_config = merge_dict(library_config, optimization_config()) - #library_config = config_with_updated_linker_flags(library_config, ALL_LOAD_LINKER_FLAG) - configs = { - "Debug": library_config, - "Profile": library_config, - "Release": library_config, - } - return configs +load("//Config:app_configuration.bzl", + "appConfig", +) def app_binary_configs(): config = { diff --git a/Config/utils.bzl b/Config/utils.bzl index bb2b6c70f4..ca02712754 100644 --- a/Config/utils.bzl +++ b/Config/utils.bzl @@ -33,3 +33,170 @@ def config_with_updated_linker_flags(config, other_linker_flags, config_key=OTHE new_config[config_key] = '$(inherited) ' + other_linker_flags return new_config + +def merge_dict(a, b): + d = {} + d.update(a) + d.update(b) + return d + +DEVELOPMENT_LANGUAGE = "en" + +SHARED_CONFIGS = { + "IPHONEOS_DEPLOYMENT_TARGET": "9.0", + "SDKROOT": "iphoneos", + "GCC_OPTIMIZATION_LEVEL": "0", + "SWIFT_WHOLE_MODULE_OPTIMIZATION": "NO", + "ONLY_ACTIVE_ARCH": "YES", + "LD_RUNPATH_SEARCH_PATHS": "@executable_path/Frameworks", + "ENABLE_BITCODE": "NO", +} + +# Adding `-all_load` to our binaries works around https://bugs.swift.org/browse/SR-6004. +ALL_LOAD_LINKER_FLAG = "-all_load" + +def optimization_config(): + return { + "SWIFT_OPTIMIZATION_LEVEL": native.read_config("custom", "optimization"), + } + +def read_config_nonempty(name): + value = native.read_config("custom", name) + if value == None: + fail("Configuration parameter custom.%s should be defined" % name) + elif len(value) == 0: + fail("Configuration parameter custom.%s should not be empty" % name) + else: + return value + +def get_codesign_identity(environment): + if environment == "development": + return read_config_nonempty("developmentCodeSignIdentity") + elif environment == "distribution": + return read_config_nonempty("distributionCodeSignIdentity") + else: + fail("Unknown environment " + environment) + +def get_development_team(): + return read_config_nonempty("developmentTeam") + +def add_item_to_subdict(superdict, key, subkey, item): + subdict = dict(superdict[key]) + subdict[subkey] = item + superdict[key] = subdict + +valid_configurations = ["Debug", "Profile", "Release"] + +def add_provisioning_profile_specifier(configs, type): + for configuration in configs: + if configuration not in valid_configurations: + fail("Unknown configuration " + configuration) + + configs = dict(configs) + for configuration in valid_configurations: + if configuration == "Debug": + add_item_to_subdict(configs, configuration, "PROVISIONING_PROFILE_SPECIFIER", get_provisioning_profile(environment="development", type=type)) + elif configuration == "Profile": + add_item_to_subdict(configs, configuration, "PROVISIONING_PROFILE_SPECIFIER", get_provisioning_profile(environment="development", type=type)) + elif configuration == "Release": + add_item_to_subdict(configs, configuration, "PROVISIONING_PROFILE_SPECIFIER", get_provisioning_profile(environment="distribution", type=type)) + return configs + +def add_codesign_identity(configs): + for configuration in configs: + if configuration not in valid_configurations: + fail("Unknown configuration " + configuration) + + configs = dict(configs) + for configuration in valid_configurations: + if configuration == "Debug": + add_item_to_subdict(configs, configuration, "CODE_SIGN_IDENTITY", get_codesign_identity(environment="development")) + elif configuration == "Profile": + add_item_to_subdict(configs, configuration, "CODE_SIGN_IDENTITY", get_codesign_identity(environment="development")) + elif configuration == "Release": + add_item_to_subdict(configs, configuration, "CODE_SIGN_IDENTITY", get_codesign_identity(environment="distribution")) + return configs + +def get_build_number(): + return read_config_nonempty("buildNumber") + +def get_short_version(): + return read_config_nonempty("appVersion") + +def bundle_identifier(suffix): + return read_config_nonempty("baseApplicationBundleId") + suffix + +def library_configs(): + lib_specific_config = { + "SWIFT_WHOLE_MODULE_OPTIMIZATION": "NO", + + # Setting SKIP_INSTALL to NO for static library configs would create + # create a generic xcode archive which can not be uploaded the app store + # https://developer.apple.com/library/archive/technotes/tn2215/_index.html + "SKIP_INSTALL": "YES", + } + library_config = merge_dict(SHARED_CONFIGS, lib_specific_config) + library_config = merge_dict(library_config, optimization_config()) + configs = { + "Debug": library_config, + "Profile": library_config, + "Release": library_config, + } + return configs + +def dynamic_library_configs(): + lib_specific_config = { + "SWIFT_WHOLE_MODULE_OPTIMIZATION": "NO", + + # Setting SKIP_INSTALL to NO for static library configs would create + # create a generic xcode archive which can not be uploaded the app store + # https://developer.apple.com/library/archive/technotes/tn2215/_index.html + "SKIP_INSTALL": "YES", + "MACH_O_TYPE": "mh_dylib", + "CODE_SIGNING_ALLOWED": "NO", + } + + library_config = merge_dict(SHARED_CONFIGS, lib_specific_config) + library_config = merge_dict(library_config, optimization_config()) + configs = { + "Debug": library_config, + "Profile": library_config, + "Release": library_config, + } + return configs + +def get_provisioning_profile(environment, type): + if type == "app": + return read_config_nonempty(environment + "ProvisioningProfileApp") + elif type == "share": + return read_config_nonempty(environment + "ProvisioningProfileExtensionShare") + elif type == "widget": + return read_config_nonempty(environment + "ProvisioningProfileExtensionWidget") + elif type == "notification_service": + return read_config_nonempty(environment + "ProvisioningProfileExtensionNotificationService") + elif type == "notification_content": + return read_config_nonempty(environment + "ProvisioningProfileExtensionNotificationContent") + elif type == "intents": + return read_config_nonempty(environment + "ProvisioningProfileExtensionIntents") + elif type == "watch_app": + return read_config_nonempty(environment + "ProvisioningProfileWatchApp") + elif type == "watch_extension": + return read_config_nonempty(environment + "ProvisioningProfileWatchExtension") + else: + fail("Unknown provisioning profile type " + type) + +def get_codesign_entitlements(type): + if type == "app": + return read_config_nonempty("entitlementsApp") + elif type == "share": + return read_config_nonempty("entitlementsExtensionShare") + elif type == "widget": + return read_config_nonempty("entitlementsExtensionWidget") + elif type == "notification_service": + return read_config_nonempty("entitlementsExtensionNotificationService") + elif type == "notification_content": + return read_config_nonempty("entitlementsExtensionNotificationContent") + elif type == "intents": + return read_config_nonempty("entitlementsExtensionIntents") + else: + fail("unknown provisioning profile type") diff --git a/Config/wallet_configs.bzl b/Config/wallet_configs.bzl new file mode 100644 index 0000000000..50b9fe9d17 --- /dev/null +++ b/Config/wallet_configs.bzl @@ -0,0 +1,58 @@ +load("//Config:utils.bzl", + "config_with_updated_linker_flags", + "configs_with_config", + "merge_dict", + "DEVELOPMENT_LANGUAGE", + "SHARED_CONFIGS", + "ALL_LOAD_LINKER_FLAG", + "optimization_config", + "add_provisioning_profile_specifier", + "add_codesign_identity", + "get_build_number", + "get_short_version", + "bundle_identifier", + "get_development_team", + "get_provisioning_profile", + "get_codesign_entitlements", +) + +load("//Config:app_configuration.bzl", + "appConfig" +) + +def app_binary_configs(): + config = { + "ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES": "YES", + "DEVELOPMENT_LANGUAGE": DEVELOPMENT_LANGUAGE, + "PRODUCT_BUNDLE_IDENTIFIER": bundle_identifier(suffix=""), + "CODE_SIGN_ENTITLEMENTS": get_codesign_entitlements("app"), + "DEVELOPMENT_TEAM": get_development_team(), + "ASSETCATALOG_COMPILER_APPICON_NAME": "AppIconLLC", + "BUILD_NUMBER": get_build_number(), + "PRODUCT_BUNDLE_SHORT_VERSION": get_short_version(), + "APP_NAME": "TON Wallet", + "PRODUCT_NAME": "TON Wallet", + "TARGETED_DEVICE_FAMILY": "1,2", + } + config = merge_dict(SHARED_CONFIGS, config) + config = merge_dict(config, optimization_config()) + config = config_with_updated_linker_flags(config, ALL_LOAD_LINKER_FLAG) + configs = configs_with_config(config) + configs = add_provisioning_profile_specifier(configs, "app") + configs = add_codesign_identity(configs) + return configs + +def app_info_plist_substitutions(): + substitutions = { + "DEVELOPMENT_LANGUAGE": DEVELOPMENT_LANGUAGE, + "EXECUTABLE_NAME": "TON Wallet", + "PRODUCT_BUNDLE_IDENTIFIER": bundle_identifier(suffix=""), + "PRODUCT_NAME": "TON Wallet", + "APP_NAME": "TON Wallet", + "CURRENT_PROJECT_VERSION": "1", + "BUILD_NUMBER": get_build_number(), + "PRODUCT_BUNDLE_SHORT_VERSION": get_short_version(), + "ASSETCATALOG_COMPILER_APPICON_NAME": "AppIconLLC", + "TARGETED_DEVICE_FAMILY": "1,2", + } + return substitutions diff --git a/Makefile b/Makefile index 1d46ca4e7a..0f4fcc01df 100644 --- a/Makefile +++ b/Makefile @@ -50,6 +50,24 @@ BUCK_OPTIONS=\ --config custom.developmentProvisioningProfileWatchExtension="${DEVELOPMENT_PROVISIONING_PROFILE_WATCH_EXTENSION}" \ --config custom.distributionProvisioningProfileWatchExtension="${DISTRIBUTION_PROVISIONING_PROFILE_WATCH_EXTENSION}" +WALLET_BUCK_OPTIONS=\ + --config custom.appVersion="1.0" \ + --config custom.developmentCodeSignIdentity="${DEVELOPMENT_CODE_SIGN_IDENTITY}" \ + --config custom.distributionCodeSignIdentity="${DISTRIBUTION_CODE_SIGN_IDENTITY}" \ + --config custom.developmentTeam="${DEVELOPMENT_TEAM}" \ + --config custom.baseApplicationBundleId="${WALLET_BUNDLE_ID}" \ + --config custom.buildNumber="${BUILD_NUMBER}" \ + --config custom.entitlementsApp="${WALLET_ENTITLEMENTS_APP}" \ + --config custom.developmentProvisioningProfileApp="${WALLET_DEVELOPMENT_PROVISIONING_PROFILE_APP}" \ + --config custom.distributionProvisioningProfileApp="${WALLET_DISTRIBUTION_PROVISIONING_PROFILE_APP}" \ + --config custom.apiId="${API_ID}" \ + --config custom.apiHash="${API_HASH}" \ + --config custom.hockeyAppId="${HOCKEYAPP_ID}" \ + --config custom.isInternalBuild="${IS_INTERNAL_BUILD}" \ + --config custom.isAppStoreBuild="${IS_APPSTORE_BUILD}" \ + --config custom.appStoreId="${APPSTORE_ID}" \ + --config custom.appSpecificUrlScheme="${APP_SPECIFIC_URL_SCHEME}" + BUCK_THREADS_OPTIONS=--config build.threads=$(shell sysctl -n hw.logicalcpu) BUCK_CACHE_OPTIONS= @@ -138,7 +156,7 @@ build_wallet_debug_arm64: check_env //submodules/AsyncDisplayKit:AsyncDisplayKit#shared,iphoneos-arm64 \ //submodules/Display:Display#dwarf-and-dsym,shared,iphoneos-arm64 \ //submodules/Display:Display#shared,iphoneos-arm64 \ - ${BUCK_OPTIONS} ${BUCK_DEBUG_OPTIONS} ${BUCK_THREADS_OPTIONS} ${BUCK_CACHE_OPTIONS} + ${WALLET_BUCK_OPTIONS} ${BUCK_DEBUG_OPTIONS} ${BUCK_THREADS_OPTIONS} ${BUCK_CACHE_OPTIONS} build_debug_armv7: check_env $(BUCK) build \ @@ -392,8 +410,12 @@ project: check_env kill_xcode $(BUCK) project //:workspace --config custom.mode=project ${BUCK_OPTIONS} ${BUCK_DEBUG_OPTIONS} open Telegram_Buck.xcworkspace +wallet_deps: check_env + $(BUCK) query "deps(//Wallet:AppPackage)" \ + ${WALLET_BUCK_OPTIONS} ${BUCK_DEBUG_OPTIONS} + wallet_project: check_env kill_xcode - $(BUCK) project //Wallet:workspace --config custom.mode=project ${BUCK_OPTIONS} ${BUCK_DEBUG_OPTIONS} + $(BUCK) project //Wallet:workspace --config custom.mode=project ${WALLET_BUCK_OPTIONS} ${BUCK_DEBUG_OPTIONS} open Wallet/WalletWorkspace.xcworkspace project_opt: check_env kill_xcode diff --git a/Wallet/BUCK b/Wallet/BUCK index 0e95e9f847..907d1ded34 100644 --- a/Wallet/BUCK +++ b/Wallet/BUCK @@ -1,11 +1,13 @@ -load("//Config:configs.bzl", - "app_binary_configs", +load("//Config:utils.bzl", "library_configs", - "info_plist_substitutions", +) + +load("//Config:wallet_configs.bzl", + "app_binary_configs", + "app_info_plist_substitutions", ) load("//Config:buck_rule_macros.bzl", - "apple_lib", "framework_binary_dependencies", "framework_bundle_dependencies", ) @@ -13,46 +15,25 @@ load("//Config:buck_rule_macros.bzl", framework_dependencies = [ "//submodules/MtProtoKit:MtProtoKit", "//submodules/SSignalKit/SwiftSignalKit:SwiftSignalKit", - "//submodules/Postbox:Postbox", - "//submodules/TelegramCore:TelegramCore", "//submodules/AsyncDisplayKit:AsyncDisplayKit", "//submodules/Display:Display", ] resource_dependencies = [ - "//submodules/TelegramUI:TelegramUIAssets", - "//submodules/TelegramUI:TelegramUIResources", - "//:AppResources", - "//:AppStringResources", - "//:InfoPlistStringResources", - "//:AppIntentVocabularyResources", - "//:Icons", - "//:AdditionalIcons", - "//:LaunchScreen", + "//submodules/WalletUI:WalletUIResources", + "//submodules/WalletUI:WalletUIAssets", + "//submodules/OverlayStatusController:OverlayStatusControllerResources", + ":StringResources", + ":InfoPlistStringResources", + ":Icons", + ":LaunchScreen", ] apple_resource( - name = "AppResources", - files = glob([ - "Telegram-iOS/Resources/**/*", - ], exclude = ["Telegram-iOS/Resources/**/.*"]), - visibility = ["PUBLIC"], -) - -apple_resource( - name = "AppStringResources", + name = "StringResources", files = [], variants = glob([ - "Telegram-iOS/*.lproj/Localizable.strings", - ]), - visibility = ["PUBLIC"], -) - -apple_resource( - name = "AppIntentVocabularyResources", - files = [], - variants = glob([ - "Telegram-iOS/*.lproj/AppIntentVocabulary.plist", + "Strings/*.lproj/Localizable.strings", ]), visibility = ["PUBLIC"], ) @@ -61,7 +42,7 @@ apple_resource( name = "InfoPlistStringResources", files = [], variants = glob([ - "Telegram-iOS/*.lproj/InfoPlist.strings", + "InfoPlistStrings/*.lproj/InfoPlist.strings", ]), visibility = ["PUBLIC"], ) @@ -69,25 +50,16 @@ apple_resource( apple_asset_catalog( name = "Icons", dirs = [ - "Telegram-iOS/Icons.xcassets", - "Telegram-iOS/AppIcons.xcassets", + "Icons.xcassets", ], app_icon = "AppIconLLC", visibility = ["PUBLIC"], ) -apple_resource( - name = "AdditionalIcons", - files = glob([ - "Telegram-iOS/*.png", - ]), - visibility = ["PUBLIC"], -) - apple_resource( name = "LaunchScreen", files = [ - "Telegram-iOS/Base.lproj/LaunchScreen.xib", + "LaunchScreen.xib", ], visibility = ["PUBLIC"], ) @@ -95,8 +67,7 @@ apple_resource( apple_library( name = "AppLibrary", visibility = [ - "//:", - "//...", + "//Wallet:...", ], configs = library_configs(), swift_version = native.read_config("swift", "version"), @@ -110,6 +81,7 @@ apple_library( ], deps = [ "//submodules/WalletUI:WalletUI", + "//submodules/BuildConfig:BuildConfig", ] + framework_binary_dependencies(framework_dependencies), frameworks = [ @@ -122,8 +94,7 @@ apple_library( apple_binary( name = "AppBinary", visibility = [ - "//:", - "//...", + "//Wallet:...", ], configs = app_binary_configs(), swift_version = native.read_config("swift", "version"), diff --git a/Wallet/Icons.xcassets/AppIconLLC.appiconset/BlueIcon@2x-1.png b/Wallet/Icons.xcassets/AppIconLLC.appiconset/BlueIcon@2x-1.png new file mode 100644 index 0000000000000000000000000000000000000000..dd360d8f50d2e50a84d833219279e382cb3f80de GIT binary patch literal 7776 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

P=xGUH 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 literal 0 HcmV?d00001 diff --git a/Wallet/Icons.xcassets/AppIconLLC.appiconset/BlueIcon@3x.png b/Wallet/Icons.xcassets/AppIconLLC.appiconset/BlueIcon@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..c47aeed4b142802df02be197f4f76bd21ff8ba7b GIT binary patch literal 6013 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 literal 0 HcmV?d00001 diff --git a/Wallet/Icons.xcassets/AppIconLLC.appiconset/BlueIconIpad.png b/Wallet/Icons.xcassets/AppIconLLC.appiconset/BlueIconIpad.png new file mode 100644 index 0000000000000000000000000000000000000000..5eaf0bab232be29191ac61edf64f89299ddd9884 GIT binary patch literal 4276 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 W5$N=Ok|n+X00003oYQ&38J0BPxtA%sz2=!Rit zF5i3qf&0UG-*whLd!4=Bea_y`dY=8sP+x zHau5lJ!JskdkX2j13m!o%uws4@~cqbp$+jINGEQ@Xa`FdCV{z6?xgblntXFs~4^k>wbMiG=K(OuKm&RY@32=5Mn z#Dz{1T>ux{LQ$hA0MfDO|LZPfFHVW0VSnWC2%5CImQHRBKhs-Xn_2+*%(hglO-YpH zDwR<<-wQde{qlEQ`|ustN97lP{&RoY*2z+TpW|MewM6((^`DB{>sbnW$gsR;>(5m) zg*_UD?g2q6LwU|39LO1oP&ql7)KG%Qj`BGPq_q{|%>rDF4nNp0kbN5xvO8x3pY_fW zJqi3t({^%NcSHl6JG`lVC-ya8K*UcvSZOLf#4_8vh?i}%RNZ4bJJK=-O&9_~CV&0j zA*&4wZi=8-b7Y!3oO7)D%k>`OlZ0TxI_(26(}LI zPLl8bbbdOTizI+UO@j3(eq`LQQ~|D*o~*(rnHkb2)muZ+3pCF>x11ir3iwDprgEuqbYq=C(4)pUB{pZl6AX7kx>RM&`4(R8~HCXG^o@nKjc*#z#I@T24O;p35iKhsZhRX1#C-pI29uS}Mo+6E3W zv|Y8zKUdGksWt8UL7>ZG5{uQ&z~UqTGG2VFBRy>N-c-fxlxzH(QdzdeG8+L_ zJJHXsmu1a5ScC_^(`5Vyxx)>^tM%yX657?}sq|3kKb^g5?!KU=pFXR3Vc&ncx50nS zn25nU;HKTu(54p!^nbZdf&ZKlOedY%Q)zgn)MrD6TT9)QLCohvsZlFqyVNs#sv3zn z>{T2mE$pdS^*tN@IU&ssxFVExxckn?^48!N;n`N=BOLBL|Cuv~_f|Y|c~mmQ({Yg3jo(8+# ziiw;8DvcYMepO$Y|1OgzMR60)@o0N8_ZjUB54UW{t+@g4BQh@MKFs?<_AUnW%;Cg~qg5P{%trud zeLfDmuBKE>V6|dX>;7>$8obSBvbLe<>0#RFk#!#C*joq{I90X&S(Zb$&V) z=V0<^gs8mtd@GcRF>|0H&AZYye5o)}Q#BILGqL8|9e5<)6TyCK5wg-9BVKQ`lI19p z_wR0##q8&yi;nZuye#KqYtbj#wyj>He|egMup;l>BLN8$W_-C!iU)T0vhI{YPfFdD zxDk;8Ur)hnOQJ`A@Wb0_#|sP(wBsHp;gY%TPNE0Iu3!H7-XKy0rBx%QK!xzxl?r=N z9+HF2n=589rbFS{1&2(?Z&L31+phPF@&w_=-vpyB2&7eoDI4|=KD=CZf-0b=KT!-h z=9&5x5Niz|*>R@O<3=iH#jR_yWtNlVDrK2l|L{`F-#4!AOhz1*!Am_1x)nZ`I_}?G zqEZ-%72fre#4)|FWWZliYpsj-^}N!WDzZww-4ule=M;B5Wy)}$q7OB`n6@b}h9~Wd z<|PjR(p3yf1?udb-(v%i z)vt5=@l;ZSHowS`n=wGhXmBfgO+j<2B#~;dKZ|Pc0R+Uxu%4qR!pCkt5h=%pEwj>qH3jA zG(He2Kc``*ELiWTCjZf~Sj;N!SS+@s3O;{0P%Jb|A7CC*1+w3;{<#kCQfJ{gALOox zsB;BHr4crFYSVyM6|#komXlvzez3|Fn4I?hzY%$}jL}}6AO1h*r}mys#HIDavx>aB z?-6aWT&~1fmqG7d|8btR<_t0!Om?{aahS=`{BPudg=j*mWn%P4Pjl~?*L8Q_b=tOK zKpfM8r3d~JEv9MEd+EImhY}P!0bAvSXs|WQ?KiE@iaoay&*PnOs`5FRbM%NXhpx9`F5&c>f;+!A9EczZu=>+{x5b>Kaa7_bzvnwpsxA1y_8hv zNp_Y|@zw!F6)S#e85I3H?5#8ba+Ut@*G`Vq0)v1fS9l`F?p zhc()&;p!b&+V%DyEw~sfKyaNv&WDU(fm2(*(46->Zu#80r%)`nV7(TnTjt7+5m>V> z5%J6wnR)FPy7}k<22_zXW#O*5U4zqV>mHnAOf{u+|7?7deN?DhiXkqgfB8-bu9 z0<|h1$~%YnH|is~?xgYCGkc*^cb)PfA;PO6>EWkq#6E*J7r{LdZZ)$1zB-ppm;`yG z+|?=AU8T1j;fFV4Bb-;BsMq14%bCKVP9Tj2ibGS-H@*~6udSt0x5kL?Q8=H(XYAuN zPv-O(v~nZe)cnUO?824>aEJUqEV$mqrq%Adl-vDnDn)GFeS949D2 zWY!=)E77jSLi8)N=ao)GUg`X>0bS@@#<6-saaB+7WviaEy9} zQ`zV=u-m`A%;Rp-Z1?WGDk(O(u%+G>n}+;`b0E}qhEei(%2WvZ)9@5%7_?k!tx#9^ ziMv?~5{NvFUxoJHX%vVrM?q@CC=K(uDLeGjTf^r}7ZA4pm2Z?@-le?e_&534EYf?a z#igN!*$w?l0tRthm={3gqH=YL4!cx3Y`7{-QMM;k zuCxYwhR^Y#1mnz(%EBqz8!1=%<;@q`e2e9-K14cdxz(>E`S0=bYJW}%zQ=yw>GTAk z!Xgst-~(0scjHdsgnLa{XL1P5={L85kcg>HnlaHE{|_b0aY3mj_Te7L+5)e2oOjvx zsD7`YztI`+i^N&dWrmd+8-*r8APr+lsrsE&A$C!7Vlv$JvW$>#(*AlRsCs_71Dq~o zdaGuiPIIZo`sLMddMi4k6X(C@l~=9Ltvq3G$yU_hrIm_iE>(*o)h~u7^LHQ0Ec}ZyInHlGU5?gE_ z&1Acw;=W}LQ&pGU9RBG0uJr_jX}E7{b93@xAIBAwWJ+I)Gh-_SN-y_(r)JJ1=W^r9 zwbM6i4HwrmnTQWa1~!!(6`bDdTUL6;&9D>yMBkEd6sOuJl8H9(N8ayY&TeaCHmWH;Nd?Rn}V&Pst%ZQFE*0#*9Sk! z@rq2*!H#mkR5VP%o25o_-G6=)7``|66EiGbq1_P3tee@uEqtd1oj+^BKX&=$bHXJ3 zP0FQy!bb;+$o5(9?w99G=s6G`^2^7}{t6$k9;$E0G7x%--a2)AO+-iYmCcZ~SWN8l zRa)Wx7kxs_eG3RxsF@i3+idPHDk$r|29Z_O|L={YR4Wv|`9eqH=j6!jA-{z8+vAA8 z;@1VP1_q4A(7$Y9{jVcq{kh0r@JRaQzO^sXuEG;}Ee6wtHLf8hfAQ!UgK!#`6q!gG zDAIRUeJ8uqA&WGH938#0*M)0W`2R|I_Uxq0gL?H++BQbvMW<}Z{T*$xf|Orfnd7%J z4i&u{o~JLcQQN>p3cJQc4?x(G!&o0zwuyz>h zckoE5+Q6H_x&IUbw0CeBxsJ~vSbDQ9x4Hx0;=RC@1#B!<*h%qMBX>w4Q;s6@Dm_|__Zpx- z5FF_hYSUjqY{!@Gg`L6n4u5X~7Oiz~4|+*ZwhY?Zs)FA0E{M@n22H%cZYGnitp@p> zSN%?s7Tft`mcg60Rs1{2lRB8Dl`S<}ffI5tvyg&M%bJP7>XKEy0-x(i9j1vOc?%e8 zu|#LB057yJrJU+-ZxV0t(;XqbD+9K8aeUixWh^ogqP+j!%u5-c?z1S!=|l5rfuan> zbLp7qxYK?5mNNHGa?Ybb% zL%l&0)?G%Bpw!OKjf~D6d83%WHlFaD@ml96q3ICh+o40#vEORoh6(R%tXI8u|BV%D zY>lS?8Bl_{i)k)~)%!nRQjq2t&Agw)t9%%bgsr}=6ztdcdCP!m2W@ifRD7+2 zEJisWj4nBvk;6e^!l{0QgrCSdLUb8j%>j6oDaJnMQWJ#%r@5MtET^cn)|aM5mY!v=`^5N1%gd6 zxr5IX>>Tbh(5gzV8z+yhrXS9)B{I~^2zOr8G-ex@uD+vliZwS?;Q2vTbQe$3TVI)o z>a``wHdosGoZ+696g0*t#8u9-3cdFs%EE^&>YQr!$Ls1kis!t8ty~~*F6pQ4VG{!M zaLf-21xARi>n^tZm(Ghy(cEkT3%tT5*c1?-n!uhjU0hC6_d0|EOSFN?+Y3m1(cIE= zy)5)^@y)_r%Wo?wM&C)>sj2%(H7>gHnC-{WxzEsCPkTN$L^Y=X~7cZwTnMbulANM$RYuib4IV zL9?)*R2^cvY<92W?-wy&-<~8Lu!{=Lqzc4XH^-h4;hYTEdp-S&+hck3EpydoB763+ zaDn2|QZyzY%nv6-;dPIfo0O3|N^bM7?%F^k+W8#b9boR!N{Uhb)9KSGPf3|#!QU{a ze}-qfl$<<&wvA?Co)dX^2O+|ND7#5j3-+HZ`zZaWtZROg+$EeR%``|yfBxYSvL5zC*C9Pt!*w^voR8ySqR|~J(a70XKSbDwHLVuACS%7=H ztiD`T9$I3Ugf{y`7n$V=Xp6VakM(^3YjjFR)U4ViBy}K{#_c^sGyLBZkmG#yvlT#B z1P7pBP;5zlYlSW(uC$@=EX`D~TP04_Xty}AWs45@I&rr$0JhaamG_3o;5pg#;zU^w zWd{9e0B~`K3LxaAt5b}E*+;ct0~768L05|L^kw@{n9?%pRJ2$zKv*=&a)*zOI&kz{ zhFR`PZsnpRXz8(ZO=_P20R=V71)Jb(Vf)#I>X7Z3?`aLsI3v~O`$@{-Q}aMq!<_q} z&kQ#06X+)`?dn`reB&CtHNuRb+#gatM*+ z7UX|B=PUD9m9+2L_c~HOO?0^*r=3P(8M+qjB2N`0w|bJdwta>G^{2+wbi6DjGlaK> zRW-jW8|9{6%HQrN^Ta&B0EL@{HzCoL(fxDu39s0jV#MbvI?Ta_vSF>-4wX(i9er|y z3;N(YJ*%CbQTN}{%&2`|2&r??nYL;cdji-~>Y;~7qWSlOmQHd9(>_vsJhSYni#jWv z(#hY|DL907vxlvHZ_rdA)ZLqi;ebY3_8e!JdRgq!x~C}~XjlnM!pWb7b3bFot!=jo zE^`!-i$%~9vsJ(76~PA%-!%xjf5XNCiXeQ)&srD+OZQG$OM2tT5SrUZ#C;ON*r+fr z{VeO~C;J|lXz>2nj-}@1z)CePm0MyE2!s0REL|eOdTm1ZOzo>#=Fzb-(OzJ9C74y_-$izza8ON2R^F^*V51APvrFIms+*+X}1P+n)m{?b>}#Z8?DAMU~Jv&xPgl*|FcUWG57Cv6K40vS|MxfhC_a=!?qHI8bsM*;nSicws8 z-Ap~2Cv?Ua4yghL((*)V>5a$2vkFlOGuz_ADZvZT!hB7!+i}zi=uOP!(W@`xQL{12 z2h7rHP|=a~&0YRVM8dsGI6amvMrsq6S=zUv3BSR7Oo!0$Gu_r301yuk$DNZQ;=3MV z-eDdpN3k-k)~R!#Z%W>JbWd+^`LCJ7jhBq|w$iw}5*%B5d3oiT(|#V+v1S_fy5QYP znM@2c#24Lq>NrtzH%9~Wi@t^ZvU=n{s7+XU*`vU{Br_}%)NmQ9WoTu2sAqF~m*Ma$ z(y7As7Se&)dS{ziFjsJYSqXXPeeb8#9l5|WW|C9a*x6!!$`y|DfU zpb{S}16HWL)vADamJLa^>6I# zC5DgR)=vpx%6%_*N>fYzFD(a)r6Lzj+G$FFEb;>!R#Q&m6x2)_I$1 znVJseldYQ;edm7P4pY=}=C&$BgxT!`9J%H$mb+DkrMGj^=s>6IB?&aal zsszmMx|b9|F)IMEr!6B^VfPlBf5~01t1=za*7BSL*<{nJ6v@{75N_T>xHvQc7f=;8x`~7UEqgrGmJw|y& zRIu^GPkgW zeeV2%W9Mha3>8e|q@&=uYTop(wBmK{N6+cC*Ava=ChVyIQv)*lT+Quy<- zdyMF;Tmv{5-lm>BPSdd}BPD@)vX1NgMr~}@vlR_)-D#Pf5rv&JP4>B0qQ8n+pQMV>_i|8b1dmC$DnyPX1yYkqJ-r07QcJn^XVLP7{0F zT8K@&Csb+%H-FV^W?N-WBn}UZxRfRy?m$E=)F3Ef&LOn{tJ=R^u;G(dZ5c714VMex z-?qcz7wLX+-$h+%L%q3(c3*!?>ShDsha@8g(lSI*Q9?0y7D7 zR!X{o)FYI(A7kMNPw-9AYy9CJ)$PfEgUeWJGlrOOq+)>OWw)?n#CuR`(Oh;FrOow! zD5%^{wY9{YN0A5~_KHV61>BI-QEk{=DL-e)$B8r`v}_ZD zejj|A{!tYA@!ZPt0>K{EO64QQM2zXNGCS(F$gZrenIjR=J>`iCNn88-qmDxn2qmAt5t9s6Vb;= zR$K2cS_m^O?Pasf2c^Z$FYA4rkHOPdc(fPk=4}tXf+f;|P(i>8w^tn2>xsgTmGWqSD zsL0iI>*!O`8#qiWYRn6kkWISDWEXD553-D4I5dV$P0AL)Y0xx-(S1p&<f|eW zCzf{K)e==R{6Zq8mxvDIZ28@#vv#T$Klu&!$*VBE0D(+pYC4ifV?$OPk=6bCS7&&% zl^8~@`ET9&z4%>C%c}(N<*Ntrss5@8^ia$}+KrdrS*qsU!@OH%9yF8P&+b^BL`I}g zmT6-y9&N2BwLRUYl62b*BIECnuf{B%=a~TI2p@55r{IB3zMErymWe|CBP~_3nWjLq zB)uPqMkgZ;Yd5aEo z`W@P09vx>xJEl1Jd`Ha@&YLu8ANc3D>P}Y3xg*&;E<|-SwgqhQN=!#jAF(!VW zX~w0rP#-(E=;~Rb`n&bf;MGP~shy(SGS3c89YC+# zWRWv7rk=HWqmoF)H*iuvHX->hy`NL-*T1izYvk_KApW$lU}Mhc4&u4AdIN=99wqfu zBLMHzMJQB0&G1h`J?pC4q^A^&=910X@g>G4_ThTNZ) z(ebdbAx$;nGy7p3H&*~(u3>)CXz33kh*tRODN6;rkc`8({=ypD>;hb}2|FH2+0K8o zI&ki=nz(EyoIq}e{Ea*5m{{x3+ERR|&{S=DUatxu?yB^~hr5hB6Uc|{XtR_F2(K*sH8+7n{aI0vVdlc_)Y02B@o`!dxIG;UR3vJ1$5@4BPhoO#VM zsea$lsmtCbrB_={==2Lf*1f%g-~sonMP7e<(XXr?DYIGG%%!XJ0`in+DLL!!EE@m) zn;8*>_m1uCkn&3|gGMI{R#V&~-v>%h0WJBKq31q>S+U3EB{0z?$}V|K0n?$eX4pAK z2F%u15`*drxtS4P#u5wf7naQ~#C9lgZlnOM`{`?%(aH9_rk{!zr z|J9^^^wN8%yjFpO!CpKxORnx>a#1*BDM-SokDf=~@r9@dO6EJi9Jtp@vShFVywX}8 zG-(7BY4^+M;z2uE?+S)#vu{JM1%5=7me?0mj3*WvnWqW5@-xW5cuoiZ={%<_6 zV#GLGPwsQtKMl}j35ET_o+qvEe~{pRBmxs-V2{*?DX8~f5`*^W1<8v%&e)1nATPN& zyWMmi)c;G%Ms9VOOjwWBr}dJ(p-KWeTy#enBi!8A?r9yiL3Qf!(c@Xbn@Kq@`3=Dm=rMdr;J}rXY=;ayunYxoy;K>%g~TnGa-yiSynxX)Wug`;p1P+m$*)% zl7Kz@w}j5w42t_0{PGf`y1(v(4V@>osk9Jv-|nX{L7N`6b-gAIt42>vv#3EC+n+)t z4+$Vz#AYTZt>egPMNJmgLRRe7^JHscni1z-Oi7oKkfg!dB=+3!00RtfyurpC1;-Sj zMI7)T#1|B;0J9pZ*jRD+-!!5K1btNZKO6Gq!df;_iNzj7(6G@J^kDM@6-If+QSIW^ r_5-duT9Y4ab=$MPhaxyw%6CVv4j%bXu{_LL0<_fhUw%`ufB$~~4QxEK literal 0 HcmV?d00001 diff --git a/Wallet/Icons.xcassets/AppIconLLC.appiconset/BlueIconLargeIpad@2x.png b/Wallet/Icons.xcassets/AppIconLLC.appiconset/BlueIconLargeIpad@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9bf363744d5396c63ad2d96fdbc4967db4216582 GIT binary patch literal 5604 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 XqDnb;ef`Bt00000NkvXXu0mjf`=w&E literal 0 HcmV?d00001 diff --git a/Wallet/Icons.xcassets/AppIconLLC.appiconset/BlueNotificationIcon@2x.png b/Wallet/Icons.xcassets/AppIconLLC.appiconset/BlueNotificationIcon@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0898af42d998a1fd6984552e31faaa6981e34d31 GIT binary patch literal 1781 zcmV%0n21%g$#9drp@xl33W@2{m!nP0D4tj+`v zx=vUzbshoZLNJ{mjxq32XM8=s;du`<%P`n9Y%!`Np|IuQ8S$`81sG#spq`wmdVXDl zdfA{bzY^9C&Ug{*jwd6m=A1ea)ow25r|zan;YkAkMW+Xwn5a;Sdr4{%P>{q29jymB zw*|p8ago0nkjxo!Tdpq89mn~G2p!ZcnKOe$X$3k<2l7~w)HEA^DJhQSb9g44jS$Xd zQ(`CiK`@!PPyU$^JV0w1aNB5l{x1MLslrV2P0u?P@K_))npYx)NJC zPp{Vo#-BH)-T8AkXcReMeL~PD&}xOxJH8c9U-OoV}Xr9T=?6JNJqG$uj5wj)Xp^(S#_7*7d6J9c4qtcqtZV-Dc?Lf zU&-ZTuTE5Dcw7m(q74f9tw|18_3T9*-dis2-p*#(v9?pTukMt2<$Nbxm|{n=_w<E-h+=VD9hUqcFD6#J7#?wk@*kp+O{KC zC{di*wiDB_ZE{w{MpgTxLfF0tzjKR0E4W>8m)5QhHiOvO;@d@i5*@0=*&%d z>*%PAO-It*)+7g>Ss;%tY)fK_l!Tza#ks&_i=D^&@yG3tU+tiM2WSWzR1jT~z2_q<0#2`knBJoapI=^)%}eLVhTaY- zHzPn~awd{}zh0Afe;Sn=Q*l+x=C;V8=N8GbuKWvOi-O1UFaDCj>-f~e7RR_ji1|wL z;qTg}yvr=8%w08jgCAPZZs+UxEjpe)wlx4Qw-f@$}OtdKxCDE9?b{lI@K#U{A5xu}GTi-a~LBe;|uE zNJkuU;ObP2-{AA~75&B{hA)YoZ~;O4SwSn9)JcCK^&CK4*c*p0$vgccb~YQ~cxuEE z#Jvk_NYjA_8=9bh%1H^r87DHMk#GUj6TgckVFQX3vnqRzjmX1a4a$jO{l2R+PF}`0 zV35;t1^8-<30k6p1vsBrX#WOL31W6;RVE};{nX{#vi|EqdGF}3OrsMu#>pWiXoS3+ zuGqMHDW;x5m$)Edjs#;NYy3@3S7mqqkgWf5Ku(V2yLsWplw2CqGi$|a1(YZTn3N7b zK7+N+0D`y`rfX%CbqYGJU3%p60on88kj!}9{Px_nwEOs21`edJC)icJGd?&`doSX8 zyeF@i^cqO71}`j7*Y&i^%MZ*KeB$r=?xKuNq<3g06ik=`4%JKY{_&I`n7fPF7E*`& zKSn|R_;brojv#+z=0S>d$_$hnqxcYYzp-s XqDnb;ef`Bt00000NkvXXu0mjf`=w&E literal 0 HcmV?d00001 diff --git a/Wallet/Icons.xcassets/AppIconLLC.appiconset/BlueNotificationIcon@3x.png b/Wallet/Icons.xcassets/AppIconLLC.appiconset/BlueNotificationIcon@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f7725e9914ccb92344b4212199c93cfd2e5efb49 GIT binary patch literal 3428 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 z%0Aw8EN)91NFt4?(N)Je{bAbxe#WCrJj7WJbbE#N_8QCRoGR{{9u%}bmXy49%tY(6 zYF_V{+3nd&XE~Qm!OLaz8Y7o7)k;*}aXC(#FqZ z_V#YGDoB3`D!KhaGEPbYVOw1Hsp7wX5MlZH#Lg;_7k>D8LeNHJ7NY4;3=nT+#3tR5 z_apsUgS;mvUYe=D!6t;l9efa0f6373h;0DW-T6Ojb?`M%3=&lVafG+KV^0*UB`or) zhuAKr(rq0}-iEcj7G<9iNG_kheoF6D@^Kf+XY{MH@!Fbq!JRX4sQ^9KaC*H|_@s6i z9b8J#4 z4fBtRQg}3bo%W~Yf^}$vaxBA?tZ=oK;3pFUl^vl2om##cVB(|fIS?G#Hf(3}M3^5T za=C>RJK$W~BO2tr`DbEvc~CQKT}`cjY>l(VML+=? zQk7~Wc^*0S&rM$upXp*iMk?~ni)O^1P)+t$v4|$N<-2dw&l!0HYCe?XM7Z})voPQ~ zOJX2O{{H&nvMn>O26_Eyp1a6`k^nll7!Q2ak8tZZD-=@D`A(Lh;^72FGmx@9{-gRiUb*3z9{u}{% zs8+}D+3rnBdUK%tgYCWlYMb?Cpt$%mXwjeM15KOtCr|x(TfbVo z=!l6i0cye%S z@C4rXAF$RH?wQU+rOIkHZOIO-!AVFKqgOYXWtwqCu`Rk&#}0k2huq>qE;cuGXq8xa zik!*clDNmo%1yT6A|~Nf*!Uz6Bk(7b{@o8MfS^$;NKBkmJBCPlH--i*7htLdJ;Q*1 zD&^{>=0^p0oiim4)#{vn$ou5GSBrU=(mqKU3m7uMXShgJDN=&B0Eu1}DjQCFX#PzG zsTu77c+)O8EWm7tug}zUJxtNIEhBms@r|U^l-aoC)iMV}N`B?X7p<=%dUH>%uxBl@ z4m{KT?K^Pk!#|R}ubUqy*HKH9YwSRU+M&>zp9ga}AAgJA&A}RaU2plJIA%pOul3H) zIACuxP-h$zJ+f?RP;fg@JF}%4qZRtDl#)V_{ZolXQfvt~5lwpBRQiYSTgkym3JQKXipZ7gH$BVnHRn&!Jl(H09tR)$0d#$kmybB!`C=hiVu#ec z&a+}c94RjU;fMyE;?~mx5A&tUKC>Z0t%oA z=nefb_Zt<^ecW1>hVmBSa=nf-yITun*J0aIf@=wCOoM=9PhIw~ZLvTRX#SEg9l7h- zIpK8dK{$D=FElaxSh(NQM$m*=K}lMYfKKimP`Xr7zBxP7_wz`Zb#Aky(o(S4r6t6%J*+t}EGwuXpGwYTt=U-6&@PMRcX z^{Mx|=HGu6%~H=%7C@}Qb~NDymN~Z38WMZZ&98jWaPV*-ckD>VYK-e=m?7mhoLvzN z%ef2E|F=b@XN-SrV;+V%+NTZD(;E8wnKn|590q@S_O?Z&_`>5}jb3Kjw-nu!0o9UU z1)A3YA(NJtfbd;zVn^F76XSnevlw#-aZ(hIGxBqYDK}uViSA9H8QjnR{*4B-)T~_HHi$J7W^}0zm;Oqy@CUy0*}*a($|7!-I`qQF7vuQJ_r< zTsgo4Ed7aO+tvL{l25qj1S=yNQa)uRjRa$@1ATzQW@{h!QT`&b3Y zI6UAWGDG+RD)kIRw8!-=2LVfu&$M4T-w%Qd(Bh-UZ%58S?MqMHb>TlUapl!23E2Q}7Db+ECW-J%JPJc)M8n34D5 z?UFqn^4?77RsxLLz#L>@)6@k?TrQAI*SLj>M^S)Oqrs!xr+op_0;QgOG#xB+O%%gv zu4)I;2AR0K@ zr$>$KxnQMw$Xq;g7;5L&?Dj5SB)RkHar@5&TJPo&AX2$-!P0TCqO0)UL^v(!TijAX z9i|NbMjq>G=)=^~W98HoAyO>Aq}~H&JX-K8#Ih+BP?%)%d!C?V34NgNAi)0V5;IfG z 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

O_A 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 Ql>h($07*qoM6N<$f}8nDVE_OC literal 0 HcmV?d00001 diff --git a/Wallet/Icons.xcassets/AppIconLLC.appiconset/Simple@40x40-1.png b/Wallet/Icons.xcassets/AppIconLLC.appiconset/Simple@40x40-1.png new file mode 100644 index 0000000000000000000000000000000000000000..a79cb5dcdc06b480e459196f14e78b51a4f8f41d GIT binary patch literal 1840 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 literal 0 HcmV?d00001 diff --git a/Wallet/Icons.xcassets/Contents.json b/Wallet/Icons.xcassets/Contents.json new file mode 100644 index 0000000000..da4a164c91 --- /dev/null +++ b/Wallet/Icons.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Wallet/Info.plist b/Wallet/Info.plist index d8ada8d0f8..1dcbb9f34b 100644 --- a/Wallet/Info.plist +++ b/Wallet/Info.plist @@ -12,166 +12,20 @@ $(EXECUTABLE_NAME) CFBundleIcons - CFBundleAlternateIcons - - Black - - CFBundleIconFiles - - BlackIcon - BlackNotificationIcon - - UIPrerenderedIcon - - - BlackClassic - - CFBundleIconFiles - - BlackClassicIcon - BlackClassicNotificationIcon - - UIPrerenderedIcon - - - BlackFilled - - CFBundleIconFiles - - BlackFilledIcon - - UIPrerenderedIcon - - - Blue - - CFBundleIconFiles - - BlueIcon - BlueNotificationIcon - - UIPrerenderedIcon - - - BlueClassic - - CFBundleIconFiles - - BlueClassicIcon - BlueClassicNotificationIcon - - UIPrerenderedIcon - - - BlueFilled - - CFBundleIconFiles - - BlueFilledIcon - - UIPrerenderedIcon - - - WhiteFilled - - CFBundleIconFiles - - WhiteFilledIcon - - UIPrerenderedIcon - - - CFBundlePrimaryIcon CFBundleIconName - AppIconLLC + AppIconWallet UIPrerenderedIcon CFBundleIcons~ipad - CFBundleAlternateIcons - - Black - - CFBundleIconFiles - - BlackIconIpad - BlackIconLargeIpad - BlackNotificationIcon - - UIPrerenderedIcon - - - BlackClassic - - CFBundleIconFiles - - BlackClassicIconIpad - BlackClassicIconLargeIpad - BlackClassicNotificationIcon - - UIPrerenderedIcon - - - BlackFilled - - CFBundleIconFiles - - BlackFilledIconIpad - BlackFilledIconLargeIpad - - UIPrerenderedIcon - - - Blue - - CFBundleIconFiles - - BlueIconIpad - BlueIconLargeIpad - BlueNotificationIcon - - UIPrerenderedIcon - - - BlueClassic - - CFBundleIconFiles - - BlueClassicIconIpad - BlueClassicIconLargeIpad - BlueClassicNotificationIcon - - UIPrerenderedIcon - - - BlueFilled - - CFBundleIconFiles - - BlueFilledIconIpad - BlueFilledIconLargeIpad - - UIPrerenderedIcon - - - WhiteFilled - - CFBundleIconFiles - - WhiteFilledIcon - - UIPrerenderedIcon - - - CFBundlePrimaryIcon CFBundleIconName - AppIconLLC + AppIconWallet UIPrerenderedIcon @@ -190,27 +44,6 @@ ???? CFBundleURLTypes - - CFBundleTypeRole - Viewer - CFBundleURLName - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleURLSchemes - - telegram - - - - CFBundleTypeRole - Viewer - CFBundleURLName - $(PRODUCT_BUNDLE_IDENTIFIER).compatibility - CFBundleURLSchemes - - tg - $(APP_SPECIFIC_URL_SCHEME) - - CFBundleTypeRole Viewer @@ -226,38 +59,6 @@ ${BUILD_NUMBER} ITSAppUsesNonExemptEncryption - LSApplicationQueriesSchemes - - instagram - comgooglemaps-x-callback - foursquare - here-location - yandexmaps - yandexnavi - comgooglemaps - youtube - twitter - vk - waze - googlechrome - googlechromes - firefox - touch-http - touch-https - yandexbrowser-open-url - vimeo - vine - coub - uber - citymapper - lyft - opera-http - opera-https - firefox-focus - ddgQuickLink - moovit - alook - LSRequiresIPhoneOS NSAppTransportSecurity @@ -265,43 +66,8 @@ NSAllowsArbitraryLoads - NSCameraUsageDescription - We need this so that you can take and share photos and videos. - NSContactsUsageDescription - Telegram stores your contacts heavily encrypted in the cloud to let you connect with your friends across all your devices. NSFaceIDUsageDescription - You can use Face ID to unlock the app. - NSLocationAlwaysUsageDescription - When you send your location to your friends, Telegram needs access to show them a map. You also need this to send locations from an Apple Watch. - NSLocationWhenInUseUsageDescription - When you send your location to your friends, Telegram needs access to show them a map. - NSMicrophoneUsageDescription - We need this so that you can record and share voice messages and videos with sound. - NSMotionUsageDescription - When you send your location to your friends, Telegram needs access to show them a map. - NSPhotoLibraryAddUsageDescription - We need this so that you can share photos and videos from your photo library. - NSPhotoLibraryUsageDescription - We need this so that you can share photos and videos from your photo library. - NSSiriUsageDescription - You can use Siri to send messages. - NSUserActivityTypes - - INSendMessageIntent - RemindAboutChatIntent - - UIAppFonts - - SFCompactRounded-Semibold.otf - - UIBackgroundModes - - audio - fetch - location - remote-notification - voip - + For better security, please allow TON Wallet to use your Face ID to authenticate payments. UIDeviceFamily 1 @@ -338,29 +104,5 @@ UIViewGroupOpacity - UTImportedTypeDeclarations - - - UTTypeConformsTo - - public.data - - UTTypeDescription - Telegram iOS Color Theme File - UTTypeIconFiles - - BlueIcon@3x.png - - UTTypeIdentifier - org.telegram.Telegram-iOS.theme - UTTypeTagSpecification - - public.filename-extension - - tgios-theme - - - - diff --git a/Wallet/InfoPlistStrings/en.lproj/InfoPlist.strings b/Wallet/InfoPlistStrings/en.lproj/InfoPlist.strings new file mode 100644 index 0000000000..1fc9a923ce --- /dev/null +++ b/Wallet/InfoPlistStrings/en.lproj/InfoPlist.strings @@ -0,0 +1,5 @@ +/* Localized versions of Info.plist keys */ + +"NSCameraUsageDescription" = "We need this so that you can take and share photos and videos."; +"NSPhotoLibraryUsageDescription" = "We need this so that you can share photos and videos from your photo library."; +"NSFaceIDUsageDescription" = "For better security, please allow TON Wallet to use your Face ID to authenticate payments."; diff --git a/Wallet/LaunchScreen.xib b/Wallet/LaunchScreen.xib new file mode 100644 index 0000000000..9584dae552 --- /dev/null +++ b/Wallet/LaunchScreen.xib @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/Wallet/Sources/AppDelegate.swift b/Wallet/Sources/AppDelegate.swift index 9fb7caa44a..bcffbee986 100644 --- a/Wallet/Sources/AppDelegate.swift +++ b/Wallet/Sources/AppDelegate.swift @@ -1,8 +1,9 @@ import UIKit import Display -import TelegramPresentationData -import WalletUI import SwiftSignalKit +import BuildConfig +import WalletUI +import WalletCore private func encodeText(_ string: String, _ key: Int) -> String { var result = "" @@ -119,10 +120,166 @@ private class ApplicationStatusBarHost: StatusBarHost { } } +private let records = Atomic<[WalletStateRecord]>(value: []) + +private final class WalletStorageInterfaceImpl: WalletStorageInterface { + func watchWalletRecords() -> Signal<[WalletStateRecord], NoError> { + return .single(records.with { $0 }) + } + + func getWalletRecords() -> Signal<[WalletStateRecord], NoError> { + return .single(records.with { $0 }) + } + + func updateWalletRecords(_ f: @escaping ([WalletStateRecord]) -> [WalletStateRecord]) -> Signal<[WalletStateRecord], NoError> { + return .single(records.modify(f)) + } +} + +private final class WalletContextImpl: WalletContext { + let storage: WalletStorageInterface + let tonInstance: TonInstance + let keychain: TonKeychain + let presentationData: WalletPresentationData + + var inForeground: Signal { + return .single(true) + } + + func getServerSalt() -> Signal { + return .single(Data()) + } + + func presentNativeController(_ controller: UIViewController) { + + } + + func idleTimerExtension() -> Disposable { + return EmptyDisposable + } + + func openUrl(_ url: String) { + + } + + func shareUrl(_ url: String) { + + } + + func openPlatformSettings() { + + } + + func authorizeAccessToCamera(completion: @escaping () -> Void) { + completion() + } + + func pickImage(completion: @escaping (UIImage) -> Void) { + } + + init(basePath: String, config: String, blockchainName: String, navigationBarTheme: NavigationBarTheme) { + self.storage = WalletStorageInterfaceImpl() + self.tonInstance = TonInstance( + basePath: basePath, + config: config, + blockchainName: blockchainName, + proxy: nil + ) + self.keychain = TonKeychain(encryptionPublicKey: { + return .single(Data()) + }, encrypt: { data in + return .single(TonKeychainEncryptedData(publicKey: Data(), data: data)) + }, decrypt: { data in + return .single(data.data) + }) + let accentColor = UIColor(rgb: 0x007ee5) + self.presentationData = WalletPresentationData( + theme: WalletTheme( + info: WalletInfoTheme( + incomingFundsTitleColor: UIColor(rgb: 0x00b12c), + outgoingFundsTitleColor: UIColor(rgb: 0xff3b30) + ), setup: WalletSetupTheme( + buttonFillColor: accentColor, + buttonForegroundColor: .white, + inputBackgroundColor: UIColor(rgb: 0xe9e9e9), + inputPlaceholderColor: UIColor(rgb: 0x818086), + inputTextColor: .black, + inputClearButtonColor: UIColor(rgb: 0x7b7b81).withAlphaComponent(0.8) + ), + list: WalletListTheme( + itemPrimaryTextColor: .black, + itemSecondaryTextColor: UIColor(rgb: 0x8e8e93), + itemPlaceholderTextColor: UIColor(rgb: 0xc8c8ce), + itemDestructiveColor: UIColor(rgb: 0xff3b30), + itemAccentColor: accentColor, + itemDisabledTextColor: UIColor(rgb: 0x8e8e93), + plainBackgroundColor: .white, + blocksBackgroundColor: UIColor(rgb: 0xefeff4), + itemPlainSeparatorColor: UIColor(rgb: 0xc8c7cc), + itemBlocksBackgroundColor: .white, + itemBlocksSeparatorColor: UIColor(rgb: 0xc8c7cc), + itemHighlightedBackgroundColor: UIColor(rgb: 0xe5e5ea), + sectionHeaderTextColor: UIColor(rgb: 0x6d6d72), + freeTextColor: UIColor(rgb: 0x6d6d72), + freeTextErrorColor: UIColor(rgb: 0xcf3030), + inputClearButtonColor: UIColor(rgb: 0xcccccc) + ), + statusBarStyle: .Black, + navigationBar: navigationBarTheme, + keyboardAppearance: .light, + alert: AlertControllerTheme( + backgroundType: .light, + backgroundColor: .white, + separatorColor: UIColor(white: 0.9, alpha: 1.0), + highlightedItemColor: UIColor(rgb: 0xe5e5ea), + primaryColor: .black, + secondaryColor: UIColor(rgb: 0x5e5e5e), + accentColor: accentColor, + destructiveColor: UIColor(rgb: 0xff3b30), + disabledColor: UIColor(rgb: 0xd0d0d0) + ), + actionSheet: ActionSheetControllerTheme( + dimColor: UIColor(white: 0.0, alpha: 0.4), + backgroundType: .light, + itemBackgroundColor: .white, + itemHighlightedBackgroundColor: UIColor(white: 0.9, alpha: 1.0), + standardActionTextColor: accentColor, + destructiveActionTextColor: UIColor(rgb: 0xff3b30), + disabledActionTextColor: UIColor(rgb: 0xb3b3b3), + primaryTextColor: .black, + secondaryTextColor: UIColor(rgb: 0x5e5e5e), + controlAccentColor: accentColor, + controlColor: UIColor(rgb: 0x7e8791), + switchFrameColor: UIColor(rgb: 0xe0e0e0), + switchContentColor: UIColor(rgb: 0x77d572), + switchHandleColor: UIColor(rgb: 0xffffff) + ) + ), strings: WalletStrings( + primaryComponent: WalletStringsComponent( + languageCode: "en", + localizedName: "English", + pluralizationRulesCode: "en", + dict: [:] + ), + secondaryComponent: nil, + groupingSeparator: " " + ), dateTimeFormat: WalletPresentationDateTimeFormat( + timeFormat: .regular, + dateFormat: .dayFirst, + dateSeparator: ".", + decimalSeparator: ".", + groupingSeparator: " " + ) + ) + } +} + @objc(AppDelegate) final class AppDelegate: NSObject, UIApplicationDelegate { var window: UIWindow? - var mainWindow: Window1? + + private var mainWindow: Window1? + private var walletContext: WalletContextImpl? func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool { let statusBarHost = ApplicationStatusBarHost() @@ -131,11 +288,61 @@ final class AppDelegate: NSObject, UIApplicationDelegate { hostView.containerView.backgroundColor = UIColor.white self.window = window - let navigationController = NavigationController(mode: .single, theme: NavigationControllerTheme(presentationTheme: defaultPresentationTheme), backgroundDetailsMode: nil) - navigationController.setViewControllers([], animated: false) + let navigationBarTheme = NavigationBarTheme( + buttonColor: .blue, + disabledButtonColor: .gray, + primaryTextColor: .black, + backgroundColor: .lightGray, + separatorColor: .black, + badgeBackgroundColor: .red, + badgeStrokeColor: .red, + badgeTextColor: .white + ) + + let navigationController = NavigationController( + mode: .single, + theme: NavigationControllerTheme( + statusBar: .black, + navigationBar: navigationBarTheme, + emptyAreaColor: .white + ), backgroundDetailsMode: nil + ) + + let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] + + let config = +""" +{ + "liteservers": [ + { + "ip": 1137658550, + "port": 4924, + "id": { + "@type": "pub.ed25519", + "key": "peJTw/arlRfssgTuf9BMypJzqOi7SXEqSPSWiEw2U1M=" + } + } + ], + "validator": { + "@type": "validator.config.global", + "zero_state": { + "workchain": -1, + "shard": -9223372036854775808, + "seqno": 0, + "root_hash": "VCSXxDHhTALFxReyTZRd8E4Ya3ySOmpOWAS4rBX9XBY=", + "file_hash": "eh9yveSz1qMdJ7mOsO+I+H77jkLr9NpAuEkoJuseXBo=" + } + } +} +""" + + let walletContext = WalletContextImpl(basePath: documentsPath, config: config, blockchainName: "testnet", navigationBarTheme: navigationBarTheme) + self.walletContext = walletContext + + let splashScreen = WalletSplashScreen(context: walletContext, mode: .intro, walletCreatedPreloadState: nil) + + navigationController.setViewControllers([splashScreen], animated: false) self.mainWindow?.viewController = navigationController - navigationController.presentOverlay(controller: standardTextAlertController(theme: AlertControllerTheme(presentationTheme: defaultPresentationTheme), title: "Test", text: "Text", actions: [TextAlertAction(type: .defaultAction, title: "OK", action: { - })]), inGlobal: false) self.window?.makeKeyAndVisible() diff --git a/Wallet/Strings/ar.lproj/Localizable.strings b/Wallet/Strings/ar.lproj/Localizable.strings new file mode 100644 index 0000000000..e69de29bb2 diff --git a/Wallet/Strings/ca.lproj/Localizable.strings b/Wallet/Strings/ca.lproj/Localizable.strings new file mode 100644 index 0000000000..e69de29bb2 diff --git a/Wallet/Strings/de.lproj/Localizable.strings b/Wallet/Strings/de.lproj/Localizable.strings new file mode 100644 index 0000000000..e69de29bb2 diff --git a/Wallet/Strings/en.lproj/Localizable.strings b/Wallet/Strings/en.lproj/Localizable.strings new file mode 100644 index 0000000000..9697a8a2ba --- /dev/null +++ b/Wallet/Strings/en.lproj/Localizable.strings @@ -0,0 +1,193 @@ +"Wallet.Updated.JustNow" = "just now"; +"Wallet.Updated.MinutesAgo_0" = "%@ minutes ago"; //three to ten +"Wallet.Updated.MinutesAgo_1" = "1 minute ago"; //one +"Wallet.Updated.MinutesAgo_2" = "2 minutes ago"; //two +"Wallet.Updated.MinutesAgo_3_10" = "%@ minutes ago"; //three to ten +"Wallet.Updated.MinutesAgo_many" = "%@ minutes ago"; // more than ten +"Wallet.Updated.MinutesAgo_any" = "%@ minutes ago"; // more than ten +"Wallet.Updated.HoursAgo_0" = "%@ hours ago"; +"Wallet.Updated.HoursAgo_1" = "1 hour ago"; +"Wallet.Updated.HoursAgo_2" = "2 hours ago"; +"Wallet.Updated.HoursAgo_3_10" = "%@ hours ago"; +"Wallet.Updated.HoursAgo_any" = "%@ hours ago"; +"Wallet.Updated.HoursAgo_many" = "%@ hours ago"; +"Wallet.Updated.HoursAgo_0" = "%@ hours ago"; +"Wallet.Updated.YesterdayAt" = "yesterday at %@"; +"Wallet.Updated.AtDate" = "%@"; +"Wallet.Updated.TodayAt" = "today at %@"; +"Wallet.Info.WalletCreated" = "Wallet Created"; +"Wallet.Info.Address" = "Your wallet address"; +"Wallet.Info.YourBalance" = "your balance"; +"Wallet.Info.Receive" = "Receive"; +"Wallet.Info.Send" = "Send"; +"Wallet.Info.RefreshErrorTitle" = "No network"; +"Wallet.Info.RefreshErrorText" = "Couldn't refresh balance. Please make sure your internet connection is working and try again."; +"Wallet.Info.RefreshErrorNetworkText" = "The wallet state can not be retrieved at this time. Please try again later."; +"Wallet.Info.UnknownTransaction" = "Empty Transaction"; +"Wallet.Info.TransactionTo" = "to"; +"Wallet.Info.TransactionFrom" = "from"; +"Wallet.Info.Updating" = "updating"; +"Wallet.Info.TransactionBlockchainFee" = "%@ blockchain fee"; +"Wallet.Info.TransactionPendingHeader" = "Pending"; +"Wallet.Qr.ScanCode" = "Scan QR Code"; +"Wallet.Qr.Title" = "QR Code"; +"Wallet.Receive.Title" = "Receive Grams"; +"Wallet.Receive.AddressHeader" = "YOUR WALLET ADDRESS"; +"Wallet.Receive.InvoiceUrlHeader" = "INVOICE URL"; +"Wallet.Receive.CopyAddress" = "Copy Wallet Address"; +"Wallet.Receive.CopyInvoiceUrl" = "Copy Invoice URL"; +"Wallet.Receive.ShareAddress" = "Share Wallet Address"; +"Wallet.Receive.ShareInvoiceUrl" = "Share Invoice URL"; +"Wallet.Receive.ShareUrlInfo" = "Share this link with other Gram wallet owners to receive Grams from them."; +"Wallet.Receive.AmountHeader" = "AMOUNT"; +"Wallet.Receive.AmountText" = "Grams to receive"; +"Wallet.Receive.AmountInfo" = "You can specify amount and purpose of the payment to save the sender some time."; +"Wallet.Receive.CommentHeader" = "COMMENT (OPTIONAL)"; +"Wallet.Receive.CommentInfo" = "Description of the payment"; +"Wallet.Receive.AddressCopied" = "Address copied to clipboard."; +"Wallet.Receive.InvoiceUrlCopied" = "Invoice URL copied to clipboard."; +"Wallet.Send.Title" = "Send Grams"; +"Wallet.Send.AddressHeader" = "RECIPIENT WALLET ADDRESS"; +"Wallet.Send.AddressText" = "Enter wallet address..."; +"Wallet.Send.AddressInfo" = "Paste the 48-letter address of the recipient here or ask them to send you a ton:// link."; +"Wallet.Send.Balance" = "Balance: %@"; +"Wallet.Send.AmountText" = "Grams to send"; +"Wallet.Send.Confirmation" = "Confirmation"; +"Wallet.Send.ConfirmationText" = "Do you want to send **%1$@** Grams to\n%2$@?"; +"Wallet.Send.ConfirmationConfirm" = "Confirm"; +"Wallet.Send.Send" = "Send"; +"Wallet.Settings.Title" = "Wallet Settings"; +"Wallet.Settings.DeleteWallet" = "Delete Wallet"; +"Wallet.Settings.DeleteWalletInfo" = "This will disconnect the wallet from this app. You will be able to restore your wallet using 24 secret words – or import another wallet.\n\nWallets are located in the TON Blockchain, which is not controlled by Telegram. If you want a wallet to be deleted, simply transfer all the grams from it and leave it empty."; +"Wallet.Intro.NotNow" = "Not Now"; +"Wallet.Intro.ImportExisting" = "Import existing wallet"; +"Wallet.Intro.CreateErrorTitle" = "An Error Occurred"; +"Wallet.Intro.CreateErrorText" = "Sorry. Please try again."; +"Wallet.Intro.Title" = "Gram Wallet"; +"Wallet.Intro.Text" = "The gram wallet allows you to make fast and secure blockchain-based payments without intermediaries."; +"Wallet.Intro.CreateWallet" = "Create My Wallet"; +"Wallet.Intro.Terms" = "By creating a wallet you accept the\n[Terms of Conditions]()."; +"Wallet.Intro.TermsUrl" = "https://telegram.org/tos/wallet"; +"Wallet.Created.Title" = "Congratulations"; +"Wallet.Created.Text" = "Your Gram wallet has just been created. Only you control it.\n\nTo be able to always have access to it, please write down secret words and\nset up a secure passcode."; +"Wallet.Created.Proceed" = "Proceed"; +"Wallet.Created.ExportErrorTitle" = "Error"; +"Wallet.Created.ExportErrorText" = "Encryption error. Please make sure you have enabled a device passcode in iOS settings and try again."; +"Wallet.Completed.Title" = "Ready to go!"; +"Wallet.Completed.Text" = "You’re all set. Now you have a wallet that only you control - directly, without middlemen or bankers."; +"Wallet.Completed.ViewWallet" = "View My Wallet"; +"Wallet.RestoreFailed.Title" = "Too Bad"; +"Wallet.RestoreFailed.Text" = "Without the secret words, you can't\nrestore access to your wallet."; +"Wallet.RestoreFailed.CreateWallet" = "Create a New Wallet"; +"Wallet.RestoreFailed.EnterWords" = "Enter 24 words"; +"Wallet.Sending.Title" = "Sending Grams"; +"Wallet.Sending.Text" = "Please wait a few seconds for your transaction to be processed..."; +"Wallet.Sending.Title" = "Sending Grams"; +"Wallet.Sent.Title" = "Done!"; +"Wallet.Sent.Text" = "**%@ Grams** have been sent."; +"Wallet.Sent.ViewWallet" = "View My Wallet"; +"Wallet.SecureStorageNotAvailable.Title" = "Set a Passcode"; +"Wallet.SecureStorageNotAvailable.Text" = "Please set up a Passcode on your device to enable secure payments with your Gram wallet."; +"Wallet.SecureStorageReset.Title" = "Security Settings Have Changed"; +"Wallet.SecureStorageReset.BiometryTouchId" = "Touch ID"; +"Wallet.SecureStorageReset.BiometryFaceId" = "Face ID"; +"Wallet.SecureStorageReset.BiometryText" = "Unfortunately, your wallet is no longer available because your system Passcode or %@ has been turned off. Please enable them before proceeding."; +"Wallet.SecureStorageReset.PasscodeText" = "Unfortunately, your wallet is no longer available because your system Passcode has been turned off. Please enable it before proceeding."; +"Wallet.SecureStorageChanged.BiometryText" = "Unfortunately, your wallet is no longer available due to the change in your system security settings (Passcode/%@). To restore your wallet, tap \"Import existing wallet\"."; +"Wallet.SecureStorageChanged.PasscodeText" = "Unfortunately, your wallet is no longer available due to the change in your system security settings (Passcode). To restore your wallet, tap \"Import existing wallet\"."; +"Wallet.SecureStorageChanged.ImportWallet" = "Import Existing Wallet"; +"Wallet.SecureStorageChanged.CreateWallet" = "Create New Wallet"; +"Wallet.TransactionInfo.Title" = "Transaction"; +"Wallet.TransactionInfo.NoAddress" = "No Address"; +"Wallet.TransactionInfo.RecipientHeader" = "RECIPIENT"; +"Wallet.TransactionInfo.SenderHeader" = "SENDER"; +"Wallet.TransactionInfo.CopyAddress" = "Copy Wallet Address"; +"Wallet.TransactionInfo.AddressCopied" = "Address copied to clipboard."; +"Wallet.TransactionInfo.SendGrams" = "Send Grams"; +"Wallet.TransactionInfo.CommentHeader" = "COMMENT"; +"Wallet.TransactionInfo.StorageFeeHeader" = "STORAGE FEE"; +"Wallet.TransactionInfo.OtherFeeHeader" = "TRANSACTION FEE"; +"Wallet.TransactionInfo.StorageFeeInfo" = "Blockchain validators collect a tiny fee for storing information about your decentralized wallet. [More info]()"; +"Wallet.TransactionInfo.OtherFeeInfo" = "Blockchain validators collect a tiny fee for processing your decentralized transactions. [More info]()"; +"Wallet.TransactionInfo.FeeInfoURL" = "https://telegram.org/wallet/fee"; +"Wallet.WordCheck.Title" = "Test Time!"; +"Wallet.WordCheck.Text" = "Let’s check that you wrote them down correctly. Please enter words\n**%1$@**, **%2$@** and **%3$@** below:"; +"Wallet.WordCheck.Continue" = "Continue"; +"Wallet.WordCheck.IncorrectHeader" = "Incorrect words!"; +"Wallet.WordCheck.IncorrectText" = "The secret words you have entered do not match the ones in the list."; +"Wallet.WordCheck.TryAgain" = "Try Again"; +"Wallet.WordCheck.ViewWords" = "View Words"; +"Wallet.WordImport.Title" = "24 Secret Words"; +"Wallet.WordImport.Text" = "Please restore access to your wallet by\nentering the 24 secret words you wrote down when creating the wallet."; +"Wallet.WordImport.Continue" = "Continue"; +"Wallet.WordImport.CanNotRemember" = "I don't have them"; +"Wallet.WordImport.IncorrectTitle" = "Incorrect words"; +"Wallet.WordImport.IncorrectText" = "Sorry, you have entered incorrect secret words. Please double check and try again."; +"Wallet.Words.Title" = "24 Secret Words"; +"Wallet.Words.Text" = "Write down these 24 words in the correct order and store them in a secret place.\n\nUse these secret words to restore access to your wallet if you lose your passcode or Telegram account."; +"Wallet.Words.Done" = "Done"; +"Wallet.Words.NotDoneTitle" = "Sure Done?"; +"Wallet.Words.NotDoneText" = "You didn't have enough time to write those words down."; +"Wallet.Words.NotDoneOk" = "OK, Sorry"; +"Wallet.Words.NotDoneResponse" = "Apologies Accepted"; +"Wallet.Send.NetworkErrorTitle" = "No network"; +"Wallet.Send.NetworkErrorText" = "Couldn't send grams. Please make sure your internet connection is working and try again."; +"Wallet.Send.ErrorNotEnoughFundsTitle" = "Insufficient Grams"; +"Wallet.Send.ErrorNotEnoughFundsText" = "Unfortunately, your transfer couldn't be completed. You don't have enough grams."; +"Wallet.Send.ErrorInvalidAddress" = "Invalid wallet address. Please correct and try again."; +"Wallet.Send.ErrorDecryptionFailed" = "Please make sure that your device has a passcode set in iOS Settings and try again."; +"Wallet.Send.UninitializedTitle" = "Warning"; +"Wallet.Send.UninitializedText" = "This address belongs to an empty wallet. Are you sure you want to transfer grams to it?"; +"Wallet.Send.SendAnyway" = "Send Anyway"; +"Wallet.Receive.CreateInvoice" = "Create Invoice"; +"Wallet.Receive.CreateInvoiceInfo" = "You can specify amount and purpose of the payment to save the sender some time."; +"Wallet.CreateInvoice.Title" = "Create Invoice"; +"Wallet.Navigation.Close" = "Close"; +"Wallet.Navigation.Back" = "Back"; +"Wallet.Navigation.Done" = "Done"; +"Wallet.Navigation.Cancel" = "Cancel"; +"Wallet.Alert.OK" = "OK"; +"Wallet.Alert.Cancel" = "Cancel"; +"Wallet.Month.GenJanuary" = "January"; +"Wallet.Month.GenFebruary" = "February"; +"Wallet.Month.GenMarch" = "March"; +"Wallet.Month.GenApril" = "April"; +"Wallet.Month.GenMay" = "May"; +"Wallet.Month.GenJune" = "June"; +"Wallet.Month.GenJuly" = "July"; +"Wallet.Month.GenAugust" = "August"; +"Wallet.Month.GenSeptember" = "September"; +"Wallet.Month.GenOctober" = "October"; +"Wallet.Month.GenNovember" = "November"; +"Wallet.Month.GenDecember" = "December"; +"Wallet.Month.ShortJanuary" = "Jan"; +"Wallet.Month.ShortFebruary" = "Feb"; +"Wallet.Month.ShortMarch" = "Mar"; +"Wallet.Month.ShortApril" = "Apr"; +"Wallet.Month.ShortMay" = "May"; +"Wallet.Month.ShortJune" = "Jun"; +"Wallet.Month.ShortJuly" = "Jul"; +"Wallet.Month.ShortAugust" = "Aug"; +"Wallet.Month.ShortSeptember" = "Sep"; +"Wallet.Month.ShortOctober" = "Oct"; +"Wallet.Month.ShortNovember" = "Nov"; +"Wallet.Month.ShortDecember" = "Dec"; +"Wallet.Weekday.Today" = "Today"; +"Wallet.Weekday.Yesterday" = "Yesterday"; +"Wallet.Info.TransactionDateHeader" = "%1$@ %2$@"; +"Wallet.Info.TransactionDateHeaderYear" = "%1$@ %2$@, %3$@"; +"Wallet.UnknownError" = "An error occurred. Please try again later."; +"Wallet.ContextMenuCopy" = "Copy"; +"Wallet.Time.PreciseDate_m1" = "Jan %1$@, %2$@ at %3$@"; +"Wallet.Time.PreciseDate_m2" = "Feb %1$@, %2$@ at %3$@"; +"Wallet.Time.PreciseDate_m3" = "Mar %1$@, %2$@ at %3$@"; +"Wallet.Time.PreciseDate_m4" = "Apr %1$@, %2$@ at %3$@"; +"Wallet.Time.PreciseDate_m5" = "May %1$@, %2$@ at %3$@"; +"Wallet.Time.PreciseDate_m6" = "Jun %1$@, %2$@ at %3$@"; +"Wallet.Time.PreciseDate_m7" = "Jul %1$@, %2$@ at %3$@"; +"Wallet.Time.PreciseDate_m8" = "Aug %1$@, %2$@ at %3$@"; +"Wallet.Time.PreciseDate_m9" = "Sep %1$@, %2$@ at %3$@"; +"Wallet.Time.PreciseDate_m10" = "Oct %1$@, %2$@ at %3$@"; +"Wallet.Time.PreciseDate_m11" = "Nov %1$@, %2$@ at %3$@"; +"Wallet.Time.PreciseDate_m12" = "Dec %1$@, %2$@ at %3$@"; +"Wallet.VoiceOver.Editing.ClearText" = "Clear text"; diff --git a/Wallet/Strings/es.lproj/Localizable.strings b/Wallet/Strings/es.lproj/Localizable.strings new file mode 100644 index 0000000000..e69de29bb2 diff --git a/Wallet/Strings/fr.lproj/Localizable.strings b/Wallet/Strings/fr.lproj/Localizable.strings new file mode 100644 index 0000000000..e69de29bb2 diff --git a/Wallet/Strings/id.lproj/Localizable.strings b/Wallet/Strings/id.lproj/Localizable.strings new file mode 100644 index 0000000000..e69de29bb2 diff --git a/Wallet/Strings/it.lproj/Localizable.strings b/Wallet/Strings/it.lproj/Localizable.strings new file mode 100644 index 0000000000..e69de29bb2 diff --git a/Wallet/Strings/ko.lproj/Localizable.strings b/Wallet/Strings/ko.lproj/Localizable.strings new file mode 100644 index 0000000000..e69de29bb2 diff --git a/Wallet/Strings/ms.lproj/Localizable.strings b/Wallet/Strings/ms.lproj/Localizable.strings new file mode 100644 index 0000000000..e69de29bb2 diff --git a/Wallet/Strings/nl.lproj/Localizable.strings b/Wallet/Strings/nl.lproj/Localizable.strings new file mode 100644 index 0000000000..e69de29bb2 diff --git a/Wallet/Strings/pt.lproj/Localizable.strings b/Wallet/Strings/pt.lproj/Localizable.strings new file mode 100644 index 0000000000..e69de29bb2 diff --git a/Wallet/Strings/ru.lproj/Localizable.strings b/Wallet/Strings/ru.lproj/Localizable.strings new file mode 100644 index 0000000000..e69de29bb2 diff --git a/Wallet/Strings/tr.lproj/Localizable.strings b/Wallet/Strings/tr.lproj/Localizable.strings new file mode 100644 index 0000000000..e69de29bb2 diff --git a/Wallet/Strings/uk.lproj/Localizable.strings b/Wallet/Strings/uk.lproj/Localizable.strings new file mode 100644 index 0000000000..e69de29bb2 diff --git a/Wallet/Wallet.entitlements b/Wallet/Wallet.entitlements new file mode 100644 index 0000000000..6631ffa6f2 --- /dev/null +++ b/Wallet/Wallet.entitlements @@ -0,0 +1,6 @@ + + + + + + diff --git a/submodules/AccountContext/BUCK b/submodules/AccountContext/BUCK index 255438a28a..896ec1bb9d 100644 --- a/submodules/AccountContext/BUCK +++ b/submodules/AccountContext/BUCK @@ -15,6 +15,7 @@ static_library( "//submodules/SSignalKit/SwiftSignalKit:SwiftSignalKit#dynamic", "//submodules/Postbox:Postbox#dynamic", "//submodules/TelegramCore:TelegramCore#dynamic", + "//submodules/WalletCore:WalletCore", ], frameworks = [ "$SDKROOT/System/Library/Frameworks/Foundation.framework", diff --git a/submodules/AccountContext/Sources/AccountContext.swift b/submodules/AccountContext/Sources/AccountContext.swift index 03a75f467e..0540efdaa0 100644 --- a/submodules/AccountContext/Sources/AccountContext.swift +++ b/submodules/AccountContext/Sources/AccountContext.swift @@ -7,6 +7,7 @@ import SwiftSignalKit import Display import DeviceLocationManager import TemporaryCachedPeerDataManager +import WalletCore public final class TelegramApplicationOpenUrlCompletion { public let completion: (Bool) -> Void @@ -457,6 +458,26 @@ private final class TonInstanceData { var instance: TonInstance? } +private final class TonNetworkProxyImpl: TonNetworkProxy { + private let network: Network + + init(network: Network) { + self.network = network + } + + func request(data: Data, timeout timeoutValue: Double, completion: @escaping (TonNetworkProxyResult) -> Void) -> Disposable { + return (walletProxyRequest(network: self.network, data: data) + |> timeout(timeoutValue, queue: .concurrentDefaultQueue(), alternate: .fail(.generic(500, "Local Timeout")))).start(next: { data in + completion(.reponse(data)) + }, error: { error in + switch error { + case let .generic(_, text): + completion(.error(text)) + } + }) + } +} + public final class StoredTonContext { private let basePath: String private let postbox: Postbox @@ -477,7 +498,7 @@ public final class StoredTonContext { return TonContext(instance: instance, keychain: self.keychain) } else { data.config = config - let instance = TonInstance(basePath: self.basePath, config: config, blockchainName: blockchainName, network: enableProxy ? self.network : nil) + let instance = TonInstance(basePath: self.basePath, config: config, blockchainName: blockchainName, proxy: enableProxy ? TonNetworkProxyImpl(network: self.network) : nil) data.instance = instance return TonContext(instance: instance, keychain: self.keychain) } @@ -506,6 +527,7 @@ public protocol AccountContext: class { var peerChannelMemberCategoriesContextsManager: PeerChannelMemberCategoriesContextsManager { get } var wallpaperUploadManager: WallpaperUploadManager? { get } var watchManager: WatchManager? { get } + var hasWallets: Signal { get } var currentLimitsConfiguration: Atomic { get } diff --git a/submodules/ActivityIndicator/BUCK b/submodules/ActivityIndicator/BUCK index aa2ce7825c..fd29559549 100644 --- a/submodules/ActivityIndicator/BUCK +++ b/submodules/ActivityIndicator/BUCK @@ -7,7 +7,7 @@ static_library( ]), deps = [ "//submodules/AsyncDisplayKit:AsyncDisplayKit#shared", - "//submodules/TelegramPresentationData:TelegramPresentationData", + "//submodules/Display:Display#shared", ], frameworks = [ "$SDKROOT/System/Library/Frameworks/Foundation.framework", diff --git a/submodules/ActivityIndicator/Sources/ActivityIndicator.swift b/submodules/ActivityIndicator/Sources/ActivityIndicator.swift index ef3162a27f..205ef1c454 100644 --- a/submodules/ActivityIndicator/Sources/ActivityIndicator.swift +++ b/submodules/ActivityIndicator/Sources/ActivityIndicator.swift @@ -1,7 +1,19 @@ import Foundation import UIKit import AsyncDisplayKit -import TelegramPresentationData +import Display + +private func generateIndefiniteActivityIndicatorImage(color: UIColor, diameter: CGFloat = 22.0, lineWidth: CGFloat = 2.0) -> UIImage? { + return generateImage(CGSize(width: diameter, height: diameter), rotatedContext: { size, context in + context.clear(CGRect(origin: CGPoint(), size: size)) + context.setStrokeColor(color.cgColor) + context.setLineWidth(lineWidth) + context.setLineCap(.round) + let cutoutAngle: CGFloat = CGFloat.pi * 30.0 / 180.0 + context.addArc(center: CGPoint(x: size.width / 2.0, y: size.height / 2.0), radius: size.width / 2.0 - lineWidth / 2.0, startAngle: 0.0, endAngle: CGFloat.pi * 2.0 - cutoutAngle, clockwise: false) + context.strokePath() + }) +} private func convertIndicatorColor(_ color: UIColor) -> UIColor { if color.isEqual(UIColor(rgb: 0x007ee5)) { @@ -16,13 +28,13 @@ private func convertIndicatorColor(_ color: UIColor) -> UIColor { } public enum ActivityIndicatorType: Equatable { - case navigationAccent(PresentationTheme) + case navigationAccent(UIColor) case custom(UIColor, CGFloat, CGFloat, Bool) public static func ==(lhs: ActivityIndicatorType, rhs: ActivityIndicatorType) -> Bool { switch lhs { - case let .navigationAccent(lhsTheme): - if case let .navigationAccent(rhsTheme) = rhs, lhsTheme === rhsTheme { + case let .navigationAccent(lhsColor): + if case let .navigationAccent(rhsColor) = rhs, lhsColor.isEqual(rhsColor) { return true } else { return false @@ -46,15 +58,15 @@ public final class ActivityIndicator: ASDisplayNode { public var type: ActivityIndicatorType { didSet { switch self.type { - case let .navigationAccent(theme): - self.indicatorNode.image = PresentationResourcesRootController.navigationIndefiniteActivityImage(theme) + case let .navigationAccent(color): + self.indicatorNode.image = generateIndefiniteActivityIndicatorImage(color: color) case let .custom(color, diameter, lineWidth, _): self.indicatorNode.image = generateIndefiniteActivityIndicatorImage(color: color, diameter: diameter, lineWidth: lineWidth) } switch self.type { - case let .navigationAccent(theme): - self.indicatorView?.color = theme.rootController.navigationBar.controlColor + case let .navigationAccent(color): + self.indicatorView?.color = color case let .custom(color, _, _, _): self.indicatorView?.color = convertIndicatorColor(color) } @@ -90,8 +102,8 @@ public final class ActivityIndicator: ASDisplayNode { } switch type { - case let .navigationAccent(theme): - self.indicatorNode.image = PresentationResourcesRootController.navigationIndefiniteActivityImage(theme) + case let .navigationAccent(color): + self.indicatorNode.image = generateIndefiniteActivityIndicatorImage(color: color) case let .custom(color, diameter, lineWidth, forceCustom): self.indicatorNode.image = generateIndefiniteActivityIndicatorImage(color: color, diameter: diameter, lineWidth: lineWidth) if forceCustom { @@ -105,8 +117,8 @@ public final class ActivityIndicator: ASDisplayNode { let indicatorView = UIActivityIndicatorView(style: .whiteLarge) switch self.type { - case let .navigationAccent(theme): - indicatorView.color = theme.rootController.navigationBar.controlColor + case let .navigationAccent(color): + indicatorView.color = color case let .custom(color, _, _, forceCustom): indicatorView.color = convertIndicatorColor(color) if !forceCustom { diff --git a/submodules/AnimatedStickerNode/BUCK b/submodules/AnimatedStickerNode/BUCK new file mode 100644 index 0000000000..bdc95d5051 --- /dev/null +++ b/submodules/AnimatedStickerNode/BUCK @@ -0,0 +1,20 @@ +load("//Config:buck_rule_macros.bzl", "static_library") + +static_library( + name = "AnimatedStickerNode", + srcs = glob([ + "Sources/**/*.swift", + ]), + deps = [ + "//submodules/SSignalKit/SwiftSignalKit:SwiftSignalKit#shared", + "//submodules/AsyncDisplayKit:AsyncDisplayKit#shared", + "//submodules/Display:Display#shared", + "//submodules/YuvConversion:YuvConversion", + "//submodules/GZip:GZip", + "//submodules/rlottie:RLottieBinding", + ], + frameworks = [ + "$SDKROOT/System/Library/Frameworks/Foundation.framework", + "$SDKROOT/System/Library/Frameworks/UIKit.framework", + ], +) diff --git a/submodules/AnimationUI/Sources/AnimatedStickerNode.swift b/submodules/AnimatedStickerNode/Sources/AnimatedStickerNode.swift similarity index 89% rename from submodules/AnimationUI/Sources/AnimatedStickerNode.swift rename to submodules/AnimatedStickerNode/Sources/AnimatedStickerNode.swift index d6c0259194..92df089561 100644 --- a/submodules/AnimationUI/Sources/AnimatedStickerNode.swift +++ b/submodules/AnimatedStickerNode/Sources/AnimatedStickerNode.swift @@ -1,15 +1,10 @@ import Foundation import SwiftSignalKit -import Postbox -import TelegramCore import Compression import Display import AsyncDisplayKit import RLottieBinding import GZip -import Tuples -import MediaResources -import StickerResources private let sharedQueue = Queue() @@ -301,14 +296,29 @@ public struct AnimatedStickerStatus: Equatable { } } -public enum AnimatedStickerNodeResource { - case resource(Account, MediaResource) - case localFile(String) +public protocol AnimatedStickerNodeSource { + func cachedDataPath(width: Int, height: Int) -> Signal + func directDataPath() -> Signal +} + +public final class AnimatedStickerNodeLocalFileSource: AnimatedStickerNodeSource { + public let path: String + + public init(path: String) { + self.path = path + } + + public func directDataPath() -> Signal { + return .single(self.path) + } + + public func cachedDataPath(width: Int, height: Int) -> Signal { + return .never() + } } public final class AnimatedStickerNode: ASDisplayNode { private let queue: Queue - private var fileReference: FileMediaReference? private let disposable = MetaDisposable() private let fetchDisposable = MetaDisposable() private let eventsNode: AnimatedStickerNodeDisplayEvents @@ -321,7 +331,7 @@ public final class AnimatedStickerNode: ASDisplayNode { private let timer = Atomic(value: nil) - private var directData: Tuple4? + private var directData: (Data, String, Int, Int)? private var cachedData: Data? private var renderer: (AnimationRenderer & ASDisplayNode)? @@ -385,19 +395,19 @@ public final class AnimatedStickerNode: ASDisplayNode { self.addSubnode(self.renderer!) } - public func setup(resource: AnimatedStickerNodeResource, fitzModifier: EmojiFitzModifier? = nil, width: Int, height: Int, playbackMode: AnimatedStickerPlaybackMode = .loop, mode: AnimatedStickerMode) { + public func setup(source: AnimatedStickerNodeSource, width: Int, height: Int, playbackMode: AnimatedStickerPlaybackMode = .loop, mode: AnimatedStickerMode) { if width < 2 || height < 2 { return } self.playbackMode = playbackMode switch mode { case .direct: - let f: (MediaResourceData) -> Void = { [weak self] data in - guard let strongSelf = self, data.complete else { + let f: (String) -> Void = { [weak self] path in + guard let strongSelf = self else { return } - if let directData = try? Data(contentsOf: URL(fileURLWithPath: data.path), options: [.mappedRead]) { - strongSelf.directData = Tuple(directData, data.path, width, height) + if let directData = try? Data(contentsOf: URL(fileURLWithPath: path), options: [.mappedRead]) { + strongSelf.directData = (directData, path, width, height) } if strongSelf.isPlaying { strongSelf.play() @@ -405,32 +415,23 @@ public final class AnimatedStickerNode: ASDisplayNode { strongSelf.play(firstFrame: true) } } - switch resource { - case let .resource(account, resource): - self.disposable.set((account.postbox.mediaBox.resourceData(resource) - |> deliverOnMainQueue).start(next: { data in - f(data) - })) - case let .localFile(path): - f(MediaResourceData(path: path, offset: 0, size: Int(Int32.max - 1), complete: true)) - } + self.disposable.set((source.directDataPath() + |> deliverOnMainQueue).start(next: { path in + f(path) + })) case .cached: - switch resource { - case let .resource(account, resource): - self.disposable.set((chatMessageAnimationData(postbox: account.postbox, resource: resource, fitzModifier: fitzModifier, width: width, height: height, synchronousLoad: false) - |> deliverOnMainQueue).start(next: { [weak self] data in - if let strongSelf = self, data.complete { - strongSelf.cachedData = try? Data(contentsOf: URL(fileURLWithPath: data.path), options: [.mappedRead]) - if strongSelf.isPlaying { - strongSelf.play() - } else if strongSelf.canDisplayFirstFrame { - strongSelf.play(firstFrame: true) - } - } - })) - case .localFile: - break - } + self.disposable.set((source.cachedDataPath(width: width, height: height) + |> deliverOnMainQueue).start(next: { [weak self] path in + guard let strongSelf = self else { + return + } + strongSelf.cachedData = try? Data(contentsOf: URL(fileURLWithPath: path), options: [.mappedRead]) + if strongSelf.isPlaying { + strongSelf.play() + } else if strongSelf.canDisplayFirstFrame { + strongSelf.play(firstFrame: true) + } + })) } } @@ -466,7 +467,7 @@ public final class AnimatedStickerNode: ASDisplayNode { self.queue.async { [weak self] in var maybeFrameSource: AnimatedStickerFrameSource? if let directData = directData { - maybeFrameSource = AnimatedStickerDirectFrameSource(queue: queue, data: directData._0, width: directData._2, height: directData._3) + maybeFrameSource = AnimatedStickerDirectFrameSource(queue: queue, data: directData.0, width: directData.2, height: directData.3) } else if let cachedData = cachedData { if #available(iOS 9.0, *) { maybeFrameSource = AnimatedStickerCachedFrameSource(queue: queue, data: cachedData) @@ -539,7 +540,7 @@ public final class AnimatedStickerNode: ASDisplayNode { self.queue.async { [weak self] in var maybeFrameSource: AnimatedStickerFrameSource? if let directData = directData { - maybeFrameSource = AnimatedStickerDirectFrameSource(queue: queue, data: directData._0, width: directData._2, height: directData._3) + maybeFrameSource = AnimatedStickerDirectFrameSource(queue: queue, data: directData.0, width: directData.2, height: directData.3) } else if let cachedData = cachedData { if #available(iOS 9.0, *) { maybeFrameSource = AnimatedStickerCachedFrameSource(queue: queue, data: cachedData) diff --git a/submodules/AnimationUI/Sources/AnimationRenderer.swift b/submodules/AnimatedStickerNode/Sources/AnimationRenderer.swift similarity index 100% rename from submodules/AnimationUI/Sources/AnimationRenderer.swift rename to submodules/AnimatedStickerNode/Sources/AnimationRenderer.swift diff --git a/submodules/AnimationUI/Sources/SoftwareAnimationRenderer.swift b/submodules/AnimatedStickerNode/Sources/SoftwareAnimationRenderer.swift similarity index 100% rename from submodules/AnimationUI/Sources/SoftwareAnimationRenderer.swift rename to submodules/AnimatedStickerNode/Sources/SoftwareAnimationRenderer.swift diff --git a/submodules/AnimationUI/Sources/AnimationUI.h b/submodules/AnimationUI/Sources/AnimationUI.h deleted file mode 100644 index bcb24521bd..0000000000 --- a/submodules/AnimationUI/Sources/AnimationUI.h +++ /dev/null @@ -1,19 +0,0 @@ -// -// AnimationUI.h -// AnimationUI -// -// Created by Peter on 8/1/19. -// Copyright © 2019 Telegram Messenger LLP. All rights reserved. -// - -#import - -//! Project version number for AnimationUI. -FOUNDATION_EXPORT double AnimationUIVersionNumber; - -//! Project version string for AnimationUI. -FOUNDATION_EXPORT const unsigned char AnimationUIVersionString[]; - -// In this header, you should import all the public headers of your framework using statements like #import - - diff --git a/submodules/AuthorizationUI/BUCK b/submodules/AuthorizationUI/BUCK index b0cf635904..435baaaa24 100644 --- a/submodules/AuthorizationUI/BUCK +++ b/submodules/AuthorizationUI/BUCK @@ -10,6 +10,7 @@ static_library( "//submodules/TelegramCore:TelegramCore#shared", "//submodules/Display:Display#shared", "//submodules/TextFormat:TextFormat", + "//submodules/Markdown:Markdown", "//submodules/TelegramPresentationData:TelegramPresentationData", ], frameworks = [ diff --git a/submodules/AuthorizationUI/Sources/AuthorizationOptionText.swift b/submodules/AuthorizationUI/Sources/AuthorizationOptionText.swift index aea3869ed0..9cc005a6f5 100644 --- a/submodules/AuthorizationUI/Sources/AuthorizationOptionText.swift +++ b/submodules/AuthorizationUI/Sources/AuthorizationOptionText.swift @@ -3,6 +3,7 @@ import TelegramCore import Display import TelegramPresentationData import TextFormat +import Markdown public func authorizationCurrentOptionText(_ type: SentAuthorizationCodeType, strings: PresentationStrings, primaryColor: UIColor, accentColor: UIColor) -> NSAttributedString { switch type { diff --git a/submodules/BotPaymentsUI/BUCK b/submodules/BotPaymentsUI/BUCK index 6b633815f2..caf603a34b 100644 --- a/submodules/BotPaymentsUI/BUCK +++ b/submodules/BotPaymentsUI/BUCK @@ -19,7 +19,7 @@ static_library( "//submodules/Stripe:Stripe", "//submodules/CountrySelectionUI:CountrySelectionUI", "//submodules/AppBundle:AppBundle", - "//submodules/PresentationDataUtils:PresentationDataUtils", + "//submodules/PresentationDataUtils:PresentationDataUtils", ], frameworks = [ "$SDKROOT/System/Library/Frameworks/Foundation.framework", diff --git a/submodules/BotPaymentsUI/Sources/BotCheckoutInfoController.swift b/submodules/BotPaymentsUI/Sources/BotCheckoutInfoController.swift index b959d65554..ac4c8706e4 100644 --- a/submodules/BotPaymentsUI/Sources/BotCheckoutInfoController.swift +++ b/submodules/BotPaymentsUI/Sources/BotCheckoutInfoController.swift @@ -99,7 +99,7 @@ final class BotCheckoutInfoController: ViewController { switch status { case .verifying: if strongSelf.activityItem == nil { - strongSelf.activityItem = UIBarButtonItem(customDisplayNode: ProgressNavigationButtonNode(theme: strongSelf.presentationData.theme)) + strongSelf.activityItem = UIBarButtonItem(customDisplayNode: ProgressNavigationButtonNode(color: strongSelf.presentationData.theme.rootController.navigationBar.controlColor)) strongSelf.navigationItem.setRightBarButton(strongSelf.activityItem, animated: false) } default: diff --git a/submodules/BotPaymentsUI/Sources/BotCheckoutNativeCardEntryController.swift b/submodules/BotPaymentsUI/Sources/BotCheckoutNativeCardEntryController.swift index dcefe1f5d2..e49e48a409 100644 --- a/submodules/BotPaymentsUI/Sources/BotCheckoutNativeCardEntryController.swift +++ b/submodules/BotPaymentsUI/Sources/BotCheckoutNativeCardEntryController.swift @@ -97,7 +97,7 @@ final class BotCheckoutNativeCardEntryController: ViewController { switch status { case .verifying: if strongSelf.activityItem == nil { - strongSelf.activityItem = UIBarButtonItem(customDisplayNode: ProgressNavigationButtonNode(theme: strongSelf.presentationData.theme)) + strongSelf.activityItem = UIBarButtonItem(customDisplayNode: ProgressNavigationButtonNode(color: strongSelf.presentationData.theme.rootController.navigationBar.controlColor)) strongSelf.navigationItem.setRightBarButton(strongSelf.activityItem, animated: false) } default: diff --git a/submodules/ContactsPeerItem/BUCK b/submodules/ContactsPeerItem/BUCK index 52f3dd428a..145b5971c7 100644 --- a/submodules/ContactsPeerItem/BUCK +++ b/submodules/ContactsPeerItem/BUCK @@ -22,6 +22,7 @@ static_library( "//submodules/TelegramUIPreferences:TelegramUIPreferences", "//submodules/ListSectionHeaderNode:ListSectionHeaderNode", "//submodules/ContextUI:ContextUI", + "//submodules/PresentationDataUtils:PresentationDataUtils", ], frameworks = [ "$SDKROOT/System/Library/Frameworks/Foundation.framework", diff --git a/submodules/ItemListAddressItem/BUCK b/submodules/ItemListAddressItem/BUCK index f999b68ec5..ec8a651a03 100644 --- a/submodules/ItemListAddressItem/BUCK +++ b/submodules/ItemListAddressItem/BUCK @@ -14,6 +14,7 @@ static_library( "//submodules/AccountContext:AccountContext", "//submodules/TextFormat:TextFormat", "//submodules/AppBundle:AppBundle", + "//submodules/PresentationDataUtils:PresentationDataUtils", ], frameworks = [ "$SDKROOT/System/Library/Frameworks/Foundation.framework", diff --git a/submodules/ItemListAvatarAndNameInfoItem/BUCK b/submodules/ItemListAvatarAndNameInfoItem/BUCK index 76b3319fce..314681d12c 100644 --- a/submodules/ItemListAvatarAndNameInfoItem/BUCK +++ b/submodules/ItemListAvatarAndNameInfoItem/BUCK @@ -18,6 +18,7 @@ static_library( "//submodules/ActivityIndicator:ActivityIndicator", "//submodules/ItemListUI:ItemListUI", "//submodules/AppBundle:AppBundle", + "//submodules/PresentationDataUtils:PresentationDataUtils", ], frameworks = [ "$SDKROOT/System/Library/Frameworks/Foundation.framework", diff --git a/submodules/ItemListPeerActionItem/BUCK b/submodules/ItemListPeerActionItem/BUCK index ad1ce4cefe..604dc5c10a 100644 --- a/submodules/ItemListPeerActionItem/BUCK +++ b/submodules/ItemListPeerActionItem/BUCK @@ -11,6 +11,7 @@ static_library( "//submodules/Display:Display#shared", "//submodules/TelegramPresentationData:TelegramPresentationData", "//submodules/ItemListUI:ItemListUI", + "//submodules/PresentationDataUtils:PresentationDataUtils", ], frameworks = [ "$SDKROOT/System/Library/Frameworks/Foundation.framework", diff --git a/submodules/ItemListPeerItem/BUCK b/submodules/ItemListPeerItem/BUCK index d634f0c766..465b5ecae0 100644 --- a/submodules/ItemListPeerItem/BUCK +++ b/submodules/ItemListPeerItem/BUCK @@ -18,6 +18,7 @@ static_library( "//submodules/ItemListUI:ItemListUI", "//submodules/TelegramUIPreferences:TelegramUIPreferences", "//submodules/ContextUI:ContextUI", + "//submodules/PresentationDataUtils:PresentationDataUtils", ], frameworks = [ "$SDKROOT/System/Library/Frameworks/Foundation.framework", diff --git a/submodules/ItemListStickerPackItem/BUCK b/submodules/ItemListStickerPackItem/BUCK index 3da5704d8b..c2b14e9cef 100644 --- a/submodules/ItemListStickerPackItem/BUCK +++ b/submodules/ItemListStickerPackItem/BUCK @@ -14,7 +14,9 @@ static_library( "//submodules/TelegramPresentationData:TelegramPresentationData", "//submodules/ItemListUI:ItemListUI", "//submodules/StickerResources:StickerResources", - "//submodules/AnimationUI:AnimationUI", + "//submodules/AnimatedStickerNode:AnimatedStickerNode", + "//submodules/TelegramAnimatedStickerNode:TelegramAnimatedStickerNode", + "//submodules/PresentationDataUtils:PresentationDataUtils", ], frameworks = [ "$SDKROOT/System/Library/Frameworks/Foundation.framework", diff --git a/submodules/ItemListStickerPackItem/Sources/ItemListStickerPackItem.swift b/submodules/ItemListStickerPackItem/Sources/ItemListStickerPackItem.swift index 2c8664528f..f726e85c0c 100644 --- a/submodules/ItemListStickerPackItem/Sources/ItemListStickerPackItem.swift +++ b/submodules/ItemListStickerPackItem/Sources/ItemListStickerPackItem.swift @@ -9,7 +9,8 @@ import TelegramPresentationData import ItemListUI import PresentationDataUtils import StickerResources -import AnimationUI +import AnimatedStickerNode +import TelegramAnimatedStickerNode public struct ItemListStickerPackItemEditing: Equatable { public var editable: Bool @@ -600,7 +601,7 @@ class ItemListStickerPackItemNode: ItemListRevealOptionsItemNode { animationNode = AnimatedStickerNode() strongSelf.animationNode = animationNode strongSelf.addSubnode(animationNode) - animationNode.setup(resource: .resource(item.account, resource), width: 80, height: 80, mode: .cached) + animationNode.setup(source: AnimatedStickerResourceSource(account: item.account, resource: resource), width: 80, height: 80, mode: .cached) } animationNode.visibility = strongSelf.visibility != .none && item.playAnimatedStickers animationNode.isHidden = !item.playAnimatedStickers diff --git a/submodules/ItemListUI/BUCK b/submodules/ItemListUI/BUCK index 47ab22d750..51163a8812 100644 --- a/submodules/ItemListUI/BUCK +++ b/submodules/ItemListUI/BUCK @@ -12,11 +12,14 @@ static_library( "//submodules/TelegramPresentationData:TelegramPresentationData", "//submodules/MergeLists:MergeLists", "//submodules/TextFormat:TextFormat", + "//submodules/Markdown:Markdown", "//submodules/ProgressNavigationButtonNode:ProgressNavigationButtonNode", "//submodules/SwitchNode:SwitchNode", - "//submodules/AnimationUI:AnimationUI", + "//submodules/AnimatedStickerNode:AnimatedStickerNode", + "//submodules/TelegramAnimatedStickerNode:TelegramAnimatedStickerNode", "//submodules/CheckNode:CheckNode", "//submodules/SegmentedControlNode:SegmentedControlNode", + "//submodules/AccountContext:AccountContext", ], frameworks = [ "$SDKROOT/System/Library/Frameworks/Foundation.framework", diff --git a/submodules/ItemListUI/Sources/ItemListController.swift b/submodules/ItemListUI/Sources/ItemListController.swift index c0ceb9b119..e59a178ae5 100644 --- a/submodules/ItemListUI/Sources/ItemListController.swift +++ b/submodules/ItemListUI/Sources/ItemListController.swift @@ -350,7 +350,7 @@ open class ItemListController: ViewController, KeyShortcutResponder, Presentable for (content, style, _) in rightNavigationButtonTitleAndStyle { let item: UIBarButtonItem if case .activity = style { - item = UIBarButtonItem(customDisplayNode: ProgressNavigationButtonNode(theme: controllerState.theme)) + item = UIBarButtonItem(customDisplayNode: ProgressNavigationButtonNode(color: controllerState.theme.rootController.navigationBar.controlColor)) } else { let action: Selector = (index == 0 && rightNavigationButtonTitleAndStyle.count > 1) ? #selector(strongSelf.secondaryRightNavigationButtonPressed) : #selector(strongSelf.rightNavigationButtonPressed) switch content { @@ -407,7 +407,7 @@ open class ItemListController: ViewController, KeyShortcutResponder, Presentable var items = strongSelf.navigationItem.rightBarButtonItems ?? [] for i in 0 ..< strongSelf.rightNavigationButtonTitleAndStyle.count { if case .activity = strongSelf.rightNavigationButtonTitleAndStyle[i].1 { - items[i] = UIBarButtonItem(customDisplayNode: ProgressNavigationButtonNode(theme: controllerState.theme))! + items[i] = UIBarButtonItem(customDisplayNode: ProgressNavigationButtonNode(color: controllerState.theme.rootController.navigationBar.controlColor))! } } strongSelf.navigationItem.setRightBarButtonItems(items, animated: false) diff --git a/submodules/ItemListUI/Sources/Items/ItemListInfoItem.swift b/submodules/ItemListUI/Sources/Items/ItemListInfoItem.swift index fa17f13671..0cc2c753b4 100644 --- a/submodules/ItemListUI/Sources/Items/ItemListInfoItem.swift +++ b/submodules/ItemListUI/Sources/Items/ItemListInfoItem.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import SwiftSignalKit import TelegramPresentationData import TextFormat +import Markdown public enum InfoListItemText { case plain(String) diff --git a/submodules/ItemListUI/Sources/Items/ItemListTextItem.swift b/submodules/ItemListUI/Sources/Items/ItemListTextItem.swift index 5840ca926c..6f67e65615 100644 --- a/submodules/ItemListUI/Sources/Items/ItemListTextItem.swift +++ b/submodules/ItemListUI/Sources/Items/ItemListTextItem.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import SwiftSignalKit import TelegramPresentationData import TextFormat +import Markdown public enum ItemListTextItemText { case plain(String) diff --git a/submodules/LanguageLinkPreviewUI/BUCK b/submodules/LanguageLinkPreviewUI/BUCK index 705b6bac09..ccc998474e 100644 --- a/submodules/LanguageLinkPreviewUI/BUCK +++ b/submodules/LanguageLinkPreviewUI/BUCK @@ -14,6 +14,7 @@ static_library( "//submodules/TelegramPresentationData:TelegramPresentationData", "//submodules/AccountContext:AccountContext", "//submodules/TextFormat:TextFormat", + "//submodules/Markdown:Markdown", "//submodules/ShareController:ShareController", "//submodules/AlertUI:AlertUI", "//submodules/PresentationDataUtils:PresentationDataUtils", diff --git a/submodules/LanguageLinkPreviewUI/Sources/LanguageLinkPreviewContentNode.swift b/submodules/LanguageLinkPreviewUI/Sources/LanguageLinkPreviewContentNode.swift index d7dd9e0a88..ca3377b5a7 100644 --- a/submodules/LanguageLinkPreviewUI/Sources/LanguageLinkPreviewContentNode.swift +++ b/submodules/LanguageLinkPreviewUI/Sources/LanguageLinkPreviewContentNode.swift @@ -8,6 +8,7 @@ import TelegramPresentationData import TextFormat import AccountContext import ShareController +import Markdown final class LanguageLinkPreviewContentNode: ASDisplayNode, ShareContentContainerNode { private var contentOffsetUpdated: ((CGFloat, ContainedViewLayoutTransition) -> Void)? diff --git a/submodules/Markdown/BUCK b/submodules/Markdown/BUCK new file mode 100644 index 0000000000..a7e2e42fc3 --- /dev/null +++ b/submodules/Markdown/BUCK @@ -0,0 +1,14 @@ +load("//Config:buck_rule_macros.bzl", "static_library") + +static_library( + name = "Markdown", + srcs = glob([ + "Sources/**/*.swift", + ]), + deps = [ + ], + frameworks = [ + "$SDKROOT/System/Library/Frameworks/Foundation.framework", + "$SDKROOT/System/Library/Frameworks/UIKit.framework", + ], +) diff --git a/submodules/TextFormat/Sources/Markdown.swift b/submodules/Markdown/Sources/Markdown.swift similarity index 99% rename from submodules/TextFormat/Sources/Markdown.swift rename to submodules/Markdown/Sources/Markdown.swift index 1857305339..fbb4108e0d 100644 --- a/submodules/TextFormat/Sources/Markdown.swift +++ b/submodules/Markdown/Sources/Markdown.swift @@ -1,6 +1,5 @@ import Foundation import UIKit -import Display private let controlStartCharactersSet = CharacterSet(charactersIn: "[*") private let controlCharactersSet = CharacterSet(charactersIn: "[]()*_-\\") diff --git a/submodules/NotificationSoundSelectionUI/BUCK b/submodules/NotificationSoundSelectionUI/BUCK index 8f391af75a..89ed604125 100644 --- a/submodules/NotificationSoundSelectionUI/BUCK +++ b/submodules/NotificationSoundSelectionUI/BUCK @@ -14,6 +14,7 @@ static_library( "//submodules/ItemListUI:ItemListUI", "//submodules/AccountContext:AccountContext", "//submodules/TelegramStringFormatting:TelegramStringFormatting", + "//submodules/PresentationDataUtils:PresentationDataUtils", ], frameworks = [ "$SDKROOT/System/Library/Frameworks/Foundation.framework", diff --git a/submodules/OverlayStatusController/BUCK b/submodules/OverlayStatusController/BUCK index d177a806b0..a148ac0dd5 100644 --- a/submodules/OverlayStatusController/BUCK +++ b/submodules/OverlayStatusController/BUCK @@ -1,13 +1,27 @@ load("//Config:buck_rule_macros.bzl", "static_library") +apple_resource( + name = "OverlayStatusControllerResources", + files = glob([ + "Resources/**/*", + ], exclude = ["Resources/**/.*"]), + visibility = ["PUBLIC"], +) + static_library( name = "OverlayStatusController", srcs = glob([ "Sources/**/*.swift", + "Sources/**/*.m", + ]), + headers = glob([ + "Sources/**/*.h", + ]), + exported_headers = glob([ + "Sources/**/*.h", ]), deps = [ "//submodules/Display:Display#shared", - "//submodules/LegacyComponents:LegacyComponents", ], frameworks = [ "$SDKROOT/System/Library/Frameworks/Foundation.framework", diff --git a/submodules/OverlayStatusController/Resources/Star@2x.png b/submodules/OverlayStatusController/Resources/Star@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0cbe7850163e92c5fe866770c87604ce778af233 GIT binary patch literal 6808 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 - -//! Project version number for OverlayStatusController. -FOUNDATION_EXPORT double OverlayStatusControllerVersionNumber; - -//! Project version string for OverlayStatusController. -FOUNDATION_EXPORT const unsigned char OverlayStatusControllerVersionString[]; - -// In this header, you should import all the public headers of your framework using statements like #import - - diff --git a/submodules/OverlayStatusController/Sources/OverlayStatusController.swift b/submodules/OverlayStatusController/Sources/OverlayStatusController.swift index 0a730a7bcd..82fd76fe5b 100644 --- a/submodules/OverlayStatusController/Sources/OverlayStatusController.swift +++ b/submodules/OverlayStatusController/Sources/OverlayStatusController.swift @@ -1,7 +1,7 @@ import Foundation import UIKit import Display -import LegacyComponents +import AppBundle public enum OverlayStatusControllerType { case loading(cancelled: (() -> Void)?) @@ -12,11 +12,11 @@ public enum OverlayStatusControllerType { } private enum OverlayStatusContentController { - case loading(TGProgressWindowController) - case progress(TGProgressWindowController) - case shieldSuccess(TGProxyWindowController, Bool) - case genericSuccess(TGProxyWindowController, Bool) - case starSuccess(TGProxyWindowController) + case loading(ProgressWindowController) + case progress(ProgressWindowController) + case shieldSuccess(ProxyWindowController, Bool) + case genericSuccess(ProxyWindowController, Bool) + case starSuccess(ProxyWindowController) var view: UIView { switch self { @@ -84,21 +84,21 @@ private final class OverlayStatusControllerNode: ViewControllerTracingNode { var isUserInteractionEnabled = true switch type { case let .loading(cancelled): - let controller = TGProgressWindowController(light: style == .light)! + let controller = ProgressWindowController(light: style == .light)! controller.cancelled = { cancelled?() } self.contentController = .loading(controller) case .success: - self.contentController = .progress(TGProgressWindowController(light: style == .light)) + self.contentController = .progress(ProgressWindowController(light: style == .light)) case let .shieldSuccess(text, increasedDelay): - self.contentController = .shieldSuccess(TGProxyWindowController(light: style == .light, text: text, shield: true, star: false), increasedDelay) + self.contentController = .shieldSuccess(ProxyWindowController(light: style == .light, text: text, icon: ProxyWindowController.generateShieldImage(style == .light), isShield: true), increasedDelay) case let .genericSuccess(text, increasedDelay): - let controller = TGProxyWindowController(light: style == .light, text: text, shield: false, star: false)! + let controller = ProxyWindowController(light: style == .light, text: text, icon: nil, isShield: false)! self.contentController = .genericSuccess(controller, increasedDelay) isUserInteractionEnabled = false case let .starSuccess(text): - self.contentController = .genericSuccess(TGProxyWindowController(light: style == .light, text: text, shield: false, star: true), false) + self.contentController = .genericSuccess(ProxyWindowController(light: style == .light, text: text, icon: UIImage(bundleImageName: "Star"), isShield: false), false) } super.init() diff --git a/submodules/OverlayStatusController/Sources/ProgressSpinnerView.h b/submodules/OverlayStatusController/Sources/ProgressSpinnerView.h new file mode 100644 index 0000000000..e1682c02a2 --- /dev/null +++ b/submodules/OverlayStatusController/Sources/ProgressSpinnerView.h @@ -0,0 +1,12 @@ +#import + +@interface ProgressSpinnerView : UIView + +@property (nonatomic, copy) void (^onSuccess)(void); + +- (instancetype)initWithFrame:(CGRect)frame light:(bool)light; + +- (void)setProgress; +- (void)setSucceed; + +@end diff --git a/submodules/OverlayStatusController/Sources/ProgressSpinnerView.m b/submodules/OverlayStatusController/Sources/ProgressSpinnerView.m new file mode 100644 index 0000000000..402f24f9e6 --- /dev/null +++ b/submodules/OverlayStatusController/Sources/ProgressSpinnerView.m @@ -0,0 +1,305 @@ +#import "ProgressSpinnerView.h" + +#define UIColorRGB(rgb) ([[UIColor alloc] initWithRed:(((rgb >> 16) & 0xff) / 255.0f) green:(((rgb >> 8) & 0xff) / 255.0f) blue:(((rgb) & 0xff) / 255.0f) alpha:1.0f]) + +@interface ProgressSpinnerViewInternal : UIView + +@property (nonatomic, copy) void (^onDraw)(void); +@property (nonatomic, copy) void (^onSuccess)(void); + +- (instancetype)initWithFrame:(CGRect)frame light:(bool)light; + +- (void)setProgress; +- (void)setSucceed:(bool)fromRotation progress:(CGFloat)progress; + +@end + +@interface ProgressSpinnerView () +{ + UIImageView *_arcView; + ProgressSpinnerViewInternal *_internalView; + + bool _progressing; +} +@end + +@implementation ProgressSpinnerView + +- (instancetype)initWithFrame:(CGRect)frame light:(bool)light { + self = [super initWithFrame:frame]; + if (self != nil) { + self.backgroundColor = [UIColor clearColor]; + self.opaque = false; + self.userInteractionEnabled = false; + + UIImage *arcImage = nil; + CGRect rect = CGRectMake(0.0f, 0.0f, frame.size.width, frame.size.height); + UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0f); + CGContextRef context = UIGraphicsGetCurrentContext(); + + CGPoint centerPoint = CGPointMake(rect.size.width / 2.0f, rect.size.height / 2.0f); + CGFloat lineWidth = 4.0f; + CGFloat inset = 3.0f; + + UIColor *foregroundColor = light ? UIColorRGB(0x5a5a5a) : [UIColor whiteColor]; + CGContextSetFillColorWithColor(context, foregroundColor.CGColor); + CGContextSetStrokeColorWithColor(context, foregroundColor.CGColor); + + CGMutablePathRef path = CGPathCreateMutable(); + CGFloat offset = -2.0f * M_PI; + CGPathAddArc(path, NULL, centerPoint.x, centerPoint.y, (rect.size.width - inset * 2.0f - lineWidth) / 2.0f, offset, offset + (3.0f * M_PI_2), false); + CGPathRef strokedArc = CGPathCreateCopyByStrokingPath(path, NULL, lineWidth, kCGLineCapRound, kCGLineJoinMiter, 10); + CGContextAddPath(context, strokedArc); + CGPathRelease(strokedArc); + CGPathRelease(path); + + CGContextFillPath(context); + + arcImage = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + //}); + + _arcView = [[UIImageView alloc] initWithFrame:self.bounds]; + _arcView.image = arcImage; + _arcView.hidden = true; + [self addSubview:_arcView]; + + _internalView = [[ProgressSpinnerViewInternal alloc] initWithFrame:self.bounds light:light]; + _internalView.hidden = true; + [self addSubview:_internalView]; + } + return self; +} + +- (void)setProgress { + _arcView.hidden = false; + _progressing = true; + + CABasicAnimation *rotationAnimation; + rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; + rotationAnimation.toValue = @(-M_PI * 2.0f); + rotationAnimation.duration = 0.75; + rotationAnimation.cumulative = true; + rotationAnimation.repeatCount = HUGE_VALF; + + [_arcView.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"]; +} + +- (void)setSucceed { + _internalView.hidden = false; + + if (_progressing) + { + CGFloat value = [[_arcView.layer.presentationLayer valueForKeyPath:@"transform.rotation.z"] doubleValue] / (-2 * M_PI); + [_internalView setSucceed:_progressing progress:value]; + + __weak ProgressSpinnerView *weakSelf = self; + _internalView.onDraw = ^{ + __strong ProgressSpinnerView *strongSelf = weakSelf; + if (strongSelf != nil) + strongSelf->_arcView.hidden = true; + }; + _internalView.onSuccess = ^{ + __strong ProgressSpinnerView *strongSelf = weakSelf; + if (strongSelf != nil && strongSelf.onSuccess != nil) + strongSelf.onSuccess(); + }; + } + else + { + [_internalView setSucceed:false progress:0.0f]; + } +} + +@end + +@interface ProgressSpinnerViewInternal () +{ + CADisplayLink *_displayLink; + + bool _light; + + bool _isProgressing; + CGFloat _rotationValue; + bool _isRotating; + + CGFloat _checkValue; + bool _delay; + bool _isSucceed; + bool _isChecking; + + NSTimeInterval _previousTime; +} +@end + +@implementation ProgressSpinnerViewInternal + +- (instancetype)initWithFrame:(CGRect)frame light:(bool)light { + self = [super initWithFrame:frame]; + if (self != nil) { + _light = light; + + self.backgroundColor = [UIColor clearColor]; + self.opaque = false; + self.userInteractionEnabled = false; + } + return self; +} + +- (void)dealloc { + _displayLink.paused = true; + [_displayLink removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes]; +} + +- (CADisplayLink *)displayLink { + if (_displayLink == nil) { + _displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(displayLinkUpdate)]; + _displayLink.paused = true; + [_displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes]; + } + return _displayLink; +} + +- (void)drawRect:(CGRect)rect { + CGContextRef context = UIGraphicsGetCurrentContext(); + + CGPoint centerPoint = CGPointMake(rect.size.width / 2.0f, rect.size.height / 2.0f); + CGFloat lineWidth = 4.0f; + CGFloat inset = 3.0f; + if (rect.size.width < 44.0) { + inset = 0.0f; + } + + UIColor *foregroundColor = _light ? UIColorRGB(0x5a5a5a) : [UIColor whiteColor]; + CGContextSetFillColorWithColor(context, foregroundColor.CGColor); + CGContextSetStrokeColorWithColor(context, foregroundColor.CGColor); + + if (_isProgressing) + { + CGMutablePathRef path = CGPathCreateMutable(); + CGFloat offset = -_rotationValue * 2.0f * M_PI; + CGPathAddArc(path, NULL, centerPoint.x, centerPoint.y, (rect.size.width - inset * 2.0f - lineWidth) / 2.0f, offset, offset + (3.0f * M_PI_2) * (1.0f - _checkValue), false); + CGPathRef strokedArc = CGPathCreateCopyByStrokingPath(path, NULL, lineWidth, kCGLineCapRound, kCGLineJoinMiter, 10); + CGContextAddPath(context, strokedArc); + CGPathRelease(strokedArc); + CGPathRelease(path); + + CGContextFillPath(context); + } + + if (_checkValue > FLT_EPSILON) + { + CGContextSetLineWidth(context, 5.0f); + CGContextSetLineCap(context, kCGLineCapRound); + CGContextSetLineJoin(context, kCGLineJoinRound); + CGContextSetMiterLimit(context, 10); + + CGFloat firstSegment = MIN(1.0f, _checkValue * 3.0f); + CGPoint s = CGPointMake(inset + 5.0f / 2.0f, centerPoint.y); + CGPoint p1 = CGPointMake(13.0f, 13.0f); + CGPoint p2 = CGPointMake(27.0f, -27.0f); + + if (firstSegment < 1.0f) + { + CGContextMoveToPoint(context, s.x + p1.x * firstSegment, s.y + p1.y * firstSegment); + CGContextAddLineToPoint(context, s.x, s.y); + } + else + { + CGFloat secondSegment = (_checkValue - 0.33f) * 1.5f; + CGContextMoveToPoint(context, s.x + p1.x + p2.x * secondSegment, s.y + p1.y + p2.y * secondSegment); + CGContextAddLineToPoint(context, s.x + p1.x, s.y + p1.y); + CGContextAddLineToPoint(context, s.x, s.y); + } + + CGContextStrokePath(context); + } +} + +- (void)displayLinkUpdate +{ + NSTimeInterval previousTime = _previousTime; + NSTimeInterval currentTime = CACurrentMediaTime(); + _previousTime = currentTime; + + NSTimeInterval delta = previousTime > DBL_EPSILON ? currentTime - previousTime : 0.0; + if (delta < DBL_EPSILON) + return; + + if (_isRotating) + { + _rotationValue += delta * 1.35f; + } + + if (_isSucceed && _isRotating && !_delay && _rotationValue >= 0.5f) + { + _rotationValue = 0.5f; + _isRotating = false; + _isChecking = true; + } + + if (_isChecking) + _checkValue += delta * M_PI * 1.6f; + + if (_rotationValue > 1.0f) + { + _rotationValue = 0.0f; + _delay = false; + } + + if (_checkValue > 1.0f) + { + _checkValue = 1.0f; + [self displayLink].paused = true; + + if (self.onSuccess != nil) + { + void (^onSuccess)(void) = [self.onSuccess copy]; + self.onSuccess = nil; + onSuccess(); + } + } + + [self setNeedsDisplay]; + + if (self.onDraw != nil) + { + void (^onDraw)(void) = [self.onDraw copy]; + self.onDraw = nil; + onDraw(); + } +} + +- (void)setProgress { + _isRotating = true; + _isProgressing = true; + + [self displayLink].paused = false; +} + +- (void)setSucceed:(bool)fromRotation progress:(CGFloat)progress { + if (_isSucceed) + return; + + if (fromRotation) { + _isRotating = true; + _isProgressing = true; + _rotationValue = progress; + } + + _isSucceed = true; + + if (!_isRotating) + _isChecking = true; + else if (_rotationValue > 0.5f) + _delay = true; + + [self displayLink].paused = false; +} + +- (bool)isSucceed +{ + return _isSucceed; +} + +@end diff --git a/submodules/OverlayStatusController/Sources/ProgressWindow.h b/submodules/OverlayStatusController/Sources/ProgressWindow.h new file mode 100644 index 0000000000..74bcc35412 --- /dev/null +++ b/submodules/OverlayStatusController/Sources/ProgressWindow.h @@ -0,0 +1,16 @@ +#import + +@interface ProgressWindowController : UIViewController + +@property (nonatomic, copy) void (^cancelled)(void); + +- (instancetype)init; +- (instancetype)initWithLight:(bool)light; + +- (void)show:(bool)animated; +- (void)dismiss:(bool)animated completion:(void (^)(void))completion; +- (void)dismissWithSuccess:(void (^)(void))completion; + +- (void)updateLayout; + +@end diff --git a/submodules/OverlayStatusController/Sources/ProgressWindow.m b/submodules/OverlayStatusController/Sources/ProgressWindow.m new file mode 100644 index 0000000000..7dda6129be --- /dev/null +++ b/submodules/OverlayStatusController/Sources/ProgressWindow.m @@ -0,0 +1,194 @@ +#import "ProgressWindow.h" + +#import "ProgressSpinnerView.h" + +#define UIColorRGBA(rgb,a) ([[UIColor alloc] initWithRed:(((rgb >> 16) & 0xff) / 255.0f) green:(((rgb >> 8) & 0xff) / 255.0f) blue:(((rgb) & 0xff) / 255.0f) alpha:a]) + +#ifdef __LP64__ +# define CGFloor floor +#else +# define CGFloor floorf +#endif + +static inline void dispatchAfter(double delay, dispatch_queue_t queue, dispatch_block_t block) +{ + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)((delay) * NSEC_PER_SEC)), queue, block); +} + +static bool ProgressWindowIsLight = true; + +@interface ProgressWindowController () +{ + bool _light; + UIVisualEffectView *_effectView; + UIView *_backgroundView; + ProgressSpinnerView *_spinner; +} + +@property (nonatomic, weak) UIWindow *weakWindow; +@property (nonatomic, strong) UIView *containerView; + +@end + +@implementation ProgressWindowController + +- (instancetype)init { + return [self initWithLight:ProgressWindowIsLight]; +} + +- (instancetype)initWithLight:(bool)light +{ + self = [super init]; + if (self != nil) + { + _light = light; + } + return self; +} + +- (void)loadView +{ + [super loadView]; + + _containerView = [[UIView alloc] initWithFrame:CGRectMake(CGFloor(self.view.frame.size.width - 100) / 2, CGFloor(self.view.frame.size.height - 100) / 2, 100, 100)]; + _containerView.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin; + _containerView.alpha = 0.0f; + _containerView.clipsToBounds = true; + _containerView.layer.cornerRadius = 20.0f; + _containerView.userInteractionEnabled = false; + [self.view addSubview:_containerView]; + + if ([[[UIDevice currentDevice] systemVersion] intValue] >= 9) + { + _effectView = [[UIVisualEffectView alloc] initWithEffect:_light ? [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight] : [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark]]; + _effectView.frame = _containerView.bounds; + [_containerView addSubview:_effectView]; + + if (_light) + { + UIView *tintView = [[UIView alloc] initWithFrame:_effectView.bounds]; + tintView.backgroundColor = UIColorRGBA(0xf4f4f4, 0.75f); + [_containerView addSubview:tintView]; + } + } + else + { + _backgroundView = [[UIView alloc] initWithFrame:_containerView.bounds]; + _backgroundView.backgroundColor = _light ? UIColorRGBA(0xeaeaea, 0.92f) : UIColorRGBA(0x000000, 0.9f); + [_containerView addSubview:_backgroundView]; + } + + _spinner = [[ProgressSpinnerView alloc] initWithFrame:CGRectMake((_containerView.frame.size.width - 48.0f) / 2.0f, (_containerView.frame.size.height - 48.0f) / 2.0f, 48.0f, 48.0f) light:_light]; + [_containerView addSubview:_spinner]; + + self.view.userInteractionEnabled = true; + [self.view addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGesture:)]]; +} + +- (void)tapGesture:(UITapGestureRecognizer *)recognizer { + if (recognizer.state == UIGestureRecognizerStateEnded) { + if (_cancelled) { + _cancelled(); + } + } +} + +- (void)updateLayout { + _containerView.frame = CGRectMake(CGFloor(self.view.frame.size.width - 100) / 2, CGFloor(self.view.frame.size.height - 100) / 2, 100, 100); + _spinner.frame = CGRectMake((_containerView.frame.size.width - 48.0f) / 2.0f, (_containerView.frame.size.height - 48.0f) / 2.0f, 48.0f, 48.0f); +} + +- (void)show:(bool)animated +{ + UIWindow *window = _weakWindow; + + window.userInteractionEnabled = true; + window.hidden = false; + + [_spinner setProgress]; + + if (animated) + { + _containerView.transform = CGAffineTransformMakeScale(0.6f, 0.6f); + [UIView animateWithDuration:0.3 delay:0.0 options:7 << 16 animations:^{ + _containerView.transform = CGAffineTransformIdentity; + } completion:nil]; + + [UIView animateWithDuration:0.3f animations:^ + { + _containerView.alpha = 1.0f; + }]; + } + else + _containerView.alpha = 1.0f; +} + +- (void)dismiss:(bool)animated { + [self dismiss:animated completion:nil]; +} + +- (void)dismiss:(bool)animated completion:(void (^)())completion +{ + if (animated) + { + [UIView animateWithDuration:0.3f delay:0 options:UIViewAnimationOptionBeginFromCurrentState animations:^ + { + _containerView.alpha = 0.0f; + } completion:^(__unused BOOL finished) + { + if (completion) { + completion(); + } + }]; + } + else + { + _containerView.alpha = 0.0f; + + if (completion) { + completion(); + } + } +} + +- (void)dismissWithSuccess:(void (^)(void))completion +{ + void (^dismissBlock)(void) = ^ + { + [UIView animateWithDuration:0.3 delay:0.55 options:0 animations:^ + { + _containerView.alpha = 0.0f; + } completion:^(BOOL finished) + { + if (finished) + { + if (completion) { + completion(); + } + } + }]; + }; + + _containerView.transform = CGAffineTransformMakeScale(0.6f, 0.6f); + + [UIView animateWithDuration:0.3 delay:0.0 options:7 << 16 animations:^{ + _containerView.transform = CGAffineTransformIdentity; + } completion:nil]; + + [UIView animateWithDuration:0.3f animations:^ + { + _containerView.alpha = 1.0f; + } completion:^(__unused BOOL finished) { + dismissBlock(); + }]; + + dispatchAfter(0.15, dispatch_get_main_queue(), ^{ + [_spinner setSucceed]; + }); +} + +- (BOOL)canBecomeFirstResponder { + return false; +} + +@end diff --git a/submodules/OverlayStatusController/Sources/ProxyWindow.h b/submodules/OverlayStatusController/Sources/ProxyWindow.h new file mode 100644 index 0000000000..2576321ac1 --- /dev/null +++ b/submodules/OverlayStatusController/Sources/ProxyWindow.h @@ -0,0 +1,12 @@ +#import + +@interface ProxyWindowController : UIViewController + +- (instancetype)initWithLight:(bool)light text:(NSString *)text icon:(UIImage *)icon isShield:(bool)isShield; + +- (void)dismissWithSuccess:(void (^)(void))completion increasedDelay:(bool)increasedDelay; +- (void)updateLayout; + ++ (UIImage *)generateShieldImage:(bool)isLight; + +@end diff --git a/submodules/OverlayStatusController/Sources/ProxyWindow.m b/submodules/OverlayStatusController/Sources/ProxyWindow.m new file mode 100644 index 0000000000..c68ddd8bc5 --- /dev/null +++ b/submodules/OverlayStatusController/Sources/ProxyWindow.m @@ -0,0 +1,573 @@ +#import "ProxyWindow.h" + +#define UIColorRGB(rgb) ([[UIColor alloc] initWithRed:(((rgb >> 16) & 0xff) / 255.0f) green:(((rgb >> 8) & 0xff) / 255.0f) blue:(((rgb) & 0xff) / 255.0f) alpha:1.0f]) +#define UIColorRGBA(rgb,a) ([[UIColor alloc] initWithRed:(((rgb >> 16) & 0xff) / 255.0f) green:(((rgb >> 8) & 0xff) / 255.0f) blue:(((rgb) & 0xff) / 255.0f) alpha:a]) + +#ifdef __LP64__ +# define CGFloor floor +#else +# define CGFloor floorf +#endif + +static inline void dispatchAfter(double delay, dispatch_queue_t queue, dispatch_block_t block) +{ + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)((delay) * NSEC_PER_SEC)), queue, block); +} + +static UIFont *mediumSystemFontOfSize(CGFloat size) { + static bool useSystem = false; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + useSystem = [[[UIDevice currentDevice] systemVersion] intValue] >= 9; + }); + + if (useSystem) { + return [UIFont systemFontOfSize:size weight:UIFontWeightMedium]; + } else { + return [UIFont fontWithName:@"HelveticaNeue-Medium" size:size]; + } +} + + +static bool readCGFloat(NSString *string, int *position, CGFloat *result) { + int start = *position; + bool seenDot = false; + int length = (int)string.length; + while (*position < length) { + unichar c = [string characterAtIndex:*position]; + *position++; + + if (c == '.') { + if (seenDot) { + return false; + } else { + seenDot = true; + } + } else if ((c < '0' || c > '9') && c != '-') { + if (*position == start) { + *result = 0.0f; + return true; + } else { + *result = [[string substringWithRange:NSMakeRange(start, *position - start)] floatValue]; + return true; + } + } + } + if (*position == start) { + *result = 0.0f; + return true; + } else { + *result = [[string substringWithRange:NSMakeRange(start, *position - start)] floatValue]; + return true; + } + return true; +} + +static void drawSvgPath(CGContextRef context, NSString *path) { + int position = 0; + int length = (int)path.length; + + while (position < length) { + unichar c = [path characterAtIndex:position]; + position++; + + if (c == ' ') { + continue; + } + + if (c == 'M') { // M + CGFloat x = 0.0f; + CGFloat y = 0.0f; + readCGFloat(path, &position, &x); + readCGFloat(path, &position, &y); + CGContextMoveToPoint(context, x, y); + } else if (c == 'L') { // L + CGFloat x = 0.0f; + CGFloat y = 0.0f; + readCGFloat(path, &position, &x); + readCGFloat(path, &position, &y); + CGContextAddLineToPoint(context, x, y); + } else if (c == 'C') { // C + CGFloat x1 = 0.0f; + CGFloat y1 = 0.0f; + CGFloat x2 = 0.0f; + CGFloat y2 = 0.0f; + CGFloat x = 0.0f; + CGFloat y = 0.0f; + readCGFloat(path, &position, &x1); + readCGFloat(path, &position, &y1); + readCGFloat(path, &position, &x2); + readCGFloat(path, &position, &y2); + readCGFloat(path, &position, &x); + readCGFloat(path, &position, &y); + + CGContextAddCurveToPoint(context, x1, y1, x2, y2, x, y); + } else if (c == 'Z') { // Z + CGContextClosePath(context); + CGContextFillPath(context); + CGContextBeginPath(context); + } else if (c == 'S') { // Z + CGContextClosePath(context); + CGContextStrokePath(context); + CGContextBeginPath(context); + } else if (c == 'U') { // Z + CGContextStrokePath(context); + CGContextBeginPath(context); + } + } +} + +static bool ProxyWindowIsLight = true; + +@interface ProxySpinnerView : UIView + +@property (nonatomic, copy) void (^onSuccess)(void); + +- (instancetype)initWithFrame:(CGRect)frame light:(bool)light; + +- (void)setSucceed; + +@end + +@interface ProxyWindowController () +{ + bool _light; + NSString *_text; + UIImage *_icon; + bool _isShield; + UIVisualEffectView *_effectView; + UIView *_backgroundView; + ProxySpinnerView *_spinner; + UIImageView *_shield; + UILabel *_label; +} + +@property (nonatomic, weak) UIWindow *weakWindow; +@property (nonatomic, strong) UIView *containerView; + +@end + +@implementation ProxyWindowController + ++ (UIImage *)generateShieldImage:(bool)isLight { + UIColor *color = isLight ? UIColorRGB(0x5a5a5a) : [UIColor whiteColor]; + + NSString *code = @"M100,6.56393754 L6,48.2657557 L6,110.909091 C6,169.509174 46.3678836,223.966692 100,237.814087 C153.632116,223.966692 194,169.509174 194,110.909091 L194,48.2657557 L100,6.56393754 S"; + + UIGraphicsBeginImageContextWithOptions(CGSizeMake(67, 82), false, 0.0f); + + CGContextRef context = UIGraphicsGetCurrentContext(); + CGContextScaleCTM(context, 0.333333f, 0.333333f); + CGContextSetLineWidth(context, 12.0f); + CGContextSetStrokeColorWithColor(context, color.CGColor); + drawSvgPath(context, code); + + UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + + return image; +} + +- (instancetype)initWithLight:(bool)light text:(NSString *)text icon:(UIImage *)icon isShield:(bool)isShield { + self = [super init]; + if (self != nil) { + _light = light; + _text = text; + _icon = icon; + _isShield = isShield; + } + return self; +} + +- (void)loadView +{ + [super loadView]; + + if (self.view.bounds.size.width > FLT_EPSILON) { + [self updateLayout]; + } +} + +- (void)updateLayout { + CGSize spinnerSize = CGSizeMake(48.0, 48.0); + CGSize containerSize = CGSizeMake(156.0, 176.0); + if (_icon == nil) { + containerSize = CGSizeMake(207.0, 177.0); + spinnerSize = CGSizeMake(40.0, 40.0); + } + + if (_text.length != 0) { + NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init]; + style.lineBreakMode = NSLineBreakByWordWrapping; + style.lineSpacing = 2.0f; + style.alignment = NSTextAlignmentCenter; + + NSDictionary *attributes = @{NSForegroundColorAttributeName:_light ? UIColorRGB(0x5a5a5a) : [UIColor whiteColor], NSFontAttributeName:mediumSystemFontOfSize(17.0f), NSParagraphStyleAttributeName:style}; + NSAttributedString *string = [[NSAttributedString alloc] initWithString:_text attributes:attributes]; + + UILabel *label = [[UILabel alloc] init]; + label.font = [UIFont systemFontOfSize:15.0f]; + label.numberOfLines = 0; + label.textAlignment = NSTextAlignmentCenter; + label.attributedText = string; + CGSize labelSize = [label sizeThatFits:CGSizeMake(containerSize.width - 10.0 * 2.0, CGFLOAT_MAX)]; + + containerSize.height += labelSize.height - 38.0; + } + + CGRect spinnerFrame = CGRectMake((containerSize.width - spinnerSize.width) / 2.0f, _icon != nil ? 40.0f : 45.0, spinnerSize.width, spinnerSize.height); + if (_containerView == nil) { + _containerView = [[UIView alloc] initWithFrame:CGRectMake(CGFloor(self.view.frame.size.width - containerSize.width) / 2, CGFloor(self.view.frame.size.height - containerSize.height) / 2, containerSize.width, containerSize.height)]; + _containerView.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin; + _containerView.alpha = 0.0f; + _containerView.clipsToBounds = true; + _containerView.layer.cornerRadius = 20.0f; + [self.view addSubview:_containerView]; + + if ([[[UIDevice currentDevice] systemVersion] intValue] >= 9) { + _effectView = [[UIVisualEffectView alloc] initWithEffect:_light ? [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight] : [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark]]; + _effectView.frame = _containerView.bounds; + [_containerView addSubview:_effectView]; + + if (_light) + { + UIView *tintView = [[UIView alloc] initWithFrame:_effectView.bounds]; + tintView.backgroundColor = UIColorRGBA(0xf4f4f4, 0.75f); + [_containerView addSubview:tintView]; + } + } else { + _backgroundView = [[UIView alloc] initWithFrame:_containerView.bounds]; + _backgroundView.backgroundColor = _light ? UIColorRGBA(0xeaeaea, 0.92f) : UIColorRGBA(0x000000, 0.9f); + [_containerView addSubview:_backgroundView]; + } + + UIColor *color = _light ? UIColorRGB(0x5a5a5a) : [UIColor whiteColor]; + + UIImage *image = nil; + if (_icon != nil) { + image = _icon; + } else { + CGSize size = CGSizeMake(66.0, 66.0); + UIGraphicsBeginImageContextWithOptions(size, false, 0.0); + CGContextRef context = UIGraphicsGetCurrentContext(); + CGContextSetStrokeColorWithColor(context, color.CGColor); + CGFloat lineWidth = 4.0f; + CGContextSetLineWidth(context, lineWidth); + CGContextStrokeEllipseInRect(context, CGRectMake(lineWidth / 2.0f, lineWidth / 2.0f, size.width - lineWidth, size.height - lineWidth)); + image = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + } + _shield = [[UIImageView alloc] initWithImage:image]; + _shield.frame = CGRectMake((_containerView.frame.size.width - _shield.frame.size.width) / 2.0f, _isShield ? 23.0f : 30.0, _shield.frame.size.width, _shield.frame.size.height); + [_containerView addSubview:_shield]; + + _spinner = [[ProxySpinnerView alloc] initWithFrame:spinnerFrame light:_light]; + [_containerView addSubview:_spinner]; + + NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init]; + style.lineBreakMode = NSLineBreakByWordWrapping; + style.lineSpacing = 2.0f; + style.alignment = NSTextAlignmentCenter; + + NSDictionary *attributes = @{NSForegroundColorAttributeName:_light ? UIColorRGB(0x5a5a5a) : [UIColor whiteColor], NSFontAttributeName:mediumSystemFontOfSize(17.0f), NSParagraphStyleAttributeName:style}; + NSAttributedString *string = [[NSAttributedString alloc] initWithString:_text attributes:attributes]; + + UILabel *label = [[UILabel alloc] init]; + label.font = [UIFont systemFontOfSize:15.0f]; + label.numberOfLines = 0; + label.textAlignment = NSTextAlignmentCenter; + label.attributedText = string; + _label = label; + CGSize labelSize = [label sizeThatFits:CGSizeMake(_containerView.frame.size.width - 10.0 * 2.0, CGFLOAT_MAX)]; + label.frame = CGRectMake((_containerView.frame.size.width - labelSize.width) / 2.0f, _containerView.frame.size.height - labelSize.height - 18.0f, labelSize.width, labelSize.height); + [_containerView addSubview:label]; + } else { + _containerView.frame = CGRectMake(CGFloor(self.view.frame.size.width - containerSize.width) / 2, CGFloor(self.view.frame.size.height - containerSize.width) / 2, containerSize.width, containerSize.height); + _effectView.frame = _containerView.bounds; + _backgroundView.frame = _containerView.bounds; + _spinner.frame = spinnerFrame; + _shield.frame = CGRectMake((_containerView.frame.size.width - _shield.frame.size.width) / 2.0f, _isShield ? 23.0f : 30.0, _shield.frame.size.width, _shield.frame.size.height); + [_label sizeToFit]; + _label.frame = CGRectMake((_containerView.frame.size.width - _label.frame.size.width) / 2.0f, _containerView.frame.size.height - _label.frame.size.height - 18.0f, _label.frame.size.width, _label.frame.size.height); + } +} + +- (void)dismissWithSuccess:(void (^)(void))completion increasedDelay:(bool)increasedDelay +{ + void (^dismissBlock)(void) = ^{ + [UIView animateWithDuration:0.3 delay:increasedDelay ? 2.1 : 0.55 options:0 animations:^{ + _containerView.alpha = 0.0f; + } completion:^(__unused BOOL finished) { + if (completion) { + completion(); + } + }]; + }; + + _containerView.transform = CGAffineTransformMakeScale(0.6f, 0.6f); + + [UIView animateWithDuration:0.3 delay:0.0 options:7 << 16 animations:^{ + _containerView.transform = CGAffineTransformIdentity; + } completion:nil]; + + [UIView animateWithDuration:0.3f animations:^{ + _containerView.alpha = 1.0f; + } completion:^(__unused BOOL finished) { + dismissBlock(); + }]; + + if (_icon == nil) { + dispatchAfter(0.15, dispatch_get_main_queue(), ^{ + [_spinner setSucceed]; + }); + } +} + +- (BOOL)canBecomeFirstResponder { + return false; +} + +@end + +@interface ProxySpinnerViewInternal : UIView + +@property (nonatomic, copy) void (^onDraw)(void); +@property (nonatomic, copy) void (^onSuccess)(void); + +- (instancetype)initWithFrame:(CGRect)frame light:(bool)light; + +- (void)setSucceed:(bool)fromRotation progress:(CGFloat)progress; + +@end + +@interface ProxySpinnerView () +{ + ProxySpinnerViewInternal *_internalView; + + bool _progressing; +} +@end + +@implementation ProxySpinnerView + +- (instancetype)initWithFrame:(CGRect)frame light:(bool)light { + self = [super initWithFrame:frame]; + if (self != nil) { + self.backgroundColor = [UIColor clearColor]; + self.opaque = false; + self.userInteractionEnabled = false; + + _internalView = [[ProxySpinnerViewInternal alloc] initWithFrame:self.bounds light:light]; + _internalView.hidden = true; + [self addSubview:_internalView]; + } + return self; +} + +- (void)setSucceed { + _internalView.hidden = false; + + [_internalView setSucceed:false progress:0.0f]; +} + +@end + +@interface ProxySpinnerViewInternal () +{ + CADisplayLink *_displayLink; + + bool _light; + + bool _isProgressing; + CGFloat _rotationValue; + bool _isRotating; + + CGFloat _checkValue; + bool _delay; + bool _isSucceed; + bool _isChecking; + + NSTimeInterval _previousTime; +} +@end + +@implementation ProxySpinnerViewInternal + +- (instancetype)initWithFrame:(CGRect)frame light:(bool)light { + self = [super initWithFrame:frame]; + if (self != nil) { + _light = light; + + self.backgroundColor = [UIColor clearColor]; + self.opaque = false; + self.userInteractionEnabled = false; + } + return self; +} + +- (void)dealloc { + _displayLink.paused = true; + [_displayLink removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes]; +} + +- (CADisplayLink *)displayLink { + if (_displayLink == nil) { + _displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(displayLinkUpdate)]; + _displayLink.paused = true; + [_displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes]; + } + return _displayLink; +} + +- (void)drawRect:(CGRect)rect { + CGContextRef context = UIGraphicsGetCurrentContext(); + + CGPoint centerPoint = CGPointMake(rect.size.width / 2.0f, rect.size.height / 2.0f); + CGFloat lineWidth = 4.0f; + CGFloat inset = 3.0f; + if (rect.size.width < 44.0) { + inset = 0.0f; + } + + UIColor *foregroundColor = _light ? UIColorRGB(0x5a5a5a) : [UIColor whiteColor]; + CGContextSetFillColorWithColor(context, foregroundColor.CGColor); + CGContextSetStrokeColorWithColor(context, foregroundColor.CGColor); + + if (_isProgressing) + { + CGMutablePathRef path = CGPathCreateMutable(); + CGFloat offset = -_rotationValue * 2.0f * M_PI; + CGPathAddArc(path, NULL, centerPoint.x, centerPoint.y, (rect.size.width - inset * 2.0f - lineWidth) / 2.0f, offset, offset + (3.0f * M_PI_2) * (1.0f - _checkValue), false); + CGPathRef strokedArc = CGPathCreateCopyByStrokingPath(path, NULL, lineWidth, kCGLineCapRound, kCGLineJoinMiter, 10); + CGContextAddPath(context, strokedArc); + CGPathRelease(strokedArc); + CGPathRelease(path); + + CGContextFillPath(context); + } + + if (_checkValue > FLT_EPSILON) + { + CGContextSetLineWidth(context, 4.0f); + CGContextSetLineCap(context, kCGLineCapRound); + CGContextSetLineJoin(context, kCGLineJoinRound); + CGContextSetMiterLimit(context, 10); + + CGFloat firstSegment = MIN(1.0f, _checkValue * 3.0f); + CGPoint s = CGPointMake(inset + 5.0f, centerPoint.y + 1.0f); + CGPoint p1 = CGPointMake(10.0f, 10.0f); + CGPoint p2 = CGPointMake(23.0f, -23.0f); + if (rect.size.width < 44.0) { + p1 = CGPointMake(9.0f, 9.0f); + p2 = CGPointMake(23.0f, -23.0f); + } + + if (firstSegment < 1.0f) + { + CGContextMoveToPoint(context, s.x + p1.x * firstSegment, s.y + p1.y * firstSegment); + CGContextAddLineToPoint(context, s.x, s.y); + } + else + { + CGFloat secondSegment = (_checkValue - 0.33f) * 1.5f; + if (rect.size.width < 44.0) { + secondSegment = (_checkValue - 0.33f) * 1.35f; + } + CGContextMoveToPoint(context, s.x + p1.x + p2.x * secondSegment, s.y + p1.y + p2.y * secondSegment); + CGContextAddLineToPoint(context, s.x + p1.x, s.y + p1.y); + CGContextAddLineToPoint(context, s.x, s.y); + } + + CGContextStrokePath(context); + } +} + +- (void)displayLinkUpdate +{ + NSTimeInterval previousTime = _previousTime; + NSTimeInterval currentTime = CACurrentMediaTime(); + _previousTime = currentTime; + + NSTimeInterval delta = previousTime > DBL_EPSILON ? currentTime - previousTime : 0.0; + if (delta < DBL_EPSILON) + return; + + if (_isRotating) + { + _rotationValue += delta * 1.35f; + } + + if (_isSucceed && _isRotating && !_delay && _rotationValue >= 0.5f) + { + _rotationValue = 0.5f; + _isRotating = false; + _isChecking = true; + } + + if (_isChecking) + _checkValue += delta * M_PI * 1.6f; + + if (_rotationValue > 1.0f) + { + _rotationValue = 0.0f; + _delay = false; + } + + if (_checkValue > 1.0f) + { + _checkValue = 1.0f; + [self displayLink].paused = true; + + if (self.onSuccess != nil) + { + void (^onSuccess)(void) = [self.onSuccess copy]; + self.onSuccess = nil; + onSuccess(); + } + } + + [self setNeedsDisplay]; + + if (self.onDraw != nil) + { + void (^onDraw)(void) = [self.onDraw copy]; + self.onDraw = nil; + onDraw(); + } +} + +- (void)setProgress { + _isRotating = true; + _isProgressing = true; + + [self displayLink].paused = false; +} + +- (void)setSucceed:(bool)fromRotation progress:(CGFloat)progress { + if (_isSucceed) + return; + + if (fromRotation) { + _isRotating = true; + _isProgressing = true; + _rotationValue = progress; + } + + _isSucceed = true; + + if (!_isRotating) + _isChecking = true; + else if (_rotationValue > 0.5f) + _delay = true; + + [self displayLink].paused = false; +} + +- (bool)isSucceed +{ + return _isSucceed; +} + +@end + + diff --git a/submodules/PassportUI/BUCK b/submodules/PassportUI/BUCK index 6910b1af26..fddf791f3f 100644 --- a/submodules/PassportUI/BUCK +++ b/submodules/PassportUI/BUCK @@ -23,6 +23,7 @@ static_library( "//submodules/PasswordSetupUI:PasswordSetupUI", "//submodules/AppBundle:AppBundle", "//submodules/PresentationDataUtils:PresentationDataUtils", + "//submodules/Markdown:Markdown", ], frameworks = [ "$SDKROOT/System/Library/Frameworks/Foundation.framework", diff --git a/submodules/PassportUI/Sources/SecureIdAuthController.swift b/submodules/PassportUI/Sources/SecureIdAuthController.swift index bc68678938..2e1a240525 100644 --- a/submodules/PassportUI/Sources/SecureIdAuthController.swift +++ b/submodules/PassportUI/Sources/SecureIdAuthController.swift @@ -332,7 +332,7 @@ public final class SecureIdAuthController: ViewController { return } - let item = UIBarButtonItem(customDisplayNode: ProgressNavigationButtonNode(theme: strongSelf.presentationData.theme)) + let item = UIBarButtonItem(customDisplayNode: ProgressNavigationButtonNode(color: strongSelf.presentationData.theme.rootController.navigationBar.controlColor)) strongSelf.navigationItem.rightBarButtonItem = item strongSelf.deleteDisposable.set((deleteSecureIdValues(network: strongSelf.context.account.network, keys: Set(values.map({ $0.value.key }))) |> deliverOnMainQueue).start(completed: { @@ -387,7 +387,7 @@ public final class SecureIdAuthController: ViewController { if previousHadProgress != updatedHasProgress { if updatedHasProgress { - let item = UIBarButtonItem(customDisplayNode: ProgressNavigationButtonNode(theme: self.presentationData.theme)) + let item = UIBarButtonItem(customDisplayNode: ProgressNavigationButtonNode(color: self.presentationData.theme.rootController.navigationBar.controlColor)) self.navigationItem.rightBarButtonItem = item } else { self.navigationItem.rightBarButtonItem = UIBarButtonItem(image: PresentationResourcesRootController.navigationInfoIcon(self.presentationData.theme), style: .plain, target: self, action: #selector(self.infoPressed)) diff --git a/submodules/PassportUI/Sources/SecureIdAuthFormContentNode.swift b/submodules/PassportUI/Sources/SecureIdAuthFormContentNode.swift index 2555e374f7..2fcb17ecae 100644 --- a/submodules/PassportUI/Sources/SecureIdAuthFormContentNode.swift +++ b/submodules/PassportUI/Sources/SecureIdAuthFormContentNode.swift @@ -6,6 +6,7 @@ import Postbox import TelegramCore import TelegramPresentationData import TextFormat +import Markdown private let infoFont = Font.regular(14.0) private let passwordFont = Font.regular(16.0) diff --git a/submodules/PassportUI/Sources/SecureIdDocumentFormController.swift b/submodules/PassportUI/Sources/SecureIdDocumentFormController.swift index 5a18bf37a5..39f6de0509 100644 --- a/submodules/PassportUI/Sources/SecureIdDocumentFormController.swift +++ b/submodules/PassportUI/Sources/SecureIdDocumentFormController.swift @@ -118,7 +118,7 @@ final class SecureIdDocumentFormController: FormController UIImage? { return generateImage(CGSize(width: diameter + shadowBlur * 2.0, height: diameter + shadowBlur * 2.0), rotatedContext: { size, context in @@ -135,7 +136,7 @@ final class ReactionNode: ASDisplayNode { renderSize = CGSize(width: intrinsicSize.width * 2.5, height: intrinsicSize.height * 2.5) } } - self.animationNode.setup(resource: .localFile(path), width: Int(renderSize.width), height: Int(renderSize.height), mode: .direct) + self.animationNode.setup(source: AnimatedStickerNodeLocalFileSource(path: path), width: Int(renderSize.width), height: Int(renderSize.height), mode: .direct) case .reply: self.intrinsicOffset = CGPoint(x: 0.0, y: 0.0) self.imageNode.image = UIImage(named: "Chat/Context Menu/ReactionReply", in: getAppBundle(), compatibleWith: nil) diff --git a/submodules/SettingsUI/BUCK b/submodules/SettingsUI/BUCK index fe9149899e..1a7bffaa8a 100644 --- a/submodules/SettingsUI/BUCK +++ b/submodules/SettingsUI/BUCK @@ -78,6 +78,7 @@ static_library( "//submodules/AppBundle:AppBundle", "//submodules/ContextUI:ContextUI", "//submodules/WalletUI:WalletUI", + "//submodules/Markdown:Markdown", ], frameworks = [ "$SDKROOT/System/Library/Frameworks/Foundation.framework", diff --git a/submodules/SettingsUI/Sources/ChangePhoneNumberIntroController.swift b/submodules/SettingsUI/Sources/ChangePhoneNumberIntroController.swift index 193936bd8b..11f0cfc946 100644 --- a/submodules/SettingsUI/Sources/ChangePhoneNumberIntroController.swift +++ b/submodules/SettingsUI/Sources/ChangePhoneNumberIntroController.swift @@ -9,6 +9,7 @@ import AccountContext import AlertUI import PresentationDataUtils import AppBundle +import Markdown private final class ChangePhoneNumberIntroControllerNode: ASDisplayNode { var presentationData: PresentationData diff --git a/submodules/SettingsUI/Sources/LogoutOptionsController.swift b/submodules/SettingsUI/Sources/LogoutOptionsController.swift index c8d7bbf311..63b633f971 100644 --- a/submodules/SettingsUI/Sources/LogoutOptionsController.swift +++ b/submodules/SettingsUI/Sources/LogoutOptionsController.swift @@ -218,10 +218,7 @@ func logoutOptionsController(context: AccountContext, navigationController: Navi presentControllerImpl?(alertController, nil) }) - let hasWallets = availableWallets(postbox: context.account.postbox) - |> map { wallets in - return !wallets.wallets.isEmpty - } + let hasWallets = context.hasWallets let signal = combineLatest(queue: .mainQueue(), context.sharedContext.presentationData, diff --git a/submodules/SettingsUI/Sources/Privacy and Security/TwoStepVerificationResetController.swift b/submodules/SettingsUI/Sources/Privacy and Security/TwoStepVerificationResetController.swift index 7e0ec4aaa6..8d88e326b6 100644 --- a/submodules/SettingsUI/Sources/Privacy and Security/TwoStepVerificationResetController.swift +++ b/submodules/SettingsUI/Sources/Privacy and Security/TwoStepVerificationResetController.swift @@ -11,6 +11,7 @@ import TextFormat import AccountContext import AlertUI import PresentationDataUtils +import Markdown private final class TwoStepVerificationResetControllerArguments { let updateEntryText: (String) -> Void diff --git a/submodules/SettingsUI/Sources/Privacy and Security/TwoStepVerificationUnlockController.swift b/submodules/SettingsUI/Sources/Privacy and Security/TwoStepVerificationUnlockController.swift index 0c4ff4afc1..dee7a2a88c 100644 --- a/submodules/SettingsUI/Sources/Privacy and Security/TwoStepVerificationUnlockController.swift +++ b/submodules/SettingsUI/Sources/Privacy and Security/TwoStepVerificationUnlockController.swift @@ -13,6 +13,7 @@ import AccountContext import AlertUI import PresentationDataUtils import PasswordSetupUI +import Markdown private final class TwoStepVerificationUnlockSettingsControllerArguments { let updatePasswordText: (String) -> Void diff --git a/submodules/SettingsUI/Sources/SettingsController.swift b/submodules/SettingsUI/Sources/SettingsController.swift index 94cb9cc264..e117e8d3ba 100644 --- a/submodules/SettingsUI/Sources/SettingsController.swift +++ b/submodules/SettingsUI/Sources/SettingsController.swift @@ -1172,9 +1172,7 @@ public func settingsController(context: AccountContext, accountManager: AccountM return context.account.postbox.preferencesView(keys: [PreferencesKeys.appConfiguration]) |> map { view -> Bool in if #available(iOSApplicationExtension 10.3, iOS 10.3, *) { - let appConfiguration = view.values[PreferencesKeys.appConfiguration] as? AppConfiguration ?? .defaultValue - let configuration = WalletConfiguration.with(appConfiguration: appConfiguration) - return configuration.config != nil + return true } else { return false } diff --git a/submodules/SolidRoundedButtonNode/BUCK b/submodules/SolidRoundedButtonNode/BUCK index 4dc8eed041..3ef457d48d 100644 --- a/submodules/SolidRoundedButtonNode/BUCK +++ b/submodules/SolidRoundedButtonNode/BUCK @@ -8,7 +8,6 @@ static_library( deps = [ "//submodules/AsyncDisplayKit:AsyncDisplayKit#shared", "//submodules/Display:Display#shared", - "//submodules/TelegramPresentationData:TelegramPresentationData", ], frameworks = [ "$SDKROOT/System/Library/Frameworks/Foundation.framework", diff --git a/submodules/SolidRoundedButtonNode/Sources/SolidRoundedButtonNode.swift b/submodules/SolidRoundedButtonNode/Sources/SolidRoundedButtonNode.swift index 815f2a20ac..b2d3675881 100644 --- a/submodules/SolidRoundedButtonNode/Sources/SolidRoundedButtonNode.swift +++ b/submodules/SolidRoundedButtonNode/Sources/SolidRoundedButtonNode.swift @@ -2,7 +2,6 @@ import Foundation import UIKit import AsyncDisplayKit import Display -import TelegramPresentationData private let textFont: UIFont = Font.regular(16.0) @@ -16,12 +15,6 @@ public final class SolidRoundedButtonTheme { } } -public extension SolidRoundedButtonTheme { - convenience init(theme: PresentationTheme) { - self.init(backgroundColor: theme.list.itemCheckColors.fillColor, foregroundColor: theme.list.itemCheckColors.foregroundColor) - } -} - public final class SolidRoundedButtonNode: ASDisplayNode { private var theme: SolidRoundedButtonTheme diff --git a/submodules/StickerPackPreviewUI/BUCK b/submodules/StickerPackPreviewUI/BUCK index 5aa327252d..6058deb7bd 100644 --- a/submodules/StickerPackPreviewUI/BUCK +++ b/submodules/StickerPackPreviewUI/BUCK @@ -21,7 +21,8 @@ static_library( "//submodules/TextFormat:TextFormat", "//submodules/MergeLists:MergeLists", "//submodules/ActivityIndicator:ActivityIndicator", - "//submodules/AnimationUI:AnimationUI", + "//submodules/AnimatedStickerNode:AnimatedStickerNode", + "//submodules/TelegramAnimatedStickerNode:TelegramAnimatedStickerNode", ], frameworks = [ "$SDKROOT/System/Library/Frameworks/Foundation.framework", diff --git a/submodules/StickerPackPreviewUI/Sources/StickerPackPreviewGridItem.swift b/submodules/StickerPackPreviewUI/Sources/StickerPackPreviewGridItem.swift index 18c14c4ecf..942ef827bd 100644 --- a/submodules/StickerPackPreviewUI/Sources/StickerPackPreviewGridItem.swift +++ b/submodules/StickerPackPreviewUI/Sources/StickerPackPreviewGridItem.swift @@ -7,7 +7,8 @@ import AsyncDisplayKit import Postbox import StickerResources import AccountContext -import AnimationUI +import AnimatedStickerNode +import TelegramAnimatedStickerNode final class StickerPackPreviewInteraction { var previewedItem: StickerPreviewPeekItem? @@ -108,7 +109,7 @@ final class StickerPackPreviewGridItemNode: GridItemNode { } } let fittedDimensions = dimensions.aspectFitted(CGSize(width: 160.0, height: 160.0)) - self.animationNode?.setup(resource: .resource(account, stickerItem.file.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached) + self.animationNode?.setup(source: AnimatedStickerResourceSource(account: account, resource: stickerItem.file.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached) self.animationNode?.visibility = self.isVisibleInGrid && self.interaction?.playAnimatedStickers ?? true self.stickerFetchedDisposable.set(freeMediaFileResourceInteractiveFetched(account: account, fileReference: stickerPackFileReference(stickerItem.file), resource: stickerItem.file.resource).start()) } else { diff --git a/submodules/StickerPackPreviewUI/Sources/StickerPreviewPeekContent.swift b/submodules/StickerPackPreviewUI/Sources/StickerPreviewPeekContent.swift index a075e54299..c56daa5f91 100644 --- a/submodules/StickerPackPreviewUI/Sources/StickerPreviewPeekContent.swift +++ b/submodules/StickerPackPreviewUI/Sources/StickerPreviewPeekContent.swift @@ -6,7 +6,8 @@ import Postbox import TelegramCore import SwiftSignalKit import StickerResources -import AnimationUI +import AnimatedStickerNode +import TelegramAnimatedStickerNode public enum StickerPreviewPeekItem: Equatable { case pack(StickerPackItem) @@ -91,7 +92,7 @@ private final class StickerPreviewPeekContentNode: ASDisplayNode, PeekController let dimensions = item.file.dimensions ?? CGSize(width: 512.0, height: 512.0) let fittedDimensions = dimensions.aspectFitted(CGSize(width: 400.0, height: 400.0)) - self.animationNode?.setup(resource: .resource(account, item.file.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .direct) + self.animationNode?.setup(source: AnimatedStickerResourceSource(account: account, resource: item.file.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .direct) self.animationNode?.visibility = true self.animationNode?.addSubnode(self.textNode) } else { diff --git a/submodules/TelegramAnimatedStickerNode/BUCK b/submodules/TelegramAnimatedStickerNode/BUCK new file mode 100644 index 0000000000..e9b1668421 --- /dev/null +++ b/submodules/TelegramAnimatedStickerNode/BUCK @@ -0,0 +1,24 @@ +load("//Config:buck_rule_macros.bzl", "static_library") + +static_library( + name = "TelegramAnimatedStickerNode", + srcs = glob([ + "Sources/**/*.swift", + ]), + deps = [ + "//submodules/Postbox:Postbox#shared", + "//submodules/TelegramCore:TelegramCore#shared", + "//submodules/StickerResources:StickerResources", + "//submodules/MediaResources:MediaResources", + "//submodules/Tuples:Tuples", + "//submodules/AnimatedStickerNode:AnimatedStickerNode", + "//submodules/rlottie:RLottieBinding", + "//submodules/YuvConversion:YuvConversion", + "//submodules/GZip:GZip", + ], + frameworks = [ + "$SDKROOT/System/Library/Frameworks/Foundation.framework", + "$SDKROOT/System/Library/Frameworks/UIKit.framework", + "$SDKROOT/System/Library/Frameworks/MobileCoreServices.framework", + ], +) diff --git a/submodules/AnimationUI/Sources/AnimatedStickerUtils.swift b/submodules/TelegramAnimatedStickerNode/Sources/AnimatedStickerUtils.swift similarity index 100% rename from submodules/AnimationUI/Sources/AnimatedStickerUtils.swift rename to submodules/TelegramAnimatedStickerNode/Sources/AnimatedStickerUtils.swift diff --git a/submodules/TelegramAnimatedStickerNode/Sources/TelegramAnimatedStickerNode.swift b/submodules/TelegramAnimatedStickerNode/Sources/TelegramAnimatedStickerNode.swift new file mode 100644 index 0000000000..291ead72e2 --- /dev/null +++ b/submodules/TelegramAnimatedStickerNode/Sources/TelegramAnimatedStickerNode.swift @@ -0,0 +1,39 @@ +import Foundation +import AnimatedStickerNode +import SwiftSignalKit +import Postbox +import TelegramCore +import MediaResources +import StickerResources + +public final class AnimatedStickerResourceSource: AnimatedStickerNodeSource { + public let account: Account + public let resource: MediaResource + public let fitzModifier: EmojiFitzModifier? + + public init(account: Account, resource: MediaResource, fitzModifier: EmojiFitzModifier? = nil) { + self.account = account + self.resource = resource + self.fitzModifier = fitzModifier + } + + public func cachedDataPath(width: Int, height: Int) -> Signal { + return chatMessageAnimationData(postbox: self.account.postbox, resource: self.resource, fitzModifier: self.fitzModifier, width: width, height: height, synchronousLoad: false) + |> filter { data in + return data.complete + } + |> map { data -> String in + return data.path + } + } + + public func directDataPath() -> Signal { + return self.account.postbox.mediaBox.resourceData(resource) + |> filter { data in + return data.complete + } + |> map { data -> String in + return data.path + } + } +} diff --git a/submodules/TelegramBaseController/BUCK b/submodules/TelegramBaseController/BUCK index 794ea2c3cc..c9bdcf90c8 100644 --- a/submodules/TelegramBaseController/BUCK +++ b/submodules/TelegramBaseController/BUCK @@ -18,6 +18,7 @@ static_library( "//submodules/LegacyComponents:LegacyComponents", "//submodules/OverlayStatusController:OverlayStatusController", "//submodules/PresentationDataUtils:PresentationDataUtils", + "//submodules/Markdown:Markdown", ], frameworks = [ "$SDKROOT/System/Library/Frameworks/Foundation.framework", diff --git a/submodules/TelegramBaseController/Sources/LocationBroadcastNavigationAccessoryPanel.swift b/submodules/TelegramBaseController/Sources/LocationBroadcastNavigationAccessoryPanel.swift index 7a7557828e..c5f1ee8aa5 100644 --- a/submodules/TelegramBaseController/Sources/LocationBroadcastNavigationAccessoryPanel.swift +++ b/submodules/TelegramBaseController/Sources/LocationBroadcastNavigationAccessoryPanel.swift @@ -6,6 +6,7 @@ import TelegramCore import Postbox import TelegramPresentationData import TextFormat +import Markdown private let titleFont = Font.regular(12.0) private let subtitleFont = Font.regular(10.0) diff --git a/submodules/TelegramCore/TelegramCore/Wallets.swift b/submodules/TelegramCore/TelegramCore/Wallets.swift index cc89ab1d2b..89a6c35f35 100644 --- a/submodules/TelegramCore/TelegramCore/Wallets.swift +++ b/submodules/TelegramCore/TelegramCore/Wallets.swift @@ -11,1077 +11,6 @@ import MtProtoKit import TelegramApi #endif -public struct TonKeychainEncryptedData: Codable, Equatable { - public let publicKey: Data - public let data: Data - - public init(publicKey: Data, data: Data) { - self.publicKey = publicKey - self.data = data - } -} - -public enum TonKeychainEncryptDataError { - case generic -} - -public enum TonKeychainDecryptDataError { - case generic - case publicKeyMismatch - case cancelled -} - -public struct TonKeychain { - public let encryptionPublicKey: () -> Signal - public let encrypt: (Data) -> Signal - public let decrypt: (TonKeychainEncryptedData) -> Signal - - public init(encryptionPublicKey: @escaping () -> Signal, encrypt: @escaping (Data) -> Signal, decrypt: @escaping (TonKeychainEncryptedData) -> Signal) { - self.encryptionPublicKey = encryptionPublicKey - self.encrypt = encrypt - self.decrypt = decrypt - } -} - -private final class TonInstanceImpl { - private let queue: Queue - private let basePath: String - private let config: String - private let blockchainName: String - private let network: Network? - private var instance: TON? - - init(queue: Queue, basePath: String, config: String, blockchainName: String, network: Network?) { - self.queue = queue - self.basePath = basePath - self.config = config - self.blockchainName = blockchainName - self.network = network - } - - func withInstance(_ f: (TON) -> Void) { - let instance: TON - if let current = self.instance { - instance = current - } else { - let network = self.network - instance = TON(keystoreDirectory: self.basePath + "/ton-keystore", config: self.config, blockchainName: self.blockchainName, performExternalRequest: { request in - if let network = network { - Logger.shared.log("TON Proxy", "request: \(request.data.count)") - let _ = ( - network.request(Api.functions.wallet.sendLiteRequest(body: Buffer(data: request.data))) - |> timeout(20.0, queue: .concurrentDefaultQueue(), alternate: .fail(MTRpcError(errorCode: 500, errorDescription: "NETWORK_ERROR"))) - ).start(next: { result in - switch result { - case let .liteResponse(response): - let data = response.makeData() - Logger.shared.log("TON Proxy", "response: \(data.count)") - request.onResult(data, nil) - } - }, error: { error in - request.onResult(nil, error.errorDescription) - }) - } else { - request.onResult(nil, "NETWORK_DISABLED") - } - }, enableExternalRequests: network != nil) - self.instance = instance - } - f(instance) - } -} - -public final class TonInstance { - private let queue: Queue - private let impl: QueueLocalObject - - public init(basePath: String, config: String, blockchainName: String, network: Network?) { - self.queue = .mainQueue() - let queue = self.queue - self.impl = QueueLocalObject(queue: queue, generate: { - return TonInstanceImpl(queue: queue, basePath: basePath, config: config, blockchainName: blockchainName, network: network) - }) - } - - fileprivate func exportKey(key: TONKey, localPassword: Data) -> Signal<[String], NoError> { - return Signal { subscriber in - let disposable = MetaDisposable() - - self.impl.with { impl in - impl.withInstance { ton in - let cancel = ton.export(key, localPassword: localPassword).start(next: { wordList in - guard let wordList = wordList as? [String] else { - assertionFailure() - return - } - subscriber.putNext(wordList) - subscriber.putCompletion() - }) - disposable.set(ActionDisposable { - cancel?.dispose() - }) - } - } - - return disposable - } - } - - fileprivate func createWallet(keychain: TonKeychain, localPassword: Data) -> Signal<(WalletInfo, [String]), CreateWalletError> { - return Signal { subscriber in - let disposable = MetaDisposable() - self.impl.with { impl in - impl.withInstance { ton in - let cancel = ton.createKey(withLocalPassword: localPassword, mnemonicPassword: Data()).start(next: { key in - guard let key = key as? TONKey else { - assertionFailure() - return - } - let cancel = keychain.encrypt(key.secret).start(next: { encryptedSecretData in - let _ = self.exportKey(key: key, localPassword: localPassword).start(next: { wordList in - subscriber.putNext((WalletInfo(publicKey: WalletPublicKey(rawValue: key.publicKey), encryptedSecret: encryptedSecretData), wordList)) - subscriber.putCompletion() - }, error: { error in - subscriber.putError(.generic) - }) - }, error: { _ in - subscriber.putError(.generic) - }, completed: { - }) - }, error: { _ in - }, completed: { - }) - disposable.set(ActionDisposable { - cancel?.dispose() - }) - } - } - - return disposable - } - } - - fileprivate func importWallet(keychain: TonKeychain, wordList: [String], localPassword: Data) -> Signal { - return Signal { subscriber in - let disposable = MetaDisposable() - - self.impl.with { impl in - impl.withInstance { ton in - let cancel = ton.importKey(withLocalPassword: localPassword, mnemonicPassword: Data(), wordList: wordList).start(next: { key in - guard let key = key as? TONKey else { - subscriber.putError(.generic) - return - } - let cancel = keychain.encrypt(key.secret).start(next: { encryptedSecretData in - subscriber.putNext(WalletInfo(publicKey: WalletPublicKey(rawValue: key.publicKey), encryptedSecret: encryptedSecretData)) - subscriber.putCompletion() - }, error: { _ in - subscriber.putError(.generic) - }, completed: { - }) - }, error: { _ in - subscriber.putError(.generic) - }, completed: { - }) - disposable.set(ActionDisposable { - cancel?.dispose() - }) - } - } - - return disposable - } - } - - fileprivate func walletAddress(publicKey: WalletPublicKey) -> Signal { - return Signal { subscriber in - let disposable = MetaDisposable() - - self.impl.with { impl in - impl.withInstance { ton in - let cancel = ton.getWalletAccountAddress(withPublicKey: publicKey.rawValue).start(next: { address in - guard let address = address as? String else { - return - } - subscriber.putNext(address) - subscriber.putCompletion() - }, error: { _ in - }, completed: { - }) - disposable.set(ActionDisposable { - cancel?.dispose() - }) - } - } - - return disposable - } - } - - private func getWalletStateRaw(address: String) -> Signal { - return Signal { subscriber in - let disposable = MetaDisposable() - - self.impl.with { impl in - impl.withInstance { ton in - let cancel = ton.getAccountState(withAddress: address).start(next: { state in - guard let state = state as? TONAccountState else { - return - } - subscriber.putNext(state) - }, error: { error in - if let error = error as? TONError { - if error.text.hasPrefix("LITE_SERVER_") { - subscriber.putError(.network) - } else { - subscriber.putError(.generic) - } - } else { - subscriber.putError(.generic) - } - }, completed: { - subscriber.putCompletion() - }) - disposable.set(ActionDisposable { - cancel?.dispose() - }) - } - } - - return disposable - } - } - - fileprivate func getWalletState(address: String) -> Signal<(WalletState, Int64), GetWalletStateError> { - return self.getWalletStateRaw(address: address) - |> map { state in - return (WalletState(balance: state.balance, lastTransactionId: state.lastTransactionId.flatMap(WalletTransactionId.init(tonTransactionId:))), state.syncUtime) - } - } - - fileprivate func walletLastTransactionId(address: String) -> Signal { - return Signal { subscriber in - let disposable = MetaDisposable() - - self.impl.with { impl in - impl.withInstance { ton in - let cancel = ton.getAccountState(withAddress: address).start(next: { state in - guard let state = state as? TONAccountState else { - subscriber.putNext(nil) - return - } - subscriber.putNext(state.lastTransactionId.flatMap(WalletTransactionId.init(tonTransactionId:))) - }, error: { error in - if let error = error as? TONError { - if error.text.hasPrefix("ДITE_SERVER_") { - subscriber.putError(.network) - } else { - subscriber.putError(.generic) - } - } else { - subscriber.putError(.generic) - } - }, completed: { - subscriber.putCompletion() - }) - disposable.set(ActionDisposable { - cancel?.dispose() - }) - } - } - - return disposable - } - } - - fileprivate func getWalletTransactions(address: String, previousId: WalletTransactionId) -> Signal<[WalletTransaction], GetWalletTransactionsError> { - return Signal { subscriber in - let disposable = MetaDisposable() - - self.impl.with { impl in - impl.withInstance { ton in - let cancel = ton.getTransactionList(withAddress: address, lt: previousId.lt, hash: previousId.transactionHash).start(next: { transactions in - guard let transactions = transactions as? [TONTransaction] else { - subscriber.putError(.generic) - return - } - subscriber.putNext(transactions.map(WalletTransaction.init(tonTransaction:))) - }, error: { error in - if let error = error as? TONError { - if error.text.hasPrefix("LITE_SERVER_") { - subscriber.putError(.network) - } else { - subscriber.putError(.generic) - } - } else { - subscriber.putError(.generic) - } - }, completed: { - subscriber.putCompletion() - }) - disposable.set(ActionDisposable { - cancel?.dispose() - }) - } - } - - return disposable - } - } - - fileprivate func sendGramsFromWallet(decryptedSecret: Data, localPassword: Data, walletInfo: WalletInfo, fromAddress: String, toAddress: String, amount: Int64, textMessage: Data, forceIfDestinationNotInitialized: Bool, timeout: Int32, randomId: Int64) -> Signal { - let key = TONKey(publicKey: walletInfo.publicKey.rawValue, secret: decryptedSecret) - return Signal { subscriber in - let disposable = MetaDisposable() - - self.impl.with { impl in - impl.withInstance { ton in - let cancel = ton.sendGrams(from: key, localPassword: localPassword, fromAddress: fromAddress, toAddress: toAddress, amount: amount, textMessage: textMessage, forceIfDestinationNotInitialized: forceIfDestinationNotInitialized, timeout: timeout, randomId: randomId).start(next: { result in - guard let result = result as? TONSendGramsResult else { - subscriber.putError(.generic) - return - } - subscriber.putNext(PendingWalletTransaction(timestamp: Int64(Date().timeIntervalSince1970), validUntilTimestamp: result.sentUntil, bodyHash: result.bodyHash, address: toAddress, value: amount, comment: textMessage)) - subscriber.putCompletion() - }, error: { error in - if let error = error as? TONError { - if error.text.hasPrefix("INVALID_ACCOUNT_ADDRESS") { - subscriber.putError(.invalidAddress) - } else if error.text.hasPrefix("DANGEROUS_TRANSACTION") { - subscriber.putError(.destinationIsNotInitialized) - } else if error.text.hasPrefix("MESSAGE_TOO_LONG") { - subscriber.putError(.messageTooLong) - } else if error.text.hasPrefix("NOT_ENOUGH_FUNDS") { - subscriber.putError(.notEnoughFunds) - } else if error.text.hasPrefix("LITE_SERVER_") { - subscriber.putError(.network) - } else { - subscriber.putError(.generic) - } - } else { - subscriber.putError(.generic) - } - }, completed: { - subscriber.putCompletion() - }) - disposable.set(ActionDisposable { - cancel?.dispose() - }) - } - } - - return disposable - } - } - - fileprivate func walletRestoreWords(publicKey: WalletPublicKey, decryptedSecret: Data, localPassword: Data) -> Signal<[String], WalletRestoreWordsError> { - return Signal { subscriber in - let disposable = MetaDisposable() - - self.impl.with { impl in - impl.withInstance { ton in - let cancel = ton.export(TONKey(publicKey: publicKey.rawValue, secret: decryptedSecret), localPassword: localPassword).start(next: { wordList in - guard let wordList = wordList as? [String] else { - subscriber.putError(.generic) - return - } - subscriber.putNext(wordList) - }, error: { _ in - subscriber.putError(.generic) - }, completed: { - subscriber.putCompletion() - }) - disposable.set(ActionDisposable { - cancel?.dispose() - }) - } - } - - return disposable - } - } - - fileprivate func deleteAllLocalWalletsData() -> Signal { - return Signal { subscriber in - let disposable = MetaDisposable() - - self.impl.with { impl in - impl.withInstance { ton in - let cancel = ton.deleteAllKeys().start(next: { _ in - assertionFailure() - }, error: { _ in - subscriber.putError(.generic) - }, completed: { - subscriber.putCompletion() - }) - disposable.set(ActionDisposable { - cancel?.dispose() - }) - } - } - - return disposable - } - } - fileprivate func encrypt(_ decryptedData: Data, secret: Data) -> Signal { - return Signal { subscriber in - let disposable = MetaDisposable() - - self.impl.with { impl in - impl.withInstance { ton in - subscriber.putNext(ton.encrypt(decryptedData, secret: secret)) - subscriber.putCompletion() - } - } - - return disposable - } - } - fileprivate func decrypt(_ encryptedData: Data, secret: Data) -> Signal { - return Signal { subscriber in - let disposable = MetaDisposable() - - self.impl.with { impl in - impl.withInstance { ton in - subscriber.putNext(ton.decrypt(encryptedData, secret: secret)) - subscriber.putCompletion() - } - } - - return disposable - } - } -} - -public struct WalletPublicKey: Codable, Hashable { - public var rawValue: String - - public init(rawValue: String) { - self.rawValue = rawValue - } -} - -public struct WalletInfo: PostboxCoding, Codable, Equatable { - public let publicKey: WalletPublicKey - public let encryptedSecret: TonKeychainEncryptedData - - public init(publicKey: WalletPublicKey, encryptedSecret: TonKeychainEncryptedData) { - self.publicKey = publicKey - self.encryptedSecret = encryptedSecret - } - - public init(decoder: PostboxDecoder) { - self.publicKey = WalletPublicKey(rawValue: decoder.decodeStringForKey("publicKey", orElse: "")) - if let publicKey = decoder.decodeDataForKey("encryptedSecretPublicKey"), let secret = decoder.decodeDataForKey("encryptedSecretData") { - self.encryptedSecret = TonKeychainEncryptedData(publicKey: publicKey, data: secret) - } else { - self.encryptedSecret = TonKeychainEncryptedData(publicKey: Data(), data: Data()) - } - } - - public func encode(_ encoder: PostboxEncoder) { - encoder.encodeString(self.publicKey.rawValue, forKey: "publicKey") - encoder.encodeData(self.encryptedSecret.publicKey, forKey: "encryptedSecretPublicKey") - encoder.encodeData(self.encryptedSecret.data, forKey: "encryptedSecretData") - } -} - -public struct CombinedWalletState: Codable, Equatable { - public var walletState: WalletState - public var timestamp: Int64 - public var topTransactions: [WalletTransaction] - public var pendingTransactions: [PendingWalletTransaction] -} - -public struct WalletStateRecord: PostboxCoding, Equatable { - public let info: WalletInfo - public var exportCompleted: Bool - public var state: CombinedWalletState? - - public init(info: WalletInfo, exportCompleted: Bool, state: CombinedWalletState?) { - self.info = info - self.exportCompleted = exportCompleted - self.state = state - } - - public init(decoder: PostboxDecoder) { - self.info = decoder.decodeDataForKey("info").flatMap { data in - return try? JSONDecoder().decode(WalletInfo.self, from: data) - } ?? WalletInfo(publicKey: WalletPublicKey(rawValue: ""), encryptedSecret: TonKeychainEncryptedData(publicKey: Data(), data: Data())) - self.exportCompleted = decoder.decodeInt32ForKey("exportCompleted", orElse: 0) != 0 - self.state = decoder.decodeDataForKey("state").flatMap { data in - return try? JSONDecoder().decode(CombinedWalletState.self, from: data) - } - } - - public func encode(_ encoder: PostboxEncoder) { - if let data = try? JSONEncoder().encode(self.info) { - encoder.encodeData(data, forKey: "info") - } - encoder.encodeInt32(self.exportCompleted ? 1 : 0, forKey: "exportCompleted") - if let state = self.state, let data = try? JSONEncoder().encode(state) { - encoder.encodeData(data, forKey: "state") - } else { - encoder.encodeNil(forKey: "state") - } - } -} - -public struct WalletCollection: PreferencesEntry { - public var wallets: [WalletStateRecord] - - public init(wallets: [WalletStateRecord]) { - self.wallets = wallets - } - - public init(decoder: PostboxDecoder) { - var wallets: [WalletStateRecord] = decoder.decodeObjectArrayWithDecoderForKey("wallets") - for i in (0 ..< wallets.count).reversed() { - if wallets[i].info.publicKey.rawValue.isEmpty { - wallets.remove(at: i) - } - } - self.wallets = wallets - } - - public func encode(_ encoder: PostboxEncoder) { - encoder.encodeObjectArray(self.wallets, forKey: "wallets") - } - - public func isEqual(to: PreferencesEntry) -> Bool { - guard let other = to as? WalletCollection else { - return false - } - if self.wallets != other.wallets { - return false - } - return true - } -} - -public func availableWallets(postbox: Postbox) -> Signal { - return postbox.transaction { transaction -> WalletCollection in - return (transaction.getPreferencesEntry(key: PreferencesKeys.walletCollection) as? WalletCollection) ?? WalletCollection(wallets: []) - } -} - -public enum CreateWalletError { - case generic -} - -public func tonlibEncrypt(tonInstance: TonInstance, decryptedData: Data, secret: Data) -> Signal { - return tonInstance.encrypt(decryptedData, secret: secret) -} -public func tonlibDecrypt(tonInstance: TonInstance, encryptedData: Data, secret: Data) -> Signal { - return tonInstance.decrypt(encryptedData, secret: secret) -} - -public func createWallet(postbox: Postbox, tonInstance: TonInstance, keychain: TonKeychain, localPassword: Data) -> Signal<(WalletInfo, [String]), CreateWalletError> { - return tonInstance.createWallet(keychain: keychain, localPassword: localPassword) - |> mapToSignal { walletInfo, wordList -> Signal<(WalletInfo, [String]), CreateWalletError> in - return postbox.transaction { transaction -> (WalletInfo, [String]) in - transaction.updatePreferencesEntry(key: PreferencesKeys.walletCollection, { current in - var walletCollection = (current as? WalletCollection) ?? WalletCollection(wallets: []) - walletCollection.wallets = [WalletStateRecord(info: walletInfo, exportCompleted: false, state: nil)] - return walletCollection - }) - return (walletInfo, wordList) - } - |> castError(CreateWalletError.self) - } -} - -public func confirmWalletExported(postbox: Postbox, walletInfo: WalletInfo) -> Signal { - return postbox.transaction { transaction -> Void in - transaction.updatePreferencesEntry(key: PreferencesKeys.walletCollection, { current in - var walletCollection = (current as? WalletCollection) ?? WalletCollection(wallets: []) - for i in 0 ..< walletCollection.wallets.count { - if walletCollection.wallets[i].info.publicKey == walletInfo.publicKey { - walletCollection.wallets[i].exportCompleted = true - } - } - return walletCollection - }) - } - |> ignoreValues -} - -private enum ImportWalletInternalError { - case generic -} - -public enum ImportWalletError { - case generic -} - -public func importWallet(postbox: Postbox, tonInstance: TonInstance, keychain: TonKeychain, wordList: [String], localPassword: Data) -> Signal { - return tonInstance.importWallet(keychain: keychain, wordList: wordList, localPassword: localPassword) - |> `catch` { error -> Signal in - switch error { - case .generic: - return .fail(.generic) - } - } - |> mapToSignal { walletInfo -> Signal in - return postbox.transaction { transaction -> WalletInfo in - transaction.updatePreferencesEntry(key: PreferencesKeys.walletCollection, { current in - var walletCollection = (current as? WalletCollection) ?? WalletCollection(wallets: []) - walletCollection.wallets = [WalletStateRecord(info: walletInfo, exportCompleted: true, state: nil)] - return walletCollection - }) - return walletInfo - } - |> castError(ImportWalletError.self) - } -} - -public enum DeleteAllLocalWalletsDataError { - case generic -} - -public func deleteAllLocalWalletsData(postbox: Postbox, network: Network, tonInstance: TonInstance) -> Signal { - return tonInstance.deleteAllLocalWalletsData() - |> then( - postbox.transaction { transaction -> Void in - transaction.updatePreferencesEntry(key: PreferencesKeys.walletCollection, { current in - let walletCollection = WalletCollection(wallets: []) - return walletCollection - }) - } - |> castError(DeleteAllLocalWalletsDataError.self) - |> ignoreValues - ) -} - -public enum WalletRestoreWordsError { - case generic -} - -public func walletRestoreWords(tonInstance: TonInstance, publicKey: WalletPublicKey, decryptedSecret: Data, localPassword: Data) -> Signal<[String], WalletRestoreWordsError> { - return tonInstance.walletRestoreWords(publicKey: publicKey, decryptedSecret: decryptedSecret, localPassword: localPassword) -} - -public struct WalletState: Codable, Equatable { - public let balance: Int64 - public let lastTransactionId: WalletTransactionId? - - public init(balance: Int64, lastTransactionId: WalletTransactionId?) { - self.balance = balance - self.lastTransactionId = lastTransactionId - } -} - -public func walletAddress(publicKey: WalletPublicKey, tonInstance: TonInstance) -> Signal { - return tonInstance.walletAddress(publicKey: publicKey) -} - -private enum GetWalletStateError { - case generic - case network -} - -private func getWalletState(address: String, tonInstance: TonInstance) -> Signal<(WalletState, Int64), GetWalletStateError> { - return tonInstance.getWalletState(address: address) -} - -public enum GetCombinedWalletStateError { - case generic - case network -} - -public enum CombinedWalletStateResult { - case cached(CombinedWalletState?) - case updated(CombinedWalletState) -} - -public enum CombinedWalletStateSubject { - case wallet(WalletInfo) - case address(String) -} - -public func getCombinedWalletState(postbox: Postbox, subject: CombinedWalletStateSubject, tonInstance: TonInstance, onlyCached: Bool = false) -> Signal { - switch subject { - case let .wallet(walletInfo): - return postbox.transaction { transaction -> CombinedWalletState? in - let walletCollection = (transaction.getPreferencesEntry(key: PreferencesKeys.walletCollection) as? WalletCollection) ?? WalletCollection(wallets: []) - for item in walletCollection.wallets { - if item.info.publicKey == walletInfo.publicKey { - return item.state - } - } - return nil - } - |> castError(GetCombinedWalletStateError.self) - |> mapToSignal { cachedState -> Signal in - if onlyCached { - return .single(.cached(cachedState)) - } - return .single(.cached(cachedState)) - |> then( - tonInstance.walletAddress(publicKey: walletInfo.publicKey) - |> castError(GetCombinedWalletStateError.self) - |> mapToSignal { address -> Signal in - return getWalletState(address: address, tonInstance: tonInstance) - |> retryTonRequest(isNetworkError: { error in - if case .network = error { - return true - } else { - return false - } - }) - |> mapError { error -> GetCombinedWalletStateError in - if case .network = error { - return .network - } else { - return .generic - } - } - |> mapToSignal { walletState, syncUtime -> Signal in - let topTransactions: Signal<[WalletTransaction], GetCombinedWalletStateError> - if walletState.lastTransactionId == cachedState?.walletState.lastTransactionId { - topTransactions = .single(cachedState?.topTransactions ?? []) - } else { - topTransactions = getWalletTransactions(address: address, previousId: nil, tonInstance: tonInstance) - |> mapError { error -> GetCombinedWalletStateError in - if case .network = error { - return .network - } else { - return .generic - } - } - } - return topTransactions - |> mapToSignal { topTransactions -> Signal in - let lastTransactionTimestamp = topTransactions.last?.timestamp - var listTransactionBodyHashes = Set() - for transaction in topTransactions { - if let message = transaction.inMessage { - listTransactionBodyHashes.insert(message.bodyHash) - } - for message in transaction.outMessages { - listTransactionBodyHashes.insert(message.bodyHash) - } - } - let pendingTransactions = (cachedState?.pendingTransactions ?? []).filter { transaction in - if transaction.validUntilTimestamp <= syncUtime { - return false - } else if let lastTransactionTimestamp = lastTransactionTimestamp, transaction.validUntilTimestamp <= lastTransactionTimestamp { - return false - } else { - if listTransactionBodyHashes.contains(transaction.bodyHash) { - return false - } - return true - } - } - let combinedState = CombinedWalletState(walletState: walletState, timestamp: syncUtime, topTransactions: topTransactions, pendingTransactions: pendingTransactions) - return postbox.transaction { transaction -> CombinedWalletStateResult in - transaction.updatePreferencesEntry(key: PreferencesKeys.walletCollection, { current in - var walletCollection = (current as? WalletCollection) ?? WalletCollection(wallets: []) - for i in 0 ..< walletCollection.wallets.count { - if walletCollection.wallets[i].info.publicKey == walletInfo.publicKey { - walletCollection.wallets[i].state = combinedState - } - } - return walletCollection - }) - return .updated(combinedState) - } - |> castError(GetCombinedWalletStateError.self) - } - } - } - ) - } - case let .address(address): - let updated = getWalletState(address: address, tonInstance: tonInstance) - |> mapError { _ -> GetCombinedWalletStateError in - return .generic - } - |> mapToSignal { walletState, syncUtime -> Signal in - let topTransactions: Signal<[WalletTransaction], GetCombinedWalletStateError> - - topTransactions = getWalletTransactions(address: address, previousId: nil, tonInstance: tonInstance) - |> mapError { _ -> GetCombinedWalletStateError in - return .generic - } - return topTransactions - |> mapToSignal { topTransactions -> Signal in - let combinedState = CombinedWalletState(walletState: walletState, timestamp: syncUtime, topTransactions: topTransactions, pendingTransactions: []) - return .single(.updated(combinedState)) - } - } - return .single(.cached(nil)) - |> then(updated) - } -} - -public enum SendGramsFromWalletError { - case generic - case secretDecryptionFailed - case invalidAddress - case destinationIsNotInitialized - case messageTooLong - case notEnoughFunds - case network -} - -public func sendGramsFromWallet(postbox: Postbox, network: Network, tonInstance: TonInstance, walletInfo: WalletInfo, decryptedSecret: Data, localPassword: Data, toAddress: String, amount: Int64, textMessage: Data, forceIfDestinationNotInitialized: Bool, timeout: Int32, randomId: Int64) -> Signal<[PendingWalletTransaction], SendGramsFromWalletError> { - return walletAddress(publicKey: walletInfo.publicKey, tonInstance: tonInstance) - |> castError(SendGramsFromWalletError.self) - |> mapToSignal { fromAddress -> Signal<[PendingWalletTransaction], SendGramsFromWalletError> in - return tonInstance.sendGramsFromWallet(decryptedSecret: decryptedSecret, localPassword: localPassword, walletInfo: walletInfo, fromAddress: fromAddress, toAddress: toAddress, amount: amount, textMessage: textMessage, forceIfDestinationNotInitialized: forceIfDestinationNotInitialized, timeout: timeout, randomId: randomId) - |> mapToSignal { result -> Signal<[PendingWalletTransaction], SendGramsFromWalletError> in - return postbox.transaction { transaction -> [PendingWalletTransaction] in - var updatedPendingTransactions: [PendingWalletTransaction] = [] - transaction.updatePreferencesEntry(key: PreferencesKeys.walletCollection, { current in - var walletCollection = (current as? WalletCollection) ?? WalletCollection(wallets: []) - for i in 0 ..< walletCollection.wallets.count { - if walletCollection.wallets[i].info.publicKey == walletInfo.publicKey { - if var state = walletCollection.wallets[i].state { - state.pendingTransactions.insert(result, at: 0) - walletCollection.wallets[i].state = state - updatedPendingTransactions = state.pendingTransactions - } - } - } - return walletCollection - }) - return updatedPendingTransactions - } - |> castError(SendGramsFromWalletError.self) - } - } -} - -public struct WalletTransactionId: Codable, Hashable { - public var lt: Int64 - public var transactionHash: Data -} - -private extension WalletTransactionId { - init(tonTransactionId: TONTransactionId) { - self.lt = tonTransactionId.lt - self.transactionHash = tonTransactionId.transactionHash - } -} - -public final class WalletTransactionMessage: Codable, Equatable { - public let value: Int64 - public let source: String - public let destination: String - public let textMessage: String - public let bodyHash: Data - - init(value: Int64, source: String, destination: String, textMessage: String, bodyHash: Data) { - self.value = value - self.source = source - self.destination = destination - self.textMessage = textMessage - self.bodyHash = bodyHash - } - - public static func ==(lhs: WalletTransactionMessage, rhs: WalletTransactionMessage) -> Bool { - if lhs.value != rhs.value { - return false - } - if lhs.source != rhs.source { - return false - } - if lhs.destination != rhs.destination { - return false - } - if lhs.textMessage != rhs.textMessage { - return false - } - if lhs.bodyHash != rhs.bodyHash { - return false - } - return true - } -} - -private extension WalletTransactionMessage { - convenience init(tonTransactionMessage: TONTransactionMessage) { - self.init(value: tonTransactionMessage.value, source: tonTransactionMessage.source, destination: tonTransactionMessage.destination, textMessage: tonTransactionMessage.textMessage, bodyHash: tonTransactionMessage.bodyHash) - } -} - -public final class PendingWalletTransaction: Codable, Equatable { - public let timestamp: Int64 - public let validUntilTimestamp: Int64 - public let bodyHash: Data - public let address: String - public let value: Int64 - public let comment: Data - - public init(timestamp: Int64, validUntilTimestamp: Int64, bodyHash: Data, address: String, value: Int64, comment: Data) { - self.timestamp = timestamp - self.validUntilTimestamp = validUntilTimestamp - self.bodyHash = bodyHash - self.address = address - self.value = value - self.comment = comment - } - - public static func ==(lhs: PendingWalletTransaction, rhs: PendingWalletTransaction) -> Bool { - if lhs.timestamp != rhs.timestamp { - return false - } - if lhs.validUntilTimestamp != rhs.validUntilTimestamp { - return false - } - if lhs.bodyHash != rhs.bodyHash { - return false - } - if lhs.value != rhs.value { - return false - } - if lhs.comment != rhs.comment { - return false - } - return true - } -} - -public final class WalletTransaction: Codable, Equatable { - public let data: Data - public let transactionId: WalletTransactionId - public let timestamp: Int64 - public let storageFee: Int64 - public let otherFee: Int64 - public let inMessage: WalletTransactionMessage? - public let outMessages: [WalletTransactionMessage] - - public var transferredValueWithoutFees: Int64 { - var value: Int64 = 0 - if let inMessage = self.inMessage { - value += inMessage.value - } - for message in self.outMessages { - value -= message.value - } - return value - } - - init(data: Data, transactionId: WalletTransactionId, timestamp: Int64, storageFee: Int64, otherFee: Int64, inMessage: WalletTransactionMessage?, outMessages: [WalletTransactionMessage]) { - self.data = data - self.transactionId = transactionId - self.timestamp = timestamp - self.storageFee = storageFee - self.otherFee = otherFee - self.inMessage = inMessage - self.outMessages = outMessages - } - - public static func ==(lhs: WalletTransaction, rhs: WalletTransaction) -> Bool { - if lhs.data != rhs.data { - return false - } - if lhs.transactionId != rhs.transactionId { - return false - } - if lhs.timestamp != rhs.timestamp { - return false - } - if lhs.storageFee != rhs.storageFee { - return false - } - if lhs.otherFee != rhs.otherFee { - return false - } - if lhs.inMessage != rhs.inMessage { - return false - } - if lhs.outMessages != rhs.outMessages { - return false - } - return true - } -} - -private extension WalletTransaction { - convenience init(tonTransaction: TONTransaction) { - self.init(data: tonTransaction.data, transactionId: WalletTransactionId(tonTransactionId: tonTransaction.transactionId), timestamp: tonTransaction.timestamp, storageFee: tonTransaction.storageFee, otherFee: tonTransaction.otherFee, inMessage: tonTransaction.inMessage.flatMap(WalletTransactionMessage.init(tonTransactionMessage:)), outMessages: tonTransaction.outMessages.map(WalletTransactionMessage.init(tonTransactionMessage:))) - } -} - -public enum GetWalletTransactionsError { - case generic - case network -} - -public func getWalletTransactions(address: String, previousId: WalletTransactionId?, tonInstance: TonInstance) -> Signal<[WalletTransaction], GetWalletTransactionsError> { - return getWalletTransactionsOnce(address: address, previousId: previousId, tonInstance: tonInstance) - |> mapToSignal { transactions in - guard let lastTransaction = transactions.last, transactions.count >= 2 else { - return .single(transactions) - } - return getWalletTransactionsOnce(address: address, previousId: lastTransaction.transactionId, tonInstance: tonInstance) - |> map { additionalTransactions in - var result = transactions - var existingIds = Set(result.map { $0.transactionId }) - for transaction in additionalTransactions { - if !existingIds.contains(transaction.transactionId) { - existingIds.insert(transaction.transactionId) - result.append(transaction) - } - } - return result - } - } -} - -private func retryTonRequest(isNetworkError: @escaping (E) -> Bool) -> (Signal) -> Signal { - return { signal in - return signal - |> retry(retryOnError: isNetworkError, delayIncrement: 0.2, maxDelay: 5.0, maxRetries: 3, onQueue: Queue.concurrentDefaultQueue()) - } -} - -private enum WalletLastTransactionIdError { - case generic - case network -} - -private func getWalletTransactionsOnce(address: String, previousId: WalletTransactionId?, tonInstance: TonInstance) -> Signal<[WalletTransaction], GetWalletTransactionsError> { - let previousIdValue: Signal - if let previousId = previousId { - previousIdValue = .single(previousId) - } else { - previousIdValue = tonInstance.walletLastTransactionId(address: address) - |> retryTonRequest(isNetworkError: { error in - if case .network = error { - return true - } else { - return false - } - }) - |> mapError { error -> GetWalletTransactionsError in - if case .network = error { - return .network - } else { - return .generic - } - } - } - return previousIdValue - |> mapToSignal { previousId in - if let previousId = previousId { - return tonInstance.getWalletTransactions(address: address, previousId: previousId) - |> retryTonRequest(isNetworkError: { error in - if case .network = error { - return true - } else { - return false - } - }) - } else { - return .single([]) - } - } -} - public enum GetServerWalletSaltError { case generic } @@ -1098,3 +27,75 @@ public func getServerWalletSalt(network: Network) -> Signal Signal { + return network.request(Api.functions.wallet.sendLiteRequest(body: Buffer(data: data))) + |> mapError { error -> WalletProxyRequestError in + return .generic(error.errorCode, error.errorDescription) + } + |> map { result -> Data in + switch result { + case let .liteResponse(response): + return response.makeData() + } + } +} + +public struct WalletCollection: PreferencesEntry { + public var wallets: [WalletCollectionItem] + + public init(wallets: [WalletCollectionItem]) { + self.wallets = wallets + } + + public init(decoder: PostboxDecoder) { + self.wallets = decoder.decodeObjectArrayWithDecoderForKey("wallets") + } + + public func encode(_ encoder: PostboxEncoder) { + encoder.encodeObjectArray(self.wallets, forKey: "wallets") + } + + public func isEqual(to: PreferencesEntry) -> Bool { + guard let other = to as? WalletCollection else { + return false + } + if self.wallets != other.wallets { + return false + } + return true + } +} diff --git a/submodules/TelegramPermissionsUI/BUCK b/submodules/TelegramPermissionsUI/BUCK index b7dc3c5751..c966bce116 100644 --- a/submodules/TelegramPermissionsUI/BUCK +++ b/submodules/TelegramPermissionsUI/BUCK @@ -14,11 +14,13 @@ static_library( "//submodules/TelegramPresentationData:TelegramPresentationData", "//submodules/AccountContext:AccountContext", "//submodules/TextFormat:TextFormat", + "//submodules/Markdown:Markdown", "//submodules/TelegramPermissions:TelegramPermissions", "//submodules/DeviceAccess:DeviceAccess", "//submodules/PeersNearbyIconNode:PeersNearbyIconNode", "//submodules/SolidRoundedButtonNode:SolidRoundedButtonNode", "//submodules/AppBundle:AppBundle", + "//submodules/PresentationDataUtils:PresentationDataUtils", ], frameworks = [ "$SDKROOT/System/Library/Frameworks/Foundation.framework", diff --git a/submodules/TelegramPermissionsUI/Sources/PermissionContentNode.swift b/submodules/TelegramPermissionsUI/Sources/PermissionContentNode.swift index 7741917aea..dc0c5a123e 100644 --- a/submodules/TelegramPermissionsUI/Sources/PermissionContentNode.swift +++ b/submodules/TelegramPermissionsUI/Sources/PermissionContentNode.swift @@ -7,6 +7,8 @@ import TextFormat import TelegramPermissions import PeersNearbyIconNode import SolidRoundedButtonNode +import PresentationDataUtils +import Markdown public enum PermissionContentIcon { case image(UIImage?) diff --git a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift index 6652bb17a8..5d1721dfd9 100644 --- a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift +++ b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift @@ -4446,566 +4446,566 @@ public final class PresentationStrings: Equatable { public var Channel_Setup_TypePublicHelp: String { return self._s[3909]! } public var Passport_Identity_EditInternalPassport: String { return self._s[3910]! } public var PhotoEditor_Skip: String { return self._s[3911]! } - public func Watch_LastSeen_HoursAgo(_ value: Int32) -> String { + public func StickerPack_RemoveMaskCount(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[0 * 6 + Int(form.rawValue)]!, stringValue) } - public func Passport_Scans(_ value: Int32) -> String { + public func MuteExpires_Hours(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[1 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHAT_MESSAGE_ROUNDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[2 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } public func Conversation_LiveLocationMembersCount(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[3 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PasscodeSettings_FailedAttempts(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[4 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Wallpaper_DeleteConfirmation(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[5 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortDays(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[6 * 6 + Int(form.rawValue)]!, stringValue) - } - public func AttachmentMenu_SendVideo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[7 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Contacts_ImportersCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[8 * 6 + Int(form.rawValue)]!, stringValue) - } - public func DialogList_LiveLocationChatsCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[9 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[10 * 6 + Int(form.rawValue)]!, _1, _2) + return String(format: self._ps[2 * 6 + Int(form.rawValue)]!, stringValue) } public func LiveLocation_MenuChatsCount(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[11 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notification_GameScoreSelfSimple(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[12 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_AddStickerCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[13 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceOver_Chat_PollOptionCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[14 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ServiceMessage_GameScoreSelfSimple(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[15 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGES(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[16 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func ServiceMessage_GameScoreSimple(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[17 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedFiles(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[18 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedAuthorsOthers(_ selector: Int32, _ _0: String, _ _1: String) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[19 * 6 + Int(form.rawValue)]!, _0, _1) - } - public func ChatList_DeleteConfirmation(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[20 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Watch_LastSeen_MinutesAgo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[21 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_StatusMembers(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[22 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[23 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func MessageTimer_Hours(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[24 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessagePoll_VotedCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[25 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceOver_Chat_ContactPhoneNumberCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[26 * 6 + Int(form.rawValue)]!, stringValue) - } - public func LastSeen_MinutesAgo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[27 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_File(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[28 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[29 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func ForwardedContacts(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[30 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Photo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[31 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PrivacyLastSeenSettings_AddUsers(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[32 * 6 + Int(form.rawValue)]!, stringValue) - } - public func LiveLocationUpdated_MinutesAgo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[33 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedGifs(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[34 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Map_ETAMinutes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[35 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortWeeks(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[36 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Theme_UsersCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[37 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[38 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func PUSH_CHANNEL_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[39 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func Call_ShortMinutes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[40 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedPhotos(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[41 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[42 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func InviteText_ContactsCountText(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[43 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortSeconds(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[44 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteExpires_Minutes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[45 * 6 + Int(form.rawValue)]!, stringValue) - } - public func LastSeen_HoursAgo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[46 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Forward_ConfirmMultipleFiles(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[47 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_StatusSubscribers(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[48 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notifications_ExceptionMuteExpires_Minutes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[49 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Media_ShareVideo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[50 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortHours(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[51 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_SelectedMessages(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[52 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Days(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[53 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_RemoveStickerCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[54 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_ShortSeconds(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[55 * 6 + Int(form.rawValue)]!, stringValue) - } - public func QuickSend_Photos(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[56 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteFor_Hours(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[57 * 6 + Int(form.rawValue)]!, stringValue) - } - public func UserCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[58 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedVideos(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[59 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Generic(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[60 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortMinutes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[61 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Wallet_Updated_HoursAgo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[62 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Map_ETAHours(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[63 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_AddMaskCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[64 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedMessages(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[65 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notifications_ExceptionMuteExpires_Hours(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[66 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteExpires_Hours(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[67 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_Seconds(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[68 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Minutes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[69 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_DeleteItemsConfirmation(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[70 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ServiceMessage_GameScoreSelfExtended(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[71 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGE_VIDEOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[72 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func Media_SharePhoto(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[73 * 6 + Int(form.rawValue)]!, stringValue) - } - public func AttachmentMenu_SendPhoto(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[74 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[75 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func Notifications_ExceptionMuteExpires_Days(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[76 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Invitation_Members(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[77 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedStickers(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[78 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_StatusOnline(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[79 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Wallet_Updated_MinutesAgo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[80 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Seconds(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[81 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notification_GameScoreExtended(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[82 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_StickerCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[83 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Months(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[84 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Video(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[85 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedAudios(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[86 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[3 * 6 + Int(form.rawValue)]!, stringValue) } public func Notification_GameScoreSelfExtended(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[87 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[4 * 6 + Int(form.rawValue)]!, stringValue) } - public func CreatePoll_AddMoreOptions(_ value: Int32) -> String { + public func ServiceMessage_GameScoreSelfExtended(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[88 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[5 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHAT_MESSAGE_FWDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + public func Forward_ConfirmMultipleFiles(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[6 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedAudios(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[7 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[89 * 6 + Int(form.rawValue)]!, _2, _1, _3) + return String(format: self._ps[8 * 6 + Int(form.rawValue)]!, _1, _2) } - public func AttachmentMenu_SendGif(_ value: Int32) -> String { + public func MessageTimer_Minutes(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[90 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[9 * 6 + Int(form.rawValue)]!, stringValue) } - public func VoiceOver_Chat_ContactEmailCount(_ value: Int32) -> String { + public func Call_ShortSeconds(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[91 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[10 * 6 + Int(form.rawValue)]!, stringValue) } - public func Watch_UserInfo_Mute(_ value: Int32) -> String { + public func MessageTimer_ShortHours(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[92 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[11 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHAT_MESSAGE_PHOTOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[93 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func MessageTimer_Weeks(_ value: Int32) -> String { + public func Wallet_Updated_MinutesAgo(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[94 * 6 + Int(form.rawValue)]!, stringValue) - } - public func AttachmentMenu_SendItem(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[95 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedVideoMessages(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[96 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Link(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[97 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[12 * 6 + Int(form.rawValue)]!, stringValue) } public func GroupInfo_ParticipantCount(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[98 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[13 * 6 + Int(form.rawValue)]!, stringValue) } - public func StickerPack_RemoveMaskCount(_ value: Int32) -> String { + public func Notifications_ExceptionMuteExpires_Minutes(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[99 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[14 * 6 + Int(form.rawValue)]!, stringValue) } - public func MuteFor_Days(_ value: Int32) -> String { + public func StickerPack_AddMaskCount(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[100 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[15 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_Years(_ value: Int32) -> String { + public func ForwardedVideoMessages(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[101 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_Minutes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[102 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[103 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func PUSH_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[104 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func ForwardedLocations(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[105 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedPolls(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[106 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Chat_DeleteMessagesConfirmation(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[107 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[16 * 6 + Int(form.rawValue)]!, stringValue) } public func ChatList_SelectedChats(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[108 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[17 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_StatusOnline(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[18 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_Photo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[19 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedGifs(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[20 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Months(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[21 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortSeconds(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[22 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_ContactPhoneNumberCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[23 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedPolls(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[24 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[25 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func ChatList_DeleteConfirmation(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[26 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteFor_Hours(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[27 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[28 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func PUSH_CHANNEL_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[29 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func MuteExpires_Days(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[30 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteExpires_Minutes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[31 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Hours(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[32 * 6 + Int(form.rawValue)]!, stringValue) + } + public func UserCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[33 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[34 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func MessageTimer_ShortDays(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[35 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[36 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func ForwardedLocations(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[37 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreSelfSimple(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[38 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Call_Minutes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[39 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_PollOptionCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[40 * 6 + Int(form.rawValue)]!, stringValue) + } + public func QuickSend_Photos(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[41 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedAuthorsOthers(_ selector: Int32, _ _0: String, _ _1: String) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[42 * 6 + Int(form.rawValue)]!, _0, _1) + } + public func SharedMedia_Generic(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[43 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_StickerCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[44 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_StatusMembers(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[45 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Watch_LastSeen_HoursAgo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[46 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Media_SharePhoto(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[47 * 6 + Int(form.rawValue)]!, stringValue) + } + public func AttachmentMenu_SendVideo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[48 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Chat_DeleteMessagesConfirmation(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[49 * 6 + Int(form.rawValue)]!, stringValue) } public func ServiceMessage_GameScoreExtended(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[109 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[50 * 6 + Int(form.rawValue)]!, stringValue) + } + public func LiveLocationUpdated_MinutesAgo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[51 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedMessages(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[52 * 6 + Int(form.rawValue)]!, stringValue) + } + public func AttachmentMenu_SendItem(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[53 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteFor_Days(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[54 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Seconds(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[55 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notifications_ExceptionMuteExpires_Hours(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[56 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Days(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[57 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedContacts(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[58 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Watch_UserInfo_Mute(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[59 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notifications_ExceptionMuteExpires_Days(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[60 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Passport_Scans(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[61 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_SelectedMessages(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[62 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Invitation_Members(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[63 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Call_ShortMinutes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[64 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedPhotos(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[65 * 6 + Int(form.rawValue)]!, stringValue) } public func Notifications_Exceptions(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[110 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[66 * 6 + Int(form.rawValue)]!, stringValue) } - public func Notification_GameScoreSimple(_ value: Int32) -> String { + public func Map_ETAMinutes(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[111 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[67 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortMinutes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[68 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Media_ShareVideo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[69 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PrivacyLastSeenSettings_AddUsers(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[70 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Watch_LastSeen_MinutesAgo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[71 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_RemoveStickerCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[72 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGE_VIDEOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[73 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func StickerPack_AddStickerCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[74 * 6 + Int(form.rawValue)]!, stringValue) + } + public func LastSeen_HoursAgo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[75 * 6 + Int(form.rawValue)]!, stringValue) + } + public func InviteText_ContactsCountText(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[76 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGE_PHOTOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[77 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func SharedMedia_Video(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[78 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGE_ROUNDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[79 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func PUSH_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[80 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func PasscodeSettings_FailedAttempts(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[81 * 6 + Int(form.rawValue)]!, stringValue) } public func Media_ShareItem(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[112 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[82 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Years(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[83 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessagePoll_VotedCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[84 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ServiceMessage_GameScoreSimple(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[85 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Contacts_ImportersCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[86 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_Link(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[87 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ServiceMessage_GameScoreSelfSimple(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[88 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortWeeks(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[89 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreExtended(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[90 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedFiles(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[91 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedVideos(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[92 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreSimple(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[93 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Call_Seconds(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[94 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGE_FWDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[95 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func LastSeen_MinutesAgo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[96 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_File(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[97 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_DeleteItemsConfirmation(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[98 * 6 + Int(form.rawValue)]!, stringValue) + } + public func CreatePoll_AddMoreOptions(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[99 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGES(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[100 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func ForwardedStickers(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[101 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Map_ETAHours(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[102 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Wallet_Updated_HoursAgo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[103 * 6 + Int(form.rawValue)]!, stringValue) + } + public func AttachmentMenu_SendGif(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[104 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[105 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func MessageTimer_Weeks(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[106 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_ContactEmailCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[107 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Theme_UsersCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[108 * 6 + Int(form.rawValue)]!, stringValue) } public func VoiceOver_Chat_PollVotes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[109 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[110 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func PUSH_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[111 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func Wallpaper_DeleteConfirmation(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[112 * 6 + Int(form.rawValue)]!, stringValue) + } + public func DialogList_LiveLocationChatsCount(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[113 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHANNEL_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[114 * 6 + Int(form.rawValue)]!, _1, _2) + public func Conversation_StatusSubscribers(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[114 * 6 + Int(form.rawValue)]!, stringValue) } - public func MuteExpires_Days(_ value: Int32) -> String { + public func AttachmentMenu_SendPhoto(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[115 * 6 + Int(form.rawValue)]!, stringValue) diff --git a/submodules/TelegramStringFormatting/BUCK b/submodules/TelegramStringFormatting/BUCK index 432cd2f422..a0437f7beb 100644 --- a/submodules/TelegramStringFormatting/BUCK +++ b/submodules/TelegramStringFormatting/BUCK @@ -12,6 +12,7 @@ static_library( "//submodules/PlatformRestrictionMatching:PlatformRestrictionMatching", "//submodules/LocalizedPeerData:LocalizedPeerData", "//submodules/TextFormat:TextFormat", + "//submodules/Markdown:Markdown", "//submodules/TelegramUIPreferences:TelegramUIPreferences", "//submodules/TelegramPresentationData:TelegramPresentationData", "//submodules/AppBundle:AppBundle", diff --git a/submodules/TelegramStringFormatting/Sources/ServiceMessageStrings.swift b/submodules/TelegramStringFormatting/Sources/ServiceMessageStrings.swift index 3fc3b9223d..21ab40a1be 100644 --- a/submodules/TelegramStringFormatting/Sources/ServiceMessageStrings.swift +++ b/submodules/TelegramStringFormatting/Sources/ServiceMessageStrings.swift @@ -6,6 +6,7 @@ import TelegramUIPreferences import TextFormat import LocalizedPeerData import Display +import Markdown private let titleFont = Font.regular(13.0) private let titleBoldFont = Font.bold(13.0) diff --git a/submodules/TelegramUI/BUCK b/submodules/TelegramUI/BUCK index ac79a13db7..80ec5806b9 100644 --- a/submodules/TelegramUI/BUCK +++ b/submodules/TelegramUI/BUCK @@ -83,6 +83,8 @@ framework( "//submodules/HorizontalPeerItem:HorizontalPeerItem", "//submodules/CheckNode:CheckNode", "//submodules/AnimationUI:AnimationUI", + "//submodules/AnimatedStickerNode:AnimatedStickerNode", + "//submodules/TelegramAnimatedStickerNode:TelegramAnimatedStickerNode", "//submodules/ActionSheetPeerItem:ActionSheetPeerItem", "//submodules/AccountContext:AccountContext", "//submodules/ComposePollUI:ComposePollUI", @@ -184,6 +186,8 @@ framework( "//submodules/SegmentedControlNode:SegmentedControlNode", "//submodules/AppBundle:AppBundle", "//submodules/WalletUI:WalletUI", + "//submodules/WalletCore:WalletCore", + "//submodules/Markdown:Markdown", ], frameworks = [ "$SDKROOT/System/Library/Frameworks/Foundation.framework", diff --git a/submodules/TelegramUI/TelegramUI/AccountContext.swift b/submodules/TelegramUI/TelegramUI/AccountContext.swift index ba5de0fe18..942b5d8dc6 100644 --- a/submodules/TelegramUI/TelegramUI/AccountContext.swift +++ b/submodules/TelegramUI/TelegramUI/AccountContext.swift @@ -9,6 +9,7 @@ import TelegramPresentationData import AccountContext import LiveLocationManager import TemporaryCachedPeerDataManager +import WalletCore private final class DeviceSpecificContactImportContext { let disposable = MetaDisposable() @@ -131,6 +132,13 @@ public final class AccountContextImpl: AccountContext { private let deviceSpecificContactImportContexts: QueueLocalObject private var managedAppSpecificContactsDisposable: Disposable? + public var hasWallets: Signal { + return WalletStorageInterfaceImpl(postbox: self.account.postbox).getWalletRecords() + |> map { records in + return !records.isEmpty + } + } + public init(sharedContext: SharedAccountContextImpl, account: Account, tonContext: StoredTonContext?, limitsConfiguration: LimitsConfiguration) { self.sharedContextImpl = sharedContext self.account = account diff --git a/submodules/TelegramUI/TelegramUI/AppDelegate.swift b/submodules/TelegramUI/TelegramUI/AppDelegate.swift index fcd70db83f..ef7508f77d 100644 --- a/submodules/TelegramUI/TelegramUI/AppDelegate.swift +++ b/submodules/TelegramUI/TelegramUI/AppDelegate.swift @@ -26,6 +26,8 @@ import SettingsUI import AppBundle import WalletUI import UrlHandling +import WalletUrl +import WalletCore private let handleVoipNotifications = false diff --git a/submodules/TelegramUI/TelegramUI/AuthorizationSequenceSignUpControllerNode.swift b/submodules/TelegramUI/TelegramUI/AuthorizationSequenceSignUpControllerNode.swift index e004a71736..ec90b2aa2d 100644 --- a/submodules/TelegramUI/TelegramUI/AuthorizationSequenceSignUpControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/AuthorizationSequenceSignUpControllerNode.swift @@ -4,6 +4,7 @@ import AsyncDisplayKit import Display import TelegramPresentationData import TextFormat +import Markdown private func roundCorners(diameter: CGFloat) -> UIImage { UIGraphicsBeginImageContextWithOptions(CGSize(width: diameter, height: diameter), false, 0.0) diff --git a/submodules/TelegramUI/TelegramUI/ChatController.swift b/submodules/TelegramUI/TelegramUI/ChatController.swift index f4d1ace892..1e36e54e2a 100644 --- a/submodules/TelegramUI/TelegramUI/ChatController.swift +++ b/submodules/TelegramUI/TelegramUI/ChatController.swift @@ -48,6 +48,7 @@ import ReactionSelectionNode import MessageReactionListUI import AppBundle import WalletUI +import WalletUrl public enum ChatControllerPeekActions { case standard diff --git a/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerGridItem.swift b/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerGridItem.swift index 2ef02fbf11..d6fafc4731 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerGridItem.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerGridItem.swift @@ -8,7 +8,8 @@ import Postbox import TelegramPresentationData import StickerResources import AccountContext -import AnimationUI +import AnimatedStickerNode +import TelegramAnimatedStickerNode enum ChatMediaInputStickerGridSectionAccessory { case none @@ -299,7 +300,7 @@ final class ChatMediaInputStickerGridItemNode: GridItemNode { self.didSetUpAnimationNode = true let dimensions = item.stickerItem.file.dimensions ?? CGSize(width: 512.0, height: 512.0) let fittedDimensions = dimensions.aspectFitted(CGSize(width: 160.0, height: 160.0)) - self.animationNode?.setup(resource: .resource(item.account, item.stickerItem.file.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached) + self.animationNode?.setup(source: AnimatedStickerResourceSource(account: item.account, resource: item.stickerItem.file.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached) } } } diff --git a/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerPackItem.swift b/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerPackItem.swift index 43d945b08d..406910bbbf 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerPackItem.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerPackItem.swift @@ -7,8 +7,9 @@ import SwiftSignalKit import Postbox import TelegramPresentationData import StickerResources -import AnimationUI import ItemListStickerPackItem +import AnimatedStickerNode +import TelegramAnimatedStickerNode final class ChatMediaInputStickerPackItem: ListViewItem { let account: Account @@ -177,7 +178,7 @@ final class ChatMediaInputStickerPackItemNode: ListViewItemNode { self.animatedStickerNode = animatedStickerNode animatedStickerNode.transform = CATransform3DMakeRotation(CGFloat.pi / 2.0, 0.0, 0.0, 1.0) self.addSubnode(animatedStickerNode) - animatedStickerNode.setup(resource: .resource(account, resource), width: 80, height: 80, mode: .cached) + animatedStickerNode.setup(source: AnimatedStickerResourceSource(account: account, resource: resource), width: 80, height: 80, mode: .cached) } animatedStickerNode.visibility = self.visibilityStatus && loopAnimatedStickers if let animatedStickerNode = self.animatedStickerNode { diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageActionUrlAuthController.swift b/submodules/TelegramUI/TelegramUI/ChatMessageActionUrlAuthController.swift index 9fcf97cfdb..ce9e5af3ee 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageActionUrlAuthController.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageActionUrlAuthController.swift @@ -9,6 +9,7 @@ import TelegramPresentationData import CheckNode import TextFormat import AccountContext +import Markdown private let textFont = Font.regular(13.0) private let boldTextFont = Font.semibold(13.0) diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageAnimatedStickerItemNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageAnimatedStickerItemNode.swift index 0981583fc3..d743672dd7 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageAnimatedStickerItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageAnimatedStickerItemNode.swift @@ -13,8 +13,10 @@ import AccountContext import MediaResources import StickerResources import ContextUI -import AnimationUI +import AnimatedStickerNode +import TelegramAnimatedStickerNode import Emoji +import Markdown private let nameFont = Font.medium(14.0) private let inlineBotPrefixFont = Font.regular(14.0) @@ -313,7 +315,7 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { if let file = file { let dimensions = file.dimensions ?? CGSize(width: 512.0, height: 512.0) let fittedSize = isEmoji ? dimensions.aspectFilled(CGSize(width: 384.0, height: 384.0)) : dimensions.aspectFitted(CGSize(width: 384.0, height: 384.0)) - self.animationNode.setup(resource: .resource(item.context.account, file.resource), fitzModifier: fitzModifier, width: Int(fittedSize.width), height: Int(fittedSize.height), playbackMode: playbackMode, mode: .cached) + self.animationNode.setup(source: AnimatedStickerResourceSource(account: item.context.account, resource: file.resource, fitzModifier: fitzModifier), width: Int(fittedSize.width), height: Int(fittedSize.height), playbackMode: playbackMode, mode: .cached) } } } diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift index 0e072557bb..30c19b83f4 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift @@ -20,6 +20,7 @@ import ReactionSelectionNode import PersistentStringHash import GridMessageSelectionNode import AppBundle +import Markdown private func contentNodeMessagesAndClassesForItem(_ item: ChatMessageItem) -> [(Message, AnyClass)] { var result: [(Message, AnyClass)] = [] diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageInstantVideoItemNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageInstantVideoItemNode.swift index 509546afce..a00b50d8b4 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageInstantVideoItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageInstantVideoItemNode.swift @@ -11,6 +11,7 @@ import TextFormat import AccountContext import LocalizedPeerData import ContextUI +import Markdown private let nameFont = Font.medium(14.0) diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveMediaNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveMediaNode.swift index 29fe6562bd..e2a7ebf344 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveMediaNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveMediaNode.swift @@ -16,7 +16,8 @@ import PhotoResources import TelegramUniversalVideoContent import TelegramStringFormatting import GalleryUI -import AnimationUI +import AnimatedStickerNode +import TelegramAnimatedStickerNode import LocalMediaResources import WallpaperResources @@ -731,7 +732,7 @@ final class ChatMessageInteractiveMediaNode: ASDisplayNode, GalleryItemTransitio strongSelf.animatedStickerNode = animatedStickerNode let dimensions = updatedAnimatedStickerFile.dimensions ?? CGSize(width: 512.0, height: 512.0) let fittedDimensions = dimensions.aspectFitted(CGSize(width: 384.0, height: 384.0)) - animatedStickerNode.setup(resource: .resource(context.account, updatedAnimatedStickerFile.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached) + animatedStickerNode.setup(source: AnimatedStickerResourceSource(account: context.account, resource: updatedAnimatedStickerFile.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached) strongSelf.insertSubnode(animatedStickerNode, aboveSubnode: strongSelf.imageNode) animatedStickerNode.visibility = strongSelf.visibility } diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageStickerItemNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageStickerItemNode.swift index 57d9f13a11..703f156b45 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageStickerItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageStickerItemNode.swift @@ -10,6 +10,7 @@ import TextFormat import AccountContext import StickerResources import ContextUI +import Markdown private let nameFont = Font.medium(14.0) private let inlineBotPrefixFont = Font.regular(14.0) diff --git a/submodules/TelegramUI/TelegramUI/ChatScheduleTimeControllerNode.swift b/submodules/TelegramUI/TelegramUI/ChatScheduleTimeControllerNode.swift index 9f7e591835..dce43d01f9 100644 --- a/submodules/TelegramUI/TelegramUI/ChatScheduleTimeControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatScheduleTimeControllerNode.swift @@ -9,6 +9,7 @@ import TelegramStringFormatting import AccountContext import ShareController import SolidRoundedButtonNode +import PresentationDataUtils class ChatScheduleTimeControllerNode: ViewControllerTracingNode, UIScrollViewDelegate { private let context: AccountContext diff --git a/submodules/TelegramUI/TelegramUI/ChatSearchInputPanelNode.swift b/submodules/TelegramUI/TelegramUI/ChatSearchInputPanelNode.swift index b234f75dcc..026c55d013 100644 --- a/submodules/TelegramUI/TelegramUI/ChatSearchInputPanelNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatSearchInputPanelNode.swift @@ -54,7 +54,7 @@ final class ChatSearchInputPanelNode: ChatInputPanelNode { self.membersButton = HighlightableButtonNode() self.measureResultsLabel = TextNode() self.resultsButton = HighlightableButtonNode() - self.activityIndicator = ActivityIndicator(type: .navigationAccent(theme)) + self.activityIndicator = ActivityIndicator(type: .navigationAccent(theme.rootController.navigationBar.buttonColor)) self.activityIndicator.isHidden = true super.init() diff --git a/submodules/TelegramUI/TelegramUI/FetchCachedRepresentations.swift b/submodules/TelegramUI/TelegramUI/FetchCachedRepresentations.swift index f5a25fbd81..d9bcde2d84 100644 --- a/submodules/TelegramUI/TelegramUI/FetchCachedRepresentations.swift +++ b/submodules/TelegramUI/TelegramUI/FetchCachedRepresentations.swift @@ -16,7 +16,7 @@ import Lottie import MediaResources import PhotoResources import ImageBlur -import AnimationUI +import TelegramAnimatedStickerNode import WallpaperResources public func fetchCachedResourceRepresentation(account: Account, resource: MediaResource, representation: CachedMediaResourceRepresentation) -> Signal { diff --git a/submodules/TelegramUI/TelegramUI/HorizontalListContextResultsChatInputPanelItem.swift b/submodules/TelegramUI/TelegramUI/HorizontalListContextResultsChatInputPanelItem.swift index e3ec584cb3..5ae3c07858 100644 --- a/submodules/TelegramUI/TelegramUI/HorizontalListContextResultsChatInputPanelItem.swift +++ b/submodules/TelegramUI/TelegramUI/HorizontalListContextResultsChatInputPanelItem.swift @@ -9,7 +9,8 @@ import AVFoundation import RadialStatusNode import StickerResources import PhotoResources -import AnimationUI +import AnimatedStickerNode +import TelegramAnimatedStickerNode final class HorizontalListContextResultsChatInputPanelItem: ListViewItem { let account: Account @@ -386,7 +387,7 @@ final class HorizontalListContextResultsChatInputPanelItemNode: ListViewItemNode } let dimensions = animatedStickerFile.dimensions ?? CGSize(width: 512.0, height: 512.0) let fittedDimensions = dimensions.aspectFitted(CGSize(width: 160.0, height: 160.0)) - animationNode.setup(resource: .resource(item.account, animatedStickerFile.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached) + animationNode.setup(source: AnimatedStickerResourceSource(account: item.account, resource: animatedStickerFile.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached) } } diff --git a/submodules/TelegramUI/TelegramUI/HorizontalStickerGridItem.swift b/submodules/TelegramUI/TelegramUI/HorizontalStickerGridItem.swift index 1c7aad73b9..996aa3603e 100755 --- a/submodules/TelegramUI/TelegramUI/HorizontalStickerGridItem.swift +++ b/submodules/TelegramUI/TelegramUI/HorizontalStickerGridItem.swift @@ -7,7 +7,8 @@ import AsyncDisplayKit import Postbox import StickerResources import AccountContext -import AnimationUI +import AnimatedStickerNode +import TelegramAnimatedStickerNode final class HorizontalStickerGridItem: GridItem { let account: Account @@ -111,7 +112,7 @@ final class HorizontalStickerGridItemNode: GridItemNode { } let dimensions = item.file.dimensions ?? CGSize(width: 512.0, height: 512.0) let fittedDimensions = dimensions.aspectFitted(CGSize(width: 160.0, height: 160.0)) - animationNode.setup(resource: .resource(account, item.file.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached) + animationNode.setup(source: AnimatedStickerResourceSource(account: account, resource: item.file.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached) self.stickerFetchedDisposable.set(freeMediaFileResourceInteractiveFetched(account: account, fileReference: stickerPackFileReference(item.file), resource: item.file.resource).start()) } else { diff --git a/submodules/TelegramUI/TelegramUI/MediaInputPaneTrendingItem.swift b/submodules/TelegramUI/TelegramUI/MediaInputPaneTrendingItem.swift index 0329022ea9..1b5d3c2ee3 100644 --- a/submodules/TelegramUI/TelegramUI/MediaInputPaneTrendingItem.swift +++ b/submodules/TelegramUI/TelegramUI/MediaInputPaneTrendingItem.swift @@ -8,7 +8,8 @@ import TelegramCore import TelegramPresentationData import StickerResources import AccountContext -import AnimationUI +import AnimatedStickerNode +import TelegramAnimatedStickerNode class MediaInputPaneTrendingItem: ListViewItem { let account: Account @@ -118,7 +119,7 @@ final class TrendingTopItemNode: ASDisplayNode { } let dimensions = item.file.dimensions ?? CGSize(width: 512.0, height: 512.0) let fittedDimensions = dimensions.aspectFitted(CGSize(width: 160.0, height: 160.0)) - animationNode.setup(resource: .resource(account, item.file.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached) + animationNode.setup(source: AnimatedStickerResourceSource(account: account, resource: item.file.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached) self.loadDisposable.set(freeMediaFileResourceInteractiveFetched(account: account, fileReference: stickerPackFileReference(item.file), resource: item.file.resource).start()) } else { self.imageNode.setSignal(chatMessageSticker(account: account, file: item.file, small: true, synchronousLoad: synchronousLoads), attemptSynchronously: synchronousLoads) diff --git a/submodules/TelegramUI/TelegramUI/NotificationContentContext.swift b/submodules/TelegramUI/TelegramUI/NotificationContentContext.swift index fa30bf321d..4846c7d0eb 100644 --- a/submodules/TelegramUI/TelegramUI/NotificationContentContext.swift +++ b/submodules/TelegramUI/TelegramUI/NotificationContentContext.swift @@ -11,7 +11,8 @@ import AccountContext import Tuples import StickerResources import PhotoResources -import AnimationUI +import AnimatedStickerNode +import TelegramAnimatedStickerNode private enum NotificationContentAuthorizationError { case unauthorized @@ -313,7 +314,7 @@ public final class NotificationViewControllerImpl { let dimensions = fileReference.media.dimensions ?? CGSize(width: 512.0, height: 512.0) let fittedDimensions = dimensions.aspectFitted(CGSize(width: 512.0, height: 512.0)) strongSelf.imageNode.setSignal(chatMessageAnimatedSticker(postbox: accountAndImage.0.postbox, file: fileReference.media, small: false, size: fittedDimensions)) - animatedStickerNode.setup(resource: .resource(accountAndImage.0, fileReference.media.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .direct) + animatedStickerNode.setup(source: AnimatedStickerResourceSource(account: accountAndImage.0, resource: fileReference.media.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .direct) animatedStickerNode.visibility = true accountAndImage.0.network.shouldExplicitelyKeepWorkerConnections.set(.single(true)) diff --git a/submodules/TelegramUI/TelegramUI/OpenUrl.swift b/submodules/TelegramUI/TelegramUI/OpenUrl.swift index cb6e04a8ef..5519bf9769 100644 --- a/submodules/TelegramUI/TelegramUI/OpenUrl.swift +++ b/submodules/TelegramUI/TelegramUI/OpenUrl.swift @@ -15,6 +15,7 @@ import UrlEscaping import PassportUI import UrlHandling import WalletUI +import WalletUrl public struct ParsedSecureIdUrl { public let peerId: PeerId diff --git a/submodules/TelegramUI/TelegramUI/PeerSelectionController.swift b/submodules/TelegramUI/TelegramUI/PeerSelectionController.swift index 37f441d94b..244cb01ba1 100644 --- a/submodules/TelegramUI/TelegramUI/PeerSelectionController.swift +++ b/submodules/TelegramUI/TelegramUI/PeerSelectionController.swift @@ -29,7 +29,7 @@ public final class PeerSelectionControllerImpl: ViewController, PeerSelectionCon } if self.inProgress { - self.navigationItem.rightBarButtonItem = UIBarButtonItem(customDisplayNode: ProgressNavigationButtonNode(theme: self.presentationData.theme)) + self.navigationItem.rightBarButtonItem = UIBarButtonItem(customDisplayNode: ProgressNavigationButtonNode(color: self.presentationData.theme.rootController.navigationBar.controlColor)) } else { self.navigationItem.rightBarButtonItem = nil } diff --git a/submodules/TelegramUI/TelegramUI/Resources/PresentationStrings.mapping b/submodules/TelegramUI/TelegramUI/Resources/PresentationStrings.mapping index 75f4a93be4928ab77cd4c2b402f1305fb0b58e54..e8a787649d9ec0d8b3d2aeace83ea49963205a8d 100644 GIT binary patch delta 1666 zcmZWq&2Jl35civS6FaffG;tDt#E#>9G^EY80b0Hqibe zbQ9~qrvNRdWAq**%TgH>uevq&5FiuCFK9E%*^H*8r!&j>ncRF%ixb?5_qSMgR7=ov z8<{+txn41BF4Rf=Q_+jRDG(h^lB-?1xe)p)pEuTd{r)~e{bUP*+b%yTPxS{iqVyBi zg^#_^smOZ2^9roz{%?N|_%cEI{UVvEGkidQaeyE#l`a zRmon!lTFagM(`m(yyrN1WqAj=o#rODjlv1M+6=ug>ZzVu58=562rzYL3KEf%6z|sR zcEUaBw&N6zF_PsNwgzEHd6A-$xD5~s?#b{af)dqlA9fGab4#yUFB2x4yWgNXMdCC* zYJo)O8S=@J_L?Hecm-q45K~?ycz9ocN29ONyS(ZU$ujx6}C8{kP06lUUvLTl5)IVy`)cK)G%!Uk3t41?{#t#KBr?%q^z PypgtrkTV@sTZU(&s}Xf-7Ik?A9!Xme}%tfpmVvuhWZRu*Tp z7@lvYTjQv=P~ZeP4c9;ZBwo+=2fa>zlK5>95{VvS+R3y{y~d3^H%wiXDfN2rqiZaw zxt7N6IvYIZr}dLP428N@La1Z8T7Seef9CNFc51?6Zi%nBp-Qm zo(jwERLvR}svB7)SYC-gDbS7MjD|Gf!E5JO*Ns+aXOq|qFv(8h+kS|$hh>$0Yzn{j z!Lh_C_h_CAp>ObIv&?I%6yj<8!w*A=GcNyMH5xBk6+=9N83m#vj}kAlmswF^jZJxs zfB>0no71(ks0Sg^^EhF$gu^qQ8bO?HukSn;LvUTAk7N+J9k!NPxFfFl4@PNE2v3D1O z>{&b!qBJh!evsDrIU*z2=7mTzt=03`8m7nR1-$Bm1ia|>XrFqNdWjt6i*uy2tDJ9% zHA16K2xXog#+T6o=#A@y{{J;tFe_VE@Gl1athkqhfoX%B95uMwld|Q6-FMMtuGhr6 z>+KBO9qI=D)&xCl6YmBfHfg$N4@R(H6`hAqTqWknV_C3DC9#F$UKnO2e2Y?6%H)&2 y!5|sFH<1b*%BVGzvCF_46XffN=+Jh{dj18sa WalletConfiguration { + if let data = appConfiguration.data, let config = data["wallet_config"] as? String, let blockchainName = data["wallet_blockchain_name"] as? String { + var disableProxy = false + if let value = data["wallet_disable_proxy"] as? String { + disableProxy = value != "0" + } else if let value = data["wallet_disable_proxy"] as? Int { + disableProxy = value != 0 + } + return WalletConfiguration(config: config, blockchainName: blockchainName, disableProxy: disableProxy) + } else { + return .defaultValue + } + } +} + +final class WalletStorageInterfaceImpl: WalletStorageInterface { + private let postbox: Postbox + + init(postbox: Postbox) { + self.postbox = postbox + } + + func watchWalletRecords() -> Signal<[WalletStateRecord], NoError> { + return self.postbox.preferencesView(keys: [PreferencesKeys.walletCollection]) + |> map { view -> [WalletStateRecord] in + guard let walletCollection = view.values[PreferencesKeys.walletCollection] as? WalletCollection else { + return [] + } + return walletCollection.wallets.flatMap { item -> WalletStateRecord? in + do { + return WalletStateRecord(info: try JSONDecoder().decode(WalletInfo.self, from: item.info), exportCompleted: item.exportCompleted, state: item.state.flatMap { try? JSONDecoder().decode(CombinedWalletState.self, from: $0) }) + } catch { + return nil + } + } + } + } + + func getWalletRecords() -> Signal<[WalletStateRecord], NoError> { + return self.postbox.transaction { transaction -> [WalletStateRecord] in + guard let walletCollection = transaction.getPreferencesEntry(key: PreferencesKeys.walletCollection) as? WalletCollection else { + return [] + } + return walletCollection.wallets.flatMap { item -> WalletStateRecord? in + do { + return WalletStateRecord(info: try JSONDecoder().decode(WalletInfo.self, from: item.info), exportCompleted: item.exportCompleted, state: item.state.flatMap { try? JSONDecoder().decode(CombinedWalletState.self, from: $0) }) + } catch { + return nil + } + } + } + } + + func updateWalletRecords(_ f: @escaping ([WalletStateRecord]) -> [WalletStateRecord]) -> Signal<[WalletStateRecord], NoError> { + return self.postbox.transaction { transaction -> [WalletStateRecord] in + var updatedRecords: [WalletStateRecord] = [] + transaction.updatePreferencesEntry(key: PreferencesKeys.walletCollection, { current in + var walletCollection = (current as? WalletCollection) ?? WalletCollection(wallets: []) + let updatedItems = f(walletCollection.wallets.flatMap { item -> WalletStateRecord? in + do { + return WalletStateRecord(info: try JSONDecoder().decode(WalletInfo.self, from: item.info), exportCompleted: item.exportCompleted, state: item.state.flatMap { try? JSONDecoder().decode(CombinedWalletState.self, from: $0) }) + } catch { + return nil + } + }) + walletCollection.wallets = updatedItems.flatMap { item in + do { + return WalletCollectionItem(info: try JSONEncoder().encode(item.info), exportCompleted: item.exportCompleted, state: item.state.flatMap { + try? JSONEncoder().encode($0) + }) + } catch { + return nil + } + } + return walletCollection + }) + return updatedRecords + } + } +} final class WalletContextImpl: WalletContext { private let context: AccountContext - let postbox: Postbox - let network: Network + let storage: WalletStorageInterface let tonInstance: TonInstance let keychain: TonKeychain - let presentationData: PresentationData + let presentationData: WalletPresentationData var inForeground: Signal { return self.context.sharedContext.applicationBindings.applicationInForeground @@ -25,11 +109,97 @@ final class WalletContextImpl: WalletContext { init(context: AccountContext, tonContext: TonContext) { self.context = context - self.postbox = self.context.account.postbox - self.network = self.context.account.network + self.storage = WalletStorageInterfaceImpl(postbox: self.context.account.postbox) + self.tonInstance = tonContext.instance self.keychain = tonContext.keychain - self.presentationData = context.sharedContext.currentPresentationData.with { $0 } + let presentationData = context.sharedContext.currentPresentationData.with { $0 } + let theme = presentationData.theme + let strings = presentationData.strings + let timeFormat: WalletTimeFormat + switch presentationData.dateTimeFormat.timeFormat { + case .military: + timeFormat = .military + case .regular: + timeFormat = .regular + } + let dateFormat: WalletDateFormat + switch presentationData.dateTimeFormat.dateFormat { + case .dayFirst: + dateFormat = .dayFirst + case .monthFirst: + dateFormat = .monthFirst + } + + let navigationBarData = NavigationBarPresentationData(presentationData: presentationData) + + self.presentationData = WalletPresentationData( + theme: WalletTheme( + info: WalletInfoTheme( + incomingFundsTitleColor: theme.chatList.secretTitleColor, + outgoingFundsTitleColor: theme.list.itemDestructiveColor + ), setup: WalletSetupTheme( + buttonFillColor: theme.list.itemCheckColors.fillColor, + buttonForegroundColor: theme.list.itemCheckColors.foregroundColor, + inputBackgroundColor: theme.actionSheet.inputBackgroundColor, + inputPlaceholderColor: theme.actionSheet.inputPlaceholderColor, + inputTextColor: theme.actionSheet.inputTextColor, + inputClearButtonColor: theme.actionSheet.inputClearButtonColor.withAlphaComponent(0.8) + ), + list: WalletListTheme( + itemPrimaryTextColor: theme.list.itemPrimaryTextColor, + itemSecondaryTextColor: theme.list.itemSecondaryTextColor, + itemPlaceholderTextColor: theme.list.itemPlaceholderTextColor, + itemDestructiveColor: theme.list.itemDestructiveColor, + itemAccentColor: theme.list.itemAccentColor, + itemDisabledTextColor: theme.list.itemDisabledTextColor, + plainBackgroundColor: theme.list.plainBackgroundColor, + blocksBackgroundColor: theme.list.blocksBackgroundColor, + itemPlainSeparatorColor: theme.list.itemPlainSeparatorColor, + itemBlocksBackgroundColor: theme.list.itemBlocksBackgroundColor, + itemBlocksSeparatorColor: theme.list.itemBlocksSeparatorColor, + itemHighlightedBackgroundColor: theme.list.itemHighlightedBackgroundColor, + sectionHeaderTextColor: theme.list.sectionHeaderTextColor, + freeTextColor: theme.list.freeTextColor, + freeTextErrorColor: theme.list.freeTextErrorColor, + inputClearButtonColor: theme.list.inputClearButtonColor + ), + statusBarStyle: theme.rootController.statusBarStyle.style, + navigationBar: navigationBarData.theme, + keyboardAppearance: theme.rootController.keyboardColor.keyboardAppearance, + alert: AlertControllerTheme(presentationTheme: theme), + actionSheet: ActionSheetControllerTheme(presentationTheme: theme) + ), strings: WalletStrings( + primaryComponent: WalletStringsComponent( + languageCode: strings.primaryComponent.languageCode, + localizedName: strings.primaryComponent.localizedName, + pluralizationRulesCode: strings.primaryComponent.pluralizationRulesCode, + dict: strings.primaryComponent.dict + ), + secondaryComponent: strings.secondaryComponent.flatMap { component in + return WalletStringsComponent( + languageCode: component.languageCode, + localizedName: component.localizedName, + pluralizationRulesCode: component.pluralizationRulesCode, + dict: component.dict + ) + }, + groupingSeparator: strings.groupingSeparator + ), dateTimeFormat: WalletPresentationDateTimeFormat( + timeFormat: timeFormat, + dateFormat: dateFormat, + dateSeparator: presentationData.dateTimeFormat.dateSeparator, + decimalSeparator: presentationData.dateTimeFormat.decimalSeparator, + groupingSeparator: presentationData.dateTimeFormat.groupingSeparator + ) + ) + } + + func getServerSalt() -> Signal { + return getServerWalletSalt(network: self.context.account.network) + |> mapError { _ -> WalletContextGetServerSaltError in + return .generic + } } func presentNativeController(_ controller: UIViewController) { diff --git a/submodules/TelegramUpdateUI/BUCK b/submodules/TelegramUpdateUI/BUCK index 760c462cc2..1a6144eb08 100644 --- a/submodules/TelegramUpdateUI/BUCK +++ b/submodules/TelegramUpdateUI/BUCK @@ -13,6 +13,7 @@ static_library( "//submodules/TelegramCore:TelegramCore#shared", "//submodules/TelegramPresentationData:TelegramPresentationData", "//submodules/ItemListUI:ItemListUI", + "//submodules/PresentationDataUtils:PresentationDataUtils", ], frameworks = [ "$SDKROOT/System/Library/Frameworks/Foundation.framework", diff --git a/submodules/TextFormat/BUCK b/submodules/TextFormat/BUCK index e5adc07eab..7f3a987751 100644 --- a/submodules/TextFormat/BUCK +++ b/submodules/TextFormat/BUCK @@ -9,6 +9,7 @@ static_library( "//submodules/TelegramCore:TelegramCore#dynamic", "//submodules/Display:Display#dynamic", "//submodules/TelegramPresentationData:TelegramPresentationData", + "//submodules/Markdown:Markdown", ], frameworks = [ "$SDKROOT/System/Library/Frameworks/Foundation.framework", diff --git a/submodules/TextFormat/Sources/AddFormatToStringWithRanges.swift b/submodules/TextFormat/Sources/AddFormatToStringWithRanges.swift index f0c2058f4e..f5d8de5bb7 100644 --- a/submodules/TextFormat/Sources/AddFormatToStringWithRanges.swift +++ b/submodules/TextFormat/Sources/AddFormatToStringWithRanges.swift @@ -1,5 +1,6 @@ import Foundation import UIKit +import Markdown public func addAttributesToStringWithRanges(_ stringWithRanges: (String, [(Int, NSRange)]), body: MarkdownAttributeSet, argumentAttributes: [Int: MarkdownAttributeSet], textAlignment: NSTextAlignment = .natural) -> NSAttributedString { let result = NSMutableAttributedString() diff --git a/submodules/UndoUI/BUCK b/submodules/UndoUI/BUCK index 2c9ca54a7d..0855d5c103 100644 --- a/submodules/UndoUI/BUCK +++ b/submodules/UndoUI/BUCK @@ -13,8 +13,10 @@ static_library( "//submodules/TelegramCore:TelegramCore#shared", "//submodules/TelegramPresentationData:TelegramPresentationData", "//submodules/TextFormat:TextFormat", + "//submodules/Markdown:Markdown", "//submodules/RadialStatusNode:RadialStatusNode", "//submodules/AnimationUI:AnimationUI", + "//submodules/AnimatedStickerNode:AnimatedStickerNode", "//submodules/AppBundle:AppBundle", ], frameworks = [ diff --git a/submodules/UndoUI/Sources/UndoOverlayControllerNode.swift b/submodules/UndoUI/Sources/UndoOverlayControllerNode.swift index 5975ba0bfb..b648b02e02 100644 --- a/submodules/UndoUI/Sources/UndoOverlayControllerNode.swift +++ b/submodules/UndoUI/Sources/UndoOverlayControllerNode.swift @@ -4,10 +4,12 @@ import AsyncDisplayKit import Display import SwiftSignalKit import TelegramPresentationData -import AnimationUI import TextFormat +import Markdown import RadialStatusNode import AppBundle +import AnimatedStickerNode +import AnimationUI final class UndoOverlayControllerNode: ViewControllerTracingNode { private let elevatedLayout: Bool @@ -126,7 +128,7 @@ final class UndoOverlayControllerNode: ViewControllerTracingNode { self.animationNode = nil self.animatedStickerNode = AnimatedStickerNode() self.animatedStickerNode?.visibility = true - self.animatedStickerNode?.setup(resource: .localFile(path), width: 100, height: 100, playbackMode: .once, mode: .direct) + self.animatedStickerNode?.setup(source: AnimatedStickerNodeLocalFileSource(path: path), width: 100, height: 100, playbackMode: .once, mode: .direct) let body = MarkdownAttributeSet(font: Font.regular(14.0), textColor: .white) let bold = MarkdownAttributeSet(font: Font.semibold(14.0), textColor: .white) diff --git a/submodules/UrlHandling/BUCK b/submodules/UrlHandling/BUCK index 49ac625612..6023479e72 100644 --- a/submodules/UrlHandling/BUCK +++ b/submodules/UrlHandling/BUCK @@ -12,6 +12,7 @@ static_library( "//submodules/MtProtoKit:MtProtoKit#shared", "//submodules/AccountContext:AccountContext", "//submodules/TelegramUIPreferences:TelegramUIPreferences", + "//submodules/WalletUrl:WalletUrl", ], frameworks = [ "$SDKROOT/System/Library/Frameworks/Foundation.framework", diff --git a/submodules/UrlHandling/Sources/UrlHandling.swift b/submodules/UrlHandling/Sources/UrlHandling.swift index 0b0270935f..ae5bd673d3 100644 --- a/submodules/UrlHandling/Sources/UrlHandling.swift +++ b/submodules/UrlHandling/Sources/UrlHandling.swift @@ -11,6 +11,7 @@ import MtProtoKitDynamic import TelegramPresentationData import TelegramUIPreferences import AccountContext +import WalletUrl public enum ParsedInternalPeerUrlParameter { case botStart(String) @@ -435,42 +436,3 @@ public func resolveInstantViewUrl(account: Account, url: String) -> Signal Signal + public let encrypt: (Data) -> Signal + public let decrypt: (TonKeychainEncryptedData) -> Signal + + public init(encryptionPublicKey: @escaping () -> Signal, encrypt: @escaping (Data) -> Signal, decrypt: @escaping (TonKeychainEncryptedData) -> Signal) { + self.encryptionPublicKey = encryptionPublicKey + self.encrypt = encrypt + self.decrypt = decrypt + } +} + +public enum TonNetworkProxyResult { + case reponse(Data) + case error(String) +} + +public protocol TonNetworkProxy: class { + func request(data: Data, timeout: Double, completion: @escaping (TonNetworkProxyResult) -> Void) -> Disposable +} + +private final class TonInstanceImpl { + private let queue: Queue + private let basePath: String + private let config: String + private let blockchainName: String + private let proxy: TonNetworkProxy? + private var instance: TON? + + init(queue: Queue, basePath: String, config: String, blockchainName: String, proxy: TonNetworkProxy?) { + self.queue = queue + self.basePath = basePath + self.config = config + self.blockchainName = blockchainName + self.proxy = proxy + } + + func withInstance(_ f: (TON) -> Void) { + let instance: TON + if let current = self.instance { + instance = current + } else { + let proxy = self.proxy + instance = TON(keystoreDirectory: self.basePath + "/ton-keystore", config: self.config, blockchainName: self.blockchainName, performExternalRequest: { request in + if let proxy = proxy { + let _ = proxy.request(data: request.data, timeout: 20.0, completion: { result in + switch result { + case let .reponse(data): + request.onResult(data, nil) + case let .error(description): + request.onResult(nil, description) + } + }) + } else { + request.onResult(nil, "NETWORK_DISABLED") + } + }, enableExternalRequests: proxy != nil) + self.instance = instance + } + f(instance) + } +} + +public final class TonInstance { + private let queue: Queue + private let impl: QueueLocalObject + + public init(basePath: String, config: String, blockchainName: String, proxy: TonNetworkProxy?) { + self.queue = .mainQueue() + let queue = self.queue + self.impl = QueueLocalObject(queue: queue, generate: { + return TonInstanceImpl(queue: queue, basePath: basePath, config: config, blockchainName: blockchainName, proxy: proxy) + }) + } + + fileprivate func exportKey(key: TONKey, localPassword: Data) -> Signal<[String], NoError> { + return Signal { subscriber in + let disposable = MetaDisposable() + + self.impl.with { impl in + impl.withInstance { ton in + let cancel = ton.export(key, localPassword: localPassword).start(next: { wordList in + guard let wordList = wordList as? [String] else { + assertionFailure() + return + } + subscriber.putNext(wordList) + subscriber.putCompletion() + }) + disposable.set(ActionDisposable { + cancel?.dispose() + }) + } + } + + return disposable + } + } + + fileprivate func createWallet(keychain: TonKeychain, localPassword: Data) -> Signal<(WalletInfo, [String]), CreateWalletError> { + return Signal { subscriber in + let disposable = MetaDisposable() + self.impl.with { impl in + impl.withInstance { ton in + let cancel = ton.createKey(withLocalPassword: localPassword, mnemonicPassword: Data()).start(next: { key in + guard let key = key as? TONKey else { + assertionFailure() + return + } + let cancel = keychain.encrypt(key.secret).start(next: { encryptedSecretData in + let _ = self.exportKey(key: key, localPassword: localPassword).start(next: { wordList in + subscriber.putNext((WalletInfo(publicKey: WalletPublicKey(rawValue: key.publicKey), encryptedSecret: encryptedSecretData), wordList)) + subscriber.putCompletion() + }, error: { error in + subscriber.putError(.generic) + }) + }, error: { _ in + subscriber.putError(.generic) + }, completed: { + }) + }, error: { _ in + }, completed: { + }) + disposable.set(ActionDisposable { + cancel?.dispose() + }) + } + } + + return disposable + } + } + + fileprivate func importWallet(keychain: TonKeychain, wordList: [String], localPassword: Data) -> Signal { + return Signal { subscriber in + let disposable = MetaDisposable() + + self.impl.with { impl in + impl.withInstance { ton in + let cancel = ton.importKey(withLocalPassword: localPassword, mnemonicPassword: Data(), wordList: wordList).start(next: { key in + guard let key = key as? TONKey else { + subscriber.putError(.generic) + return + } + let cancel = keychain.encrypt(key.secret).start(next: { encryptedSecretData in + subscriber.putNext(WalletInfo(publicKey: WalletPublicKey(rawValue: key.publicKey), encryptedSecret: encryptedSecretData)) + subscriber.putCompletion() + }, error: { _ in + subscriber.putError(.generic) + }, completed: { + }) + }, error: { _ in + subscriber.putError(.generic) + }, completed: { + }) + disposable.set(ActionDisposable { + cancel?.dispose() + }) + } + } + + return disposable + } + } + + fileprivate func walletAddress(publicKey: WalletPublicKey) -> Signal { + return Signal { subscriber in + let disposable = MetaDisposable() + + self.impl.with { impl in + impl.withInstance { ton in + let cancel = ton.getWalletAccountAddress(withPublicKey: publicKey.rawValue).start(next: { address in + guard let address = address as? String else { + return + } + subscriber.putNext(address) + subscriber.putCompletion() + }, error: { _ in + }, completed: { + }) + disposable.set(ActionDisposable { + cancel?.dispose() + }) + } + } + + return disposable + } + } + + private func getWalletStateRaw(address: String) -> Signal { + return Signal { subscriber in + let disposable = MetaDisposable() + + self.impl.with { impl in + impl.withInstance { ton in + let cancel = ton.getAccountState(withAddress: address).start(next: { state in + guard let state = state as? TONAccountState else { + return + } + subscriber.putNext(state) + }, error: { error in + if let error = error as? TONError { + if error.text.hasPrefix("LITE_SERVER_") { + subscriber.putError(.network) + } else { + subscriber.putError(.generic) + } + } else { + subscriber.putError(.generic) + } + }, completed: { + subscriber.putCompletion() + }) + disposable.set(ActionDisposable { + cancel?.dispose() + }) + } + } + + return disposable + } + } + + fileprivate func getWalletState(address: String) -> Signal<(WalletState, Int64), GetWalletStateError> { + return self.getWalletStateRaw(address: address) + |> map { state in + return (WalletState(balance: state.balance, lastTransactionId: state.lastTransactionId.flatMap(WalletTransactionId.init(tonTransactionId:))), state.syncUtime) + } + } + + fileprivate func walletLastTransactionId(address: String) -> Signal { + return Signal { subscriber in + let disposable = MetaDisposable() + + self.impl.with { impl in + impl.withInstance { ton in + let cancel = ton.getAccountState(withAddress: address).start(next: { state in + guard let state = state as? TONAccountState else { + subscriber.putNext(nil) + return + } + subscriber.putNext(state.lastTransactionId.flatMap(WalletTransactionId.init(tonTransactionId:))) + }, error: { error in + if let error = error as? TONError { + if error.text.hasPrefix("ДITE_SERVER_") { + subscriber.putError(.network) + } else { + subscriber.putError(.generic) + } + } else { + subscriber.putError(.generic) + } + }, completed: { + subscriber.putCompletion() + }) + disposable.set(ActionDisposable { + cancel?.dispose() + }) + } + } + + return disposable + } + } + + fileprivate func getWalletTransactions(address: String, previousId: WalletTransactionId) -> Signal<[WalletTransaction], GetWalletTransactionsError> { + return Signal { subscriber in + let disposable = MetaDisposable() + + self.impl.with { impl in + impl.withInstance { ton in + let cancel = ton.getTransactionList(withAddress: address, lt: previousId.lt, hash: previousId.transactionHash).start(next: { transactions in + guard let transactions = transactions as? [TONTransaction] else { + subscriber.putError(.generic) + return + } + subscriber.putNext(transactions.map(WalletTransaction.init(tonTransaction:))) + }, error: { error in + if let error = error as? TONError { + if error.text.hasPrefix("LITE_SERVER_") { + subscriber.putError(.network) + } else { + subscriber.putError(.generic) + } + } else { + subscriber.putError(.generic) + } + }, completed: { + subscriber.putCompletion() + }) + disposable.set(ActionDisposable { + cancel?.dispose() + }) + } + } + + return disposable + } + } + + fileprivate func sendGramsFromWallet(decryptedSecret: Data, localPassword: Data, walletInfo: WalletInfo, fromAddress: String, toAddress: String, amount: Int64, textMessage: Data, forceIfDestinationNotInitialized: Bool, timeout: Int32, randomId: Int64) -> Signal { + let key = TONKey(publicKey: walletInfo.publicKey.rawValue, secret: decryptedSecret) + return Signal { subscriber in + let disposable = MetaDisposable() + + self.impl.with { impl in + impl.withInstance { ton in + let cancel = ton.sendGrams(from: key, localPassword: localPassword, fromAddress: fromAddress, toAddress: toAddress, amount: amount, textMessage: textMessage, forceIfDestinationNotInitialized: forceIfDestinationNotInitialized, timeout: timeout, randomId: randomId).start(next: { result in + guard let result = result as? TONSendGramsResult else { + subscriber.putError(.generic) + return + } + subscriber.putNext(PendingWalletTransaction(timestamp: Int64(Date().timeIntervalSince1970), validUntilTimestamp: result.sentUntil, bodyHash: result.bodyHash, address: toAddress, value: amount, comment: textMessage)) + subscriber.putCompletion() + }, error: { error in + if let error = error as? TONError { + if error.text.hasPrefix("INVALID_ACCOUNT_ADDRESS") { + subscriber.putError(.invalidAddress) + } else if error.text.hasPrefix("DANGEROUS_TRANSACTION") { + subscriber.putError(.destinationIsNotInitialized) + } else if error.text.hasPrefix("MESSAGE_TOO_LONG") { + subscriber.putError(.messageTooLong) + } else if error.text.hasPrefix("NOT_ENOUGH_FUNDS") { + subscriber.putError(.notEnoughFunds) + } else if error.text.hasPrefix("LITE_SERVER_") { + subscriber.putError(.network) + } else { + subscriber.putError(.generic) + } + } else { + subscriber.putError(.generic) + } + }, completed: { + subscriber.putCompletion() + }) + disposable.set(ActionDisposable { + cancel?.dispose() + }) + } + } + + return disposable + } + } + + fileprivate func walletRestoreWords(publicKey: WalletPublicKey, decryptedSecret: Data, localPassword: Data) -> Signal<[String], WalletRestoreWordsError> { + return Signal { subscriber in + let disposable = MetaDisposable() + + self.impl.with { impl in + impl.withInstance { ton in + let cancel = ton.export(TONKey(publicKey: publicKey.rawValue, secret: decryptedSecret), localPassword: localPassword).start(next: { wordList in + guard let wordList = wordList as? [String] else { + subscriber.putError(.generic) + return + } + subscriber.putNext(wordList) + }, error: { _ in + subscriber.putError(.generic) + }, completed: { + subscriber.putCompletion() + }) + disposable.set(ActionDisposable { + cancel?.dispose() + }) + } + } + + return disposable + } + } + + fileprivate func deleteAllLocalWalletsData() -> Signal { + return Signal { subscriber in + let disposable = MetaDisposable() + + self.impl.with { impl in + impl.withInstance { ton in + let cancel = ton.deleteAllKeys().start(next: { _ in + assertionFailure() + }, error: { _ in + subscriber.putError(.generic) + }, completed: { + subscriber.putCompletion() + }) + disposable.set(ActionDisposable { + cancel?.dispose() + }) + } + } + + return disposable + } + } + fileprivate func encrypt(_ decryptedData: Data, secret: Data) -> Signal { + return Signal { subscriber in + let disposable = MetaDisposable() + + self.impl.with { impl in + impl.withInstance { ton in + subscriber.putNext(ton.encrypt(decryptedData, secret: secret)) + subscriber.putCompletion() + } + } + + return disposable + } + } + fileprivate func decrypt(_ encryptedData: Data, secret: Data) -> Signal { + return Signal { subscriber in + let disposable = MetaDisposable() + + self.impl.with { impl in + impl.withInstance { ton in + subscriber.putNext(ton.decrypt(encryptedData, secret: secret)) + subscriber.putCompletion() + } + } + + return disposable + } + } +} + +public struct WalletPublicKey: Codable, Hashable { + public var rawValue: String + + public init(rawValue: String) { + self.rawValue = rawValue + } +} + +public struct WalletInfo: Codable, Equatable { + public let publicKey: WalletPublicKey + public let encryptedSecret: TonKeychainEncryptedData + + public init(publicKey: WalletPublicKey, encryptedSecret: TonKeychainEncryptedData) { + self.publicKey = publicKey + self.encryptedSecret = encryptedSecret + } +} + +public struct CombinedWalletState: Codable, Equatable { + public var walletState: WalletState + public var timestamp: Int64 + public var topTransactions: [WalletTransaction] + public var pendingTransactions: [PendingWalletTransaction] +} + +public struct WalletStateRecord: Equatable { + public let info: WalletInfo + public var exportCompleted: Bool + public var state: CombinedWalletState? + + public init(info: WalletInfo, exportCompleted: Bool, state: CombinedWalletState?) { + self.info = info + self.exportCompleted = exportCompleted + self.state = state + } +} + +public enum CreateWalletError { + case generic +} + +public func tonlibEncrypt(tonInstance: TonInstance, decryptedData: Data, secret: Data) -> Signal { + return tonInstance.encrypt(decryptedData, secret: secret) +} +public func tonlibDecrypt(tonInstance: TonInstance, encryptedData: Data, secret: Data) -> Signal { + return tonInstance.decrypt(encryptedData, secret: secret) +} + +public func createWallet(storage: WalletStorageInterface, tonInstance: TonInstance, keychain: TonKeychain, localPassword: Data) -> Signal<(WalletInfo, [String]), CreateWalletError> { + return tonInstance.createWallet(keychain: keychain, localPassword: localPassword) + |> mapToSignal { walletInfo, wordList -> Signal<(WalletInfo, [String]), CreateWalletError> in + return storage.updateWalletRecords({ records in + var records = records + records.append(WalletStateRecord(info: walletInfo, exportCompleted: false, state: nil)) + return records + }) + |> map { _ -> (WalletInfo, [String]) in + return (walletInfo, wordList) + } + |> castError(CreateWalletError.self) + } +} + +public func confirmWalletExported(storage: WalletStorageInterface, publicKey: WalletPublicKey) -> Signal { + return storage.updateWalletRecords { records in + var records = records + for i in 0 ..< records.count { + if records[i].info.publicKey == publicKey { + records[i].exportCompleted = true + } + } + return records + } + |> ignoreValues +} + +private enum ImportWalletInternalError { + case generic +} + +public enum ImportWalletError { + case generic +} + +public func importWallet(storage: WalletStorageInterface, tonInstance: TonInstance, keychain: TonKeychain, wordList: [String], localPassword: Data) -> Signal { + return tonInstance.importWallet(keychain: keychain, wordList: wordList, localPassword: localPassword) + |> `catch` { error -> Signal in + switch error { + case .generic: + return .fail(.generic) + } + } + |> mapToSignal { walletInfo -> Signal in + return storage.updateWalletRecords { records in + var records = records + records.append(WalletStateRecord(info: walletInfo, exportCompleted: true, state: nil)) + return records + } + |> map { _ -> WalletInfo in + return walletInfo + } + |> castError(ImportWalletError.self) + } +} + +public enum DeleteAllLocalWalletsDataError { + case generic +} + +public func deleteAllLocalWalletsData(storage: WalletStorageInterface, tonInstance: TonInstance) -> Signal { + return tonInstance.deleteAllLocalWalletsData() + |> `catch` { _ -> Signal in + return .complete() + } + |> then( + storage.updateWalletRecords { _ in [] } + |> castError(DeleteAllLocalWalletsDataError.self) + |> ignoreValues + ) +} + +public enum WalletRestoreWordsError { + case generic +} + +public func walletRestoreWords(tonInstance: TonInstance, publicKey: WalletPublicKey, decryptedSecret: Data, localPassword: Data) -> Signal<[String], WalletRestoreWordsError> { + return tonInstance.walletRestoreWords(publicKey: publicKey, decryptedSecret: decryptedSecret, localPassword: localPassword) +} + +public struct WalletState: Codable, Equatable { + public let balance: Int64 + public let lastTransactionId: WalletTransactionId? + + public init(balance: Int64, lastTransactionId: WalletTransactionId?) { + self.balance = balance + self.lastTransactionId = lastTransactionId + } +} + +public func walletAddress(publicKey: WalletPublicKey, tonInstance: TonInstance) -> Signal { + return tonInstance.walletAddress(publicKey: publicKey) +} + +private enum GetWalletStateError { + case generic + case network +} + +private func getWalletState(address: String, tonInstance: TonInstance) -> Signal<(WalletState, Int64), GetWalletStateError> { + return tonInstance.getWalletState(address: address) +} + +public enum GetCombinedWalletStateError { + case generic + case network +} + +public enum CombinedWalletStateResult { + case cached(CombinedWalletState?) + case updated(CombinedWalletState) +} + +public enum CombinedWalletStateSubject { + case wallet(WalletInfo) + case address(String) +} + +public func getCombinedWalletState(storage: WalletStorageInterface, subject: CombinedWalletStateSubject, tonInstance: TonInstance, onlyCached: Bool = false) -> Signal { + switch subject { + case let .wallet(walletInfo): + return storage.getWalletRecords() + |> map { records -> CombinedWalletState? in + for item in records { + if item.info.publicKey == walletInfo.publicKey { + return item.state + } + } + return nil + } + |> castError(GetCombinedWalletStateError.self) + |> mapToSignal { cachedState -> Signal in + if onlyCached { + return .single(.cached(cachedState)) + } + return .single(.cached(cachedState)) + |> then( + tonInstance.walletAddress(publicKey: walletInfo.publicKey) + |> castError(GetCombinedWalletStateError.self) + |> mapToSignal { address -> Signal in + return getWalletState(address: address, tonInstance: tonInstance) + |> retryTonRequest(isNetworkError: { error in + if case .network = error { + return true + } else { + return false + } + }) + |> mapError { error -> GetCombinedWalletStateError in + if case .network = error { + return .network + } else { + return .generic + } + } + |> mapToSignal { walletState, syncUtime -> Signal in + let topTransactions: Signal<[WalletTransaction], GetCombinedWalletStateError> + if walletState.lastTransactionId == cachedState?.walletState.lastTransactionId { + topTransactions = .single(cachedState?.topTransactions ?? []) + } else { + topTransactions = getWalletTransactions(address: address, previousId: nil, tonInstance: tonInstance) + |> mapError { error -> GetCombinedWalletStateError in + if case .network = error { + return .network + } else { + return .generic + } + } + } + return topTransactions + |> mapToSignal { topTransactions -> Signal in + let lastTransactionTimestamp = topTransactions.last?.timestamp + var listTransactionBodyHashes = Set() + for transaction in topTransactions { + if let message = transaction.inMessage { + listTransactionBodyHashes.insert(message.bodyHash) + } + for message in transaction.outMessages { + listTransactionBodyHashes.insert(message.bodyHash) + } + } + let pendingTransactions = (cachedState?.pendingTransactions ?? []).filter { transaction in + if transaction.validUntilTimestamp <= syncUtime { + return false + } else if let lastTransactionTimestamp = lastTransactionTimestamp, transaction.validUntilTimestamp <= lastTransactionTimestamp { + return false + } else { + if listTransactionBodyHashes.contains(transaction.bodyHash) { + return false + } + return true + } + } + let combinedState = CombinedWalletState(walletState: walletState, timestamp: syncUtime, topTransactions: topTransactions, pendingTransactions: pendingTransactions) + + return storage.updateWalletRecords { records in + var records = records + for i in 0 ..< records.count { + if records[i].info.publicKey == walletInfo.publicKey { + records[i].state = combinedState + } + } + return records + } + |> map { _ -> CombinedWalletStateResult in + return .updated(combinedState) + } + |> castError(GetCombinedWalletStateError.self) + } + } + } + ) + } + case let .address(address): + let updated = getWalletState(address: address, tonInstance: tonInstance) + |> mapError { _ -> GetCombinedWalletStateError in + return .generic + } + |> mapToSignal { walletState, syncUtime -> Signal in + let topTransactions: Signal<[WalletTransaction], GetCombinedWalletStateError> + + topTransactions = getWalletTransactions(address: address, previousId: nil, tonInstance: tonInstance) + |> mapError { _ -> GetCombinedWalletStateError in + return .generic + } + return topTransactions + |> mapToSignal { topTransactions -> Signal in + let combinedState = CombinedWalletState(walletState: walletState, timestamp: syncUtime, topTransactions: topTransactions, pendingTransactions: []) + return .single(.updated(combinedState)) + } + } + return .single(.cached(nil)) + |> then(updated) + } +} + +public enum SendGramsFromWalletError { + case generic + case secretDecryptionFailed + case invalidAddress + case destinationIsNotInitialized + case messageTooLong + case notEnoughFunds + case network +} + +public func sendGramsFromWallet(storage: WalletStorageInterface, tonInstance: TonInstance, walletInfo: WalletInfo, decryptedSecret: Data, localPassword: Data, toAddress: String, amount: Int64, textMessage: Data, forceIfDestinationNotInitialized: Bool, timeout: Int32, randomId: Int64) -> Signal<[PendingWalletTransaction], SendGramsFromWalletError> { + return walletAddress(publicKey: walletInfo.publicKey, tonInstance: tonInstance) + |> castError(SendGramsFromWalletError.self) + |> mapToSignal { fromAddress -> Signal<[PendingWalletTransaction], SendGramsFromWalletError> in + return tonInstance.sendGramsFromWallet(decryptedSecret: decryptedSecret, localPassword: localPassword, walletInfo: walletInfo, fromAddress: fromAddress, toAddress: toAddress, amount: amount, textMessage: textMessage, forceIfDestinationNotInitialized: forceIfDestinationNotInitialized, timeout: timeout, randomId: randomId) + |> mapToSignal { result -> Signal<[PendingWalletTransaction], SendGramsFromWalletError> in + return storage.updateWalletRecords { records in + var records = records + for i in 0 ..< records.count { + if records[i].info.publicKey == walletInfo.publicKey { + if var state = records[i].state { + state.pendingTransactions.insert(result, at: 0) + records[i].state = state + } + } + } + return records + } + |> map { records -> [PendingWalletTransaction] in + for i in 0 ..< records.count { + if records[i].info.publicKey == walletInfo.publicKey { + if let state = records[i].state { + return state.pendingTransactions + } + } + } + return [] + } + |> castError(SendGramsFromWalletError.self) + } + } +} + +public struct WalletTransactionId: Codable, Hashable { + public var lt: Int64 + public var transactionHash: Data +} + +private extension WalletTransactionId { + init(tonTransactionId: TONTransactionId) { + self.lt = tonTransactionId.lt + self.transactionHash = tonTransactionId.transactionHash + } +} + +public final class WalletTransactionMessage: Codable, Equatable { + public let value: Int64 + public let source: String + public let destination: String + public let textMessage: String + public let bodyHash: Data + + init(value: Int64, source: String, destination: String, textMessage: String, bodyHash: Data) { + self.value = value + self.source = source + self.destination = destination + self.textMessage = textMessage + self.bodyHash = bodyHash + } + + public static func ==(lhs: WalletTransactionMessage, rhs: WalletTransactionMessage) -> Bool { + if lhs.value != rhs.value { + return false + } + if lhs.source != rhs.source { + return false + } + if lhs.destination != rhs.destination { + return false + } + if lhs.textMessage != rhs.textMessage { + return false + } + if lhs.bodyHash != rhs.bodyHash { + return false + } + return true + } +} + +private extension WalletTransactionMessage { + convenience init(tonTransactionMessage: TONTransactionMessage) { + self.init(value: tonTransactionMessage.value, source: tonTransactionMessage.source, destination: tonTransactionMessage.destination, textMessage: tonTransactionMessage.textMessage, bodyHash: tonTransactionMessage.bodyHash) + } +} + +public final class PendingWalletTransaction: Codable, Equatable { + public let timestamp: Int64 + public let validUntilTimestamp: Int64 + public let bodyHash: Data + public let address: String + public let value: Int64 + public let comment: Data + + public init(timestamp: Int64, validUntilTimestamp: Int64, bodyHash: Data, address: String, value: Int64, comment: Data) { + self.timestamp = timestamp + self.validUntilTimestamp = validUntilTimestamp + self.bodyHash = bodyHash + self.address = address + self.value = value + self.comment = comment + } + + public static func ==(lhs: PendingWalletTransaction, rhs: PendingWalletTransaction) -> Bool { + if lhs.timestamp != rhs.timestamp { + return false + } + if lhs.validUntilTimestamp != rhs.validUntilTimestamp { + return false + } + if lhs.bodyHash != rhs.bodyHash { + return false + } + if lhs.value != rhs.value { + return false + } + if lhs.comment != rhs.comment { + return false + } + return true + } +} + +public final class WalletTransaction: Codable, Equatable { + public let data: Data + public let transactionId: WalletTransactionId + public let timestamp: Int64 + public let storageFee: Int64 + public let otherFee: Int64 + public let inMessage: WalletTransactionMessage? + public let outMessages: [WalletTransactionMessage] + + public var transferredValueWithoutFees: Int64 { + var value: Int64 = 0 + if let inMessage = self.inMessage { + value += inMessage.value + } + for message in self.outMessages { + value -= message.value + } + return value + } + + init(data: Data, transactionId: WalletTransactionId, timestamp: Int64, storageFee: Int64, otherFee: Int64, inMessage: WalletTransactionMessage?, outMessages: [WalletTransactionMessage]) { + self.data = data + self.transactionId = transactionId + self.timestamp = timestamp + self.storageFee = storageFee + self.otherFee = otherFee + self.inMessage = inMessage + self.outMessages = outMessages + } + + public static func ==(lhs: WalletTransaction, rhs: WalletTransaction) -> Bool { + if lhs.data != rhs.data { + return false + } + if lhs.transactionId != rhs.transactionId { + return false + } + if lhs.timestamp != rhs.timestamp { + return false + } + if lhs.storageFee != rhs.storageFee { + return false + } + if lhs.otherFee != rhs.otherFee { + return false + } + if lhs.inMessage != rhs.inMessage { + return false + } + if lhs.outMessages != rhs.outMessages { + return false + } + return true + } +} + +private extension WalletTransaction { + convenience init(tonTransaction: TONTransaction) { + self.init(data: tonTransaction.data, transactionId: WalletTransactionId(tonTransactionId: tonTransaction.transactionId), timestamp: tonTransaction.timestamp, storageFee: tonTransaction.storageFee, otherFee: tonTransaction.otherFee, inMessage: tonTransaction.inMessage.flatMap(WalletTransactionMessage.init(tonTransactionMessage:)), outMessages: tonTransaction.outMessages.map(WalletTransactionMessage.init(tonTransactionMessage:))) + } +} + +public enum GetWalletTransactionsError { + case generic + case network +} + +public func getWalletTransactions(address: String, previousId: WalletTransactionId?, tonInstance: TonInstance) -> Signal<[WalletTransaction], GetWalletTransactionsError> { + return getWalletTransactionsOnce(address: address, previousId: previousId, tonInstance: tonInstance) + |> mapToSignal { transactions in + guard let lastTransaction = transactions.last, transactions.count >= 2 else { + return .single(transactions) + } + return getWalletTransactionsOnce(address: address, previousId: lastTransaction.transactionId, tonInstance: tonInstance) + |> map { additionalTransactions in + var result = transactions + var existingIds = Set(result.map { $0.transactionId }) + for transaction in additionalTransactions { + if !existingIds.contains(transaction.transactionId) { + existingIds.insert(transaction.transactionId) + result.append(transaction) + } + } + return result + } + } +} + +private func retryTonRequest(isNetworkError: @escaping (E) -> Bool) -> (Signal) -> Signal { + return { signal in + return signal + |> retry(retryOnError: isNetworkError, delayIncrement: 0.2, maxDelay: 5.0, maxRetries: 3, onQueue: Queue.concurrentDefaultQueue()) + } +} + +private enum WalletLastTransactionIdError { + case generic + case network +} + +private func getWalletTransactionsOnce(address: String, previousId: WalletTransactionId?, tonInstance: TonInstance) -> Signal<[WalletTransaction], GetWalletTransactionsError> { + let previousIdValue: Signal + if let previousId = previousId { + previousIdValue = .single(previousId) + } else { + previousIdValue = tonInstance.walletLastTransactionId(address: address) + |> retryTonRequest(isNetworkError: { error in + if case .network = error { + return true + } else { + return false + } + }) + |> mapError { error -> GetWalletTransactionsError in + if case .network = error { + return .network + } else { + return .generic + } + } + } + return previousIdValue + |> mapToSignal { previousId in + if let previousId = previousId { + return tonInstance.getWalletTransactions(address: address, previousId: previousId) + |> retryTonRequest(isNetworkError: { error in + if case .network = error { + return true + } else { + return false + } + }) + } else { + return .single([]) + } + } +} + +public protocol WalletStorageInterface { + func watchWalletRecords() -> Signal<[WalletStateRecord], NoError> + func getWalletRecords() -> Signal<[WalletStateRecord], NoError> + func updateWalletRecords(_ f: @escaping ([WalletStateRecord]) -> [WalletStateRecord]) -> Signal<[WalletStateRecord], NoError> +} diff --git a/submodules/WalletUI/.BUCK.swp b/submodules/WalletUI/.BUCK.swp deleted file mode 100644 index c6e6a812f9aa19f0da4f99c09e5f1478ed2c5429..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI2&u<$=6vrn>AWB<6^o-o4}>4#KCq5SV@Q*$8e~kXuLaihm3btGqY`6 zA-HfU7sLgG_y;&5E)^#(NPxtNe*keqoVam-1K+hbj_qdah+ENH>8ttS?|b|9>*DkgM6S z4~7Z-PAXO8JE26+@cyb3{p55dwe@Y<>FX#}!us!WrG#rY{93!dHJgvtM1TmKlR)aa zt2ZvUUwvhLEsI$6u9mL6&^~7{*@yrUAOb{y2oM1xKm>>Y5%@n4aLEGu5D)T1{xH|` zabaf6moyLoB0vO)01+SpM1Tko0U|&IhyW2F0*@g99x?X&(~Nz60mb9@|C9g!e|(Oy zAD{=&=g>#cdr%#E8M+27LRX-Fo@MM0=x6AA=mDgmHE03)STTYI~^`+jR+(Ix3`%Z@ppi<^PJiRMaiSDPd2*R>IiKJST2 z_hi$XbDx!n-6X9t1{oS6ku`R8$!RfTnebdylO z8kThSc43w}-cG}V(NO5x7sqZ>8+`l0>9o*YRl=ZIILOCBUrQ?)?PV{eh$f((y>JW1s5i*RdG@Lu#9{8mK@rTX=Y_XgvKMoONWXPgcHMXxOfRSNL?W3u zG?ph0w3bdyi0<)n*)LaYmNDmIO_+uBlI+K6eBAWI~?V};oaeR>3!bJzz`e<2@8p%sSTWf012~#g@dJ=6$$6RE>#j{ zDQi173zvV?&cw|^!otka+=4_%2+q~b#lplM&I^=Y9Y&o-eFj;EQBH}GhE{Pxg=P!_ z4kzmzHxn06hYklMzrH>aHlond%Gk;dU|JEMU72^CVOzG7h|EEX0#f3KngnOz zVE$jsf35$R@*n;Gq1^2M;r*w@_Wu~E?(Jkj!mMm!`9Dt=3kNq6_Ww0l)xy=$-Nnqp zm4xemJH#Cw-2U-hN&e%c>VJ&?FW!In|L3%_i=&yEg&T?9KTruN5@uQZf6!w8rQ-jk zvLps1%-TOpZ7j^(Nd6NlS$kFz?*F3xKfwR#`aj_RMw91%q?rHL?EiycR&zIX`yWUC zM;!^XmbLl6$aAppkTAqlnN$kcn!D0M31YJ%M;CGhh5JH-NXJ#tk{#XXXdLWk+h z07E0wN~~MeL+2-I_cM}SAY-6NZ$q!@;Fgc&(dSpL<&_g;r@UU&;FTrLR1UxA(L{!; z|MBy}e2L=uw$2*Z_2Oms=VMBM>+r)pe3Z~q%S+dXv;AFI>nQOo)t`f|;N9wVYpWox zQ1a<<=GR--=&fv3ztpG1C7b4!-qkg*TBU$%VWKQ|!}WrD_)y)Ll6!a&7P$UtTmG2a z$_D%J*uw)a+k8n~5R^_5NA;{=)MHF6zq=z=&z^eI)wfMc+gj^tEnE0(OvXC9&s_XB z=C29H{i$*MSt`e-x=LdVWe*e4NFWB#Vcz5AH58#zCA?4Td{}J-%=8br^~e3aM9B0s zzVmH2yJ1F4kHa>!rDUmfwZuO_LPq6Q;rp|PO!)xeZpBU$`!(Q<@hI_XNnZM2$X5|u zX%Hr0GR(kTm?0~l;)}6UfZ}Bx2skKa>5Oo-&#BqNG)f>N^0;V zT816OI33_*axxCf^|L@`@|Ud zocgK#i?+kOKf(u{Rz~5iY39d9h$feTj+qUs|6Z03D9@#vV+A`|orZXa^N`Q3_8CG( zP%q1hC^(NomWSlugRWU=fwgemyaY#9r>1Ekq4?nBN%pAn;G4p=rpDn?i?!JJ6ULS4 z%@?jO7=mW&;qETKbaIl8!l`lM{%8>|Pf^3iaI|$jkTx2aS}%@C5^^`&8fBi3zkf}q zijatzm4mELhWy7%YPX!J_|(q@_4Ia{T6&x22npXA=bY$8+^2sbz0a|j9KgZ({tl-i zMmh>{qbQu?mO{xI(^;6?;p68Lb>=^t4#`7Xb|w8Tz)z!#+pSFydh2>BRLSb>$_5!n z4ITO&QThaBa(y$1+6)!@gwCWC9R#pKqKxrj=h|Ych|y+hld~wx`aR@`*w)qt*M+CC zwSzQk=okfn4&T2={B$dXKn@Zb{j&SrZ7)^}i|=tM=%mZ9c|NJDx3kbH^7$3EWhO8D zT{)_-K@)X)nMho{ZmTqn?-8_4IoNFaGRMmW;3XxpwHk_vv7WBQ+r$~SGKw#oHz#pzG0d~s8)8mXFU_*eC$J5U!RObgfl^Fjb!QioP za<=j*tWuoi!QIrR$>iG%<9A zYSJmS;$v|vN?b-4B8m4SsaH`v$hFXqxfPj27xuV{Zx&Fcs}d^AT?TumUcAdr7YE!| z%4)~Pep%Cj%4;~-q9gXE)GpijPRQn%t8xX|^xXusU2aN;)fgIeUMG7tFX1<}h{(70 zzO8}BVW$LKXQu8Aa0WmJu7L`rb!U#mO+juzI+j;e#P5zfU6%TG8g?Pva zv4M(}2-KS4^Oc3x8mOV=DQj(Dfn4>8@FnelBX)aJm*u^igI$|2EI7b+=pXEGLFRjPS# z*)`()=yz$Zj+s0%0$*2+rav{WC)-EVSky;)K_CWv$3LI!X!up^j1tH2u{;QJ9k@B@ zaIiice0eI!!2c>#Oht%BhCn7&7MyBe03G+qW{PA}l$mdtL?(a|JNRjg?b-~(h< zm`%#c+Ym+;WFyQ_=LJaO1;F496p{DM7h`>mu`^mb2)fTbCt))SF(u%1S!C|-=I6wz zLofYw-?58*-AQpe{;iVq^a+&2s`Ue8R#{vwp`#BE7qE|ECG=}wv(b(Y&C69UMLTiFGlnwj2J>^+Jdk{4ZKr3wV9 zT45m+*BSYp(73-DbSCi2#BC&R86t+0i~cgYO*dAtYT96XkdTsm?eBI>DT7SrTXf1= zB%_0+%O~W%j&iXQ%b@V&{xG^^@&1+1CDH!uM(9a8yv%M=j5(#&TRZFNR;ZGX9ir@w z(rt2+9F8kUJ)b8E*-$?kmYcu2njv*7APqC>gM?_qHG<}3ICKk4RMTam3u=HzxJ3ms zK%PPs`?U%)pYPUrDgUe7(Cw?n(B0n%B4I_*@$EM$zVHK-hy8GP|FTXYUgBvOocI+1 zI-(K!Bt$KRybZGQ00Ld59~hRBah7(H=qMB=cn?5R%8Y(KPATofOWfH@oE1U&WxIw( zk}%WZ7s!PeTp0J30E5_XE_c7MOdcm(b-76D*#@~`YEAgP5>2TMngDG#auGpw?C^2t z&TqWzudyV~0N;BE4)79=_#lyjVgv|d?Cgy~5OanZt;<8hM2%DzrBO=S%olm^7ED$%r9LC|gk z!l^AuCn?OB)$Zp-ji@TCV{LLiq1+uW#j`ECDo;u~Tbh*)<qQ#wm` zK%lf`Pf4-C9#w~#Xm6Zz*hKCd{EBlYq^K?5Hw2@<|A6uv1WnTfj=p%T7z^MF5dqC4 zacwAR=*4Eu?`rFl1>#NIv{lD$e*CC%G5?o4Xn1-AWh{&->u1MsOBLo7+tBaSOMIqn zZ#--pA{9oNn`jeP7fhgGz&1o$r~%>gbmCsvt%0_r#~o01b9@?$Bib-kq)JGPu@1OI zB=T~?qhVjwJg!Mi0j$7TA*O5B18K)%rc2GwW8vQ)#BoZ?Zef1XNqEWt2lrdw(vU3^ zieCj1hXk-iE>y1*lZ6gfjmFlKTj*z5)xtLRL4~cobD3}WZ%l6wjD<{gmSvRBu;j)% zXP9~vlRG#+I#U6|oixCe8zA&}y1!J&;QafCXo^~`~-5GqXIaxf=h zlAFg6YD@W`==DL;K?sqlk>tZYpnhtVcvM=YEQoos>}SRB!F0xW(8D#+MCooY;=rn0 z;(SdIcpnKRh#%A{EK(Srepr=44KkXg?G1$)^}`}1vOq2C!a%VYdYGEn5fzb@Wk^L| zprg6+sPo#dB;JuxM+W|vS0BynZD#@|d)0V4!w~B!Zg!36`eBM#^bMbQ-q~!|-X_wt zFaM)TcCJNYD^6$vKjW5MX9mVPAESO-b}qle+)=C68yW0DFKrI~Di<6mR3CzNPf9-#8lk_=;6U?#rFYDbFmRxo9@@BEpRa!2? zzT}Im2h$CC~byx$IirfmajeiEGEn$$*hJv6c=3V><-l%9aLHYBuL~KQTfI$RYrUcG~fvB z7(5}Gzrnyr3W$k+=YW5r=N^pDYmm$%#AzgDdeVc{l9ciMG}mSEukM9IDj8SRn<(L= zg_fOV5%KcN#8)gsxXz_fE7`#lg4+L^%!1>H=$*6ro*0d{Tm<&_DLrh}hojv`JL4k1 zBBTP<@N;i!db9Pwj1XgCr+bh;<^fH$uy3B?7u{RANImk=4;ohxzlp8|Dc`S_Tfw2l zi_I*Drot8?JNqDVJ>%;haKRxBg9Ym@h8TNRHoCKe4-bf2+JjXEl_THW_K|A++OqeJY)-! z>9!&eDWbrPc;onhC$Qv= zp%skPz_G&TMI|9dGeyeu(9_wgE1)UCI{^ztDi^M`dkqsmq%(O}%q>aNWfSxvCey_W zNSOGEBQI9R4;j@EXHxu}t=+(hW1+=#2JtUnFsB_p{;fC5vD;(HYb4|7sFdL51Cih+ zqlBom_X|T8v6J<2@H;8pJ$y|@4;I~}J=T`Us~O{)dXpR0^xhfO3?Y%{*|GDu?4yII zRM?yuVdGTi$Y>8_31omQ?uN?Rcgr~d!&SeK={2FYME~5FW^r~etPOnuSs=A#ZlBl$ zr4T}ekQeT9+;mtI4$OkYJmbg+2|WBhsSsB^7349m2gGR5f~5L&T`RS2zwN^QG0EQa zmyNQ411pwdUX_GRFST^dKTb5g7J*R5#N@d1+4#asCKrDM^nYHSzx!&>R%Wy%HSjgU z#^Hsucn1JtR}EAX}z3|+HepqKix(}c)BT`l10EALo4vgcM9>o}a&J=0gQ z*T&=@?wKtR*uoqiPuXhPi;}H)4bGo`f7N)4Q9l53JH^Y{GNe-WWjfdtfvP&`MX-6G z7DtOA`HkKB=m9SqA1cu;O~75(E=VcHHIGkr_>?}8#@vky13Qj6O1%Tpj+Do5=RA3( zm*LJM{Z|FWD;_y1zpK8&RP=~(!K4s8uzshRM2<9t6CuNFOeduRsyW`_$ncJa1Oi0g z_v$Aq6w;nuCP^Lf#kNU7wSLd#P*@TIW+_4sp*HH2o=7iWNFqK8(}!%8oWAz+srplG zAU!HZpg|KO47xPm&I_rfI%!OEV)7-E44i$Kl%S=&F-4i$MUAe1MX2LWnN zy`28|r^rpwAY(w(ri^FRl)?(h81*7UIy~4ZHPc{tx=R=ZK&#WN!0Z-s-wV~eERZV-Cx=@hZrrfjqi~=M&N;1jdvHrAh zo-*nxU%=nor1`_MB2|(hbprZDoJ|aBfX2o^=pp}?Z;3EW38oD;=BKqSt_i44;yq)yx0?4v^+0}^&3 z@uPcc!p3QUVu9X=##1KXyXVqnAid7!@@ZbnYgibcgB4~%rdst%PEvmAwA-shNP>ir zSFns9n_<@2?MQ{`f^lCR7SNB?Yo&&@0x=>7v4OT|S-t#^!L5O_>KO=oPm$}dGxR)F zf{)HL&gW>a`{1h|5Uh?S1c((?izFf4q0*YHTCi858Q zOXHRvQfNDPIuodgq-cK+I*cB_v($Q{(-thS)VOt@{H>#yQ=h_CF7pv znv2r+Ez-3$@E=!xV|Z`L(t`5+SBEOw8WlKt({OaS540MOT`d^7rE8eD{)?>)c+I4` zgPWcb#g7;TDV@QX{OrC5Ong1`x;nq_q_x}02^vWcTJ=k%CHs@;3w;0*+_F%~pQ!2_ zlj&_WzvO&oBfU;srSE_o*uF2#raCCGP27Xl;eJ^k%Ar+Zh$!GQzW_QvpEmv7iOwVYgsI2SI@CBE);g-_UU$+wH#Gda<+q3*mn!bN~sBjb%l4dJ} z42g*KRA%!aHyDGX-0Z0&9H}gfV~yozi_0<{J-#x$=>}at9d%>jGymJ%_2=*^>FX3a zDQ;L}2djN^Dzr-eLn;u5q|Ve6Vr@lepGUbvzRu~d9<3IXp@-y-LdNb^Tde5xqP3v9 z_kyFl_;W*@wD&@3G9%*)-Q+-g@xO_?c%_#K<^Fh4$w~aObe zgV76Y&#@ldq}%5HTU6%=dhZ>&2M&@Y%x^u?iJ)Q@e@TOEe%6n1Fex(ddoOMSY9G%2 z*s>pzEY4qh5Q^a7kjF4`OFjI1BlI;>dB+Qf}JUE)s2(hm26b>R5t;$=15!`lw$ z)=rA$3_uNs86gs(j{Z8uyK=SyI~bz;Bj*^hSe7nfx*+p)8iz2PVv@pBpuZK>say&^ zB{GMQ(OVA4uhSYlah}NhrABy>`~iPbgiwBZ%x*>tZS^f_kK)%XY$TF|(eJjzfYE$o zqUMp`iJReqNupTwP@P5{og~(NIGoYXb1hvvx|ay9liE*zEsW1|8M=HY!>_HMi*s?L zQUV+&Y}?#zf@ERP}d_Ppy!GsX~HdNdnN z=vTUlqi%oJ+YxyjAwcA=r$S8>Nz9AAJ=U_WQ(H=an7@elz41Zh3&NWFT&W?kDNk;- z62(U<@;X)4#3T+X64DO>FYf^jV>=9{CM{TMC*Au9nz5=^2x<#SGF=NAZWcI)E?YK% z(_*euklzHZ`)6)u`qYT1w<`4#%1*KgBJL4P?*>kj3IeNSFs^@iRj*&jR-6bIYzPw~ z-D1Zw(Ccb)M3J&IE!^%$E!=fBfjdJgB)VI0QDiLs+JQ%8zacB3nS{>GirXVG3Idtm z3aqsMLoU`n&Iq6?#?R#!dRNw`m-126@e+Dj^mbJsJ@FhRs2U-T96(-lwo*8?7C}Xq zH1w)^F>j`Ev^k{atF#r^S-(A}`P0M0boK7B)8V4^C5bzBUKO>gS%AZUOOKU%ls-nI zeeyZ%v3+d}H-;Q;N}~dlqfD$_`2E^iOQ7>q7`m9Eb5%WkA`;^yyM^0)dsaWv>P(0?;tS78WD9->N~kG^o^7Epx?OSa(|3MG^`BtOm}C z5@lDh&{U!%JNuOe*o-cM)n8$T)f{GA{Y%fKk`(m&i!zRmOeV6HBYsAPRAa_NZ)Nvx zhpSGG^?&!F{zpLD0>@60h4!=GOgSBMpk*ux7 zN$Sa8sEp!2g3uYDOpTRg`LdndaYoGQOQHlu6(ozs4*kB^2tNQDR$Az)Cgk(-u5cU%}3NNmWTUOw4x z1etZ3K%jfsNGkMZ9;*-EF@`irw?q6;3Y%k5!mXAu-^m}dn8mjZX>TTDr$6Jk34$C^ z?aDxS$!{PYU6nTgoINZSh^)B@L4nB_Xo9&5>~g?tjpbydRf;#6l>I5g`L|y=H%P^* zz~ONnsH_flrUv@hzrN^d0H!?txo5D;$St-`wJGEdvUGu}UjOEFI+a(Z8yLV~@4muI zLY;B|jGI6V;Nr^7_iE4VLh#U^qtJ{F{;A@u-or>&QAhiOh zb*y47>x~&5>y}U9p0+vAy4Ck*L${&To$jZev)%gF*;B?qXF~FhvZJ*Mfqa#&o1-re zKT?7uQN!>h%g;3o0`k%$+kWnz!ROQ543)SPG!GQ7ZXnL-G!42)hgd` zt8k#ui*P7|)8qx$~~k)N5R#OEp5)or@M6 z?Zpo7ey)nAEto)YB4()xb?&orQ8fr0D9fCG)N!13(R5rI+{ncrmJL!2t|!N3@M5yl zYdFa7zwds^Wd>ngX@xh{02F5w{GZWT3ot}L2M7;BZ@S|xxJz}_FJVfMbAv%~}LwavP|Y3Al+ zw;gZI%8{dEmuQ%MFOxVO3<6deZKF5bOTFgTV$qR(^lF+frYW8oT?vB}>|~+~I%GeS zKHe{NC?hZqIIHDHOsy@(OlTdtRTOrSUpiIshPY1-{)=kK^7fLuuXhWshZ#aV1~^+! zYK<^J6o0KH%eFlE&V>v;FWhg$SC^G)ULcl(q5X_!tiMH_HZ zzoLU%A@9dMk#{5#?cb)v8xgv)vO)9m7b-)~t-9>?y92)TT}uX^vyv7{IarWO+vz11 zQFM*8I%Z~`Je}2*Ogo6eVpcOq(2Tp-sXmCc*q`n{&oi@12_`CRkw5xtOGd=QxLP3% z*W+=Fn1T~&kSBSLKvF-;JO?iB|D95Z_bNNX$Yy8gA-f%l&*1`LOMpxN4w@EX8_+CT zu4V73u-)#N<;?Vk&pYQkRgMR7U4dxer)mk9)Qtpr-Z6Zsj;J#baV0QdGe!3F@IwxX zdon!6i8~Dj*0;Fm;Dh#PBYaQ<`{9)yTqia)2H1*XY?1@;B3$;5q*Q}iOK>uZ3Tlu) zLE%j;bi7!H2Bn?EIrYiawQ?pg#%ARm8m;CYb#4mO5~0|I1{i+$pm5-26X zsO?pJD*UWQ8#rQ}80;VOUDfq=wLkP`wI*i<28e>R#}b3;q0G@1Po z3EPLmY4ufPoU3(VPTbMfuVYe-D+u3Lcn=`b7p+nw1H6IU@)~e4C)$lb1Wv*ej;F(~ zW$0y|uFl|WKfXn&2_;Tn;`^T8>WpsWw}N<>l!z7+4;P{W=p)cI*z@)YwvMog>5nIW z5*t4$@T4EjTofHyrLOf?+Ie3=V;UPf5Kdu0k0YOx}x;wF;*;)d^urW?aucik~uf937eOD$Y)I zu+U>C4Yh-I*cb_UhR;IKoUA~E@L z(go9M{s1Lmu_YuF^;ZD{QkYP(M|!pq>r}=cl~2{Bxrq9`DBJe{;(8Zkjr*tl=Y=EI zi@;RZbseBkiWW)WOn(QEiFKnWWKHF$q}P49A(g52^1wqapIwyW3?*J!?uLE`wV>xD zgms*-#M{+5{RJRmwaqP-b6j#!EvHWJ`Md3YH%DlbsN`}7x!RIWHW`ZflBgW1RfOB+ zfSb|oCrx8pi0O*-Jr;Fb+(NS^7jd8fk)!E@WLbI%n zE|Djf(Z8Z|ERp9y8hh9u46~Ro4-jqt0ywRawQ-+|E|xYwmxq-YmS6FbeftzM@$A(_ zQ%ToK{*c$*vdf1g7T;y~89rfILZ5BhZyj3CXh;)(gOMzv^gwGlmTl8tDrn^7E4!Lq zg!@0=?^_kEI4yGF7%I23UMH%lW^FC>cwd^W!+mgKfBbYkWyvWGGDcy+3jP)79TWM- zD5P9!DgCJUz4J-7y7*0RuDO>Ll4M;9WqVqB)J$Kkt1=8jnVhWzH5_zSEQsa==IT&q zZtetyzb0g(-bd%?Fv{u)i=b7adu9~AN+BoIfk43(RC&j^2a80it3B|P7~SMP0?fGJ z94FDqLOFrlwG|y3<*7ChZ{@!D)7;PaT8uy$ORjCG@$Zb;o2FM< z@7SPhp6Z-!_kipPZUe=m8#*`Er*1yPI?<>H2hz?E2FQw!7#z5xATTR%M)ME5-A53v;9b=wR;-y zm}$*wyybQ zjbvLx8m|1>+P;#aCj>UohT)~!LQj{Z7aGjk4*#W#;DIct{8G9b>C`LP$dDWaGUeo@ z3TF)FGj*y16k-e+|8+*oM%8s^v;PS9UXUnepwycbpcTjujkD)m(viH2)2arZ88+E> z53!c?cEYEllZXd4sIQjwholp`)EVAXJaOIR}A98eU>9kAVm!|p+XJ0fZpUOJq|-{6+|xC#Ynt;*>+XY?&J>`+$de9xIANU~qBicCy zRZh+Qqxj}jeuapR^Kx>JY<(9uP)r59q3?~7AN`7$_BHrWk)ANXGNxVkMk$RDT?A;} znD`G6HMjqgZnOg7VPTbB62sRpB-7JjDOiIrbT#K3X&A%DO(MB?0raT}z;y5g>Mnso z6F7#GU#%<16D@1iJS}%C+=b@z`n#CV3*E9FjCEVH_EKZf6cGD?tt3831V*_DBA=PjXySfOFz1>#Z^+tiN0=vu759Ir}L2!}MjounKLqocfmJ2SN@xVEF$E%F08@#QbT(s%ZGb~$ z#99fMfJ@Sj@x}y+{0{hs>g&sa%V_?5%gJ6zPm(X3O<$inWuw1p07%ktq6_l<0PyD0 z9nBzzq?sYb{ti{aDpWWt#986hi%=yVt^mQ8A>!}Xxm)&Y<$1%&a*}G*oR}7eVmUx$ zwZXvNb`1IfSqQu#aD4Q6<<3F-tPw7|z>KWT zckpf;QZ-LnUn%78&!=Urs0ZBwm(e(9^#nK5mFPb=D{qbuD=E@&%0ELX!5}pxiXzd* zV5#H`&tb8$BXI@j*mDh5e+J*E^=w?hTKnx|?-zt04PXVp#+YIw3IVckF@_&g=xyS= zKsaicCll2VP1(R3zO({it@47d!(>EAj#!{zcBWx>a7sidlpl<75D{@i*-@a%oQ1fs zRMk;;pNns8hoVbzeEtFG6v~_u?;1z9yV8hW@bHhJ&aC^oz1s#Z{nzK8q~xVdD*=m4mmnw`1hrwmj0amIb}|( zzhkeVA-eJ3qomAyMc;#i&R_WjueEdFir-Q{@|IuChZB6W9vyxY2-RyBvUwD+FvhBH zcoDF+p^Z7u`NpX1)AS9_#uwV4pRBBs4C~4@zG|~^h&>SY#$+PJeeDNuEibGy05ay)Whtx*z%>Cd&K>R&D_d;tm9Ao`4ATJ{DzW@IzNLq7 zI}|zdquN)H#a^^y2gq=LK7HN1Yfr`uXQ>@?81m7+wZri1Goo}88A0Mo0s?%O+F^wl zUlx9Mn-$O!HS3p42FRzneXbC1^BqQSw)oZCUZ!<8bT*x*+8TvYS!aUl?U)tJ=$McD zg-~lMVK}_CKl0Tedtd@*x*hOxNeidc#?AN(k+GoI@cq_7q2GeOE#+g$tw7Qs@kx!7 zS8>SOXq0i3u_nEY2u3+~QA$@<(!g~_G zT2)X*RFPw!Bc-XtFgqxoA3N}z| z-<{k_mQ5Yd$V*E`u((Ua2v9G{1VguZ<;=o!5Cs*T+9&6RpDp8{C=aJZ-iZ zeJyyXe|C{1cxbh>5&&n#iRnUuZ)_yl~N{2wOdo+*_va-TJ>x3<<1Z77~c z`L-^K$!Ca7y+|4J;&WBU z)>2m`F^h{ogR>LK;HQ!eEhY+m6RW{vEGKq#0;i)LDEL)ASmPtu(ItJeXqZ9ogOm9f z@pU$pQnS09M{eJ6kv@bA7ykKLy$@5&yL?kBnd@mic?EwrM3W|j(aQLmJR&WKK+tG+ z(Eoi^Q=I0u1r_X94^N^A41rIci*I}y|(k3 zj0(9%v;aY@y{}=o*eJkUpfDE}v-Cm=mneJt4Zc|9rvi=O01=8=jX-(Nn+ayd=^jPa zzmh)9K9;aQ|J%=J4w4}%p(S$T_c2%K?~^c3#e$~1JC7(nO9NwlFsJd4B{MZWbN%18 z*zFHjqsq*|x0?>89n!X2e|LYkS?pnV+HvA(z7H~8gPZ29{(HkkJ3hYTp}iD^-mN^? za`M>WDJg4+&G!5MR z%52-pwLDnub6R%fej91ZioG)KV#^(Uh|E4GfrUX&vF7{GmV^=n--B>_+*QXFw|^NY z8ruxrO=P+Z=5YCt`p8bTz3k8ZOE+Duh^j?|);|T?*a9#sl@1wkXWtz#~UF<(d4hMMt81Gi25u!WmsQ97ly@etoQ?IK! z`^mc+?92<>kUk~Uxe3ziub>JHlxTnxRx&Ef*rH}qAcTWlM9D2}bryX#ER zY@P};3<|@A_?6Up!fx9Lsn4-F-S+wPakBMH)iqOEx2;R}?ZNsBGWZt68PT;rReBds z!v20UJLu6ZM45eJQ1wT+GTokL4L3p26Y@7`IBtJpbH_d6$j-%>ap&6|q)Nz=e?2YB z_uLFnnae`6(!5=edq!nQr) ztw9Jft|ANd2QTzsI&$-$H8-d1H|(x+<06l;mM-XX6FP zXCTT4RO}O^aqKENYLwJF(xEpW3vZ+xc{s7e0ob(r1r>CK#){poT`YFAD@&g;;qpaZ?b+#X$H;R<#@!@m_aU?rYp@M z;4`Zab2DpzwfC}e`m(cb)2p>4gB^-5z*~^F?X&GY(TsTH_$A}}c7-82y^i3$?f7uF zi8&k#?|z?ftGjL7rv`;x2kkQ*K3$LblFT6t@_vun=Fg@j_q9q-xz}mL&sB5tI;jBT zKBO&9S?UV{9bQ(s=YMU5HyBDMEG&oim`tlbZ$v-P0? z7$WnX81HG{yUBdQY96LS3m+vJ_idc$q*#$4VE_Zm?ffO={#H^2^d$%8j0jh!o@?BX z&`ntcsN%8lt_Us6l?ZAa3HW+!h@_S1qged!lN>EVncuP(*qn{LuNfKOoH zXt~382~q6uvAaynMBa7_A(|gyj`ojLnyf9h z@Atmv-Wmqq^1Oz@DUpdV#;u<~@P&E-|F~OQ%3Pn11h$x1Rf1y8w^XawSLmhQPJ~X= z$T^nSyHt5TN9bXus}9T`2nrxt-EBr^4EM^9TGMutL9wm1-2o7NPW!tsmBN z$jPr2#+$ zEsQ1BuSFLhOCSHaOk}#w>e7jxGUBb|L|kQ{QW%%XZt{l9N$>o@l5;zEieQ(mV0^vF zuFAkDip>_1xgx}bo|_WP=7-F+SJ>}!lt3Oj4;1h+l_p{TMCfrsm#o+$Bi}~P0JWSU zAx+aD0eUlu9*pfTuX95>A92;fcU1A+f1V6--rb31n^VlOeagyvw#neq`-3*3dXVgW3T|s^6*gM-g>xNIgLl^;W&@Z# zX(^M69~h@zYN5WTH&Mzcr?)5txQB2UTgZJekh6Pg=Vx$yn;aUlYG28Oic;_}YK>e9 z1I>^k`4mT>JWe?#b6e~{m8^U(x_B-)WalWoihBsx4;QC%LYyTm)QYTnrouc7@1s8G zdzQ%kERa`e;x<6It5OL{omLy6r>~9MM-&RoA6V%WwZiTK4sslusC4a+iUJ-k{&F!S zEAvdK-qLi*^GPwj3+BKgP;Zj2Bry_-DG}|4_RM{`n%9^ z)djz$1NeV73vk-%aT!(80`pi&0_$Kj#q*Tm&xQ~F1f}(8`V(}km?lJrlaUVf&7go? z3vu~a1bxDwbCKCZPv%au^*u?kTmf#TN98g0(CxbT=) zvChY3OU$amj&ys)D6c)(CHF9qM%(P1j*)%lmkh;Tf;dSA!IJf+IvF$*UWysCR>7rW z<>t3Wab?N=@)r^EC4$4Tyw1&Tf+ZN`rNcQqQb(eiR^ojff$g2mzC4-$=+BzKb*0F! zJ3M@ZIi|vlj8affto|MAVo0T+jZp;85W8q434*8EFBEzCF&-((y>mI*~~4q(b$?Hb*$+&}ej;;oyau=OvHYRNrCd>r|E zf?deYosRA$ptC-p*jjpT^k{01W&t8%uto2-z0BZ5$YksS{4ks3eWL&2FR~Lel&AT) z$ma}UEaw=eCAC`@9;K&dLI5=L>}pX3Vu3NKn-pzG7bI8W*n640vl@AsMzf45BuRBp zsBm@Li(WczlbJ0UJRK}`^;tI>*yxa1;gtM-FV#5{8y`F~*yEtN^ouCh15`s{Y`hxf ztcI1ovnx|hZdz0^6|EFB2eJUh8f->-Pr6g$Eb2JR}XNSA)8Fbg_i^-`IZr3LU%I4UZ<0Fro3otj>Z*+=9OC( zy^uRqNjq6QQ>A=3ad9cV+tfZ-Y=!~?p4S)g5>xHNf+-ZMBO{ZG@;iJ#ull9$ct5<) z&g^HjP>AG<=UK+}?SBsbO$d1IOrhyfNX3BWUpqSH0XpAdovbeVEOdaA_DRG|%N5qM zZWV_va?G#BAh(YZmQt^lXTI@zEG1%(qpIw z!SbB()3ZBYtT-!xm{!_>>rjXdaDZUXiGs&BY_>EM6-OC#3H~Kob94u<-d#BiNu!?2 zyC0K3No6?YBO5^*&KZMq^@`%$O`a^d`wL+m`2hI`Yo1~bCL%#_LP7?vep=g)$FAFa zG}pnL))qwutO)L#SHd9EW<||S-ypaYJk{H2w_@Jio%Ht?mAxcApn`RkGAob;n>RKI zu_m=MNBxsQDjt*ZN6%ds%qdzmbyCy)Rffs%?ikafQ3zPmn^s4mB(llEAr{US2JU{_ zZhDbCO5A6P;Cz5Dxxey3AI)sX!5ApcJ*(7tvF8uIaOZRJxSsQng=0R&xv0yQp&)(3 zbwtl3%GjsjRweOONObTqrYnX|?RmY4z6L4~KMrE{4VM28K|sF0w*Kc^^gDU!A;rTq@2<{<9-b<$;&16ETEx10xazdIYEli_&ye2;GN}Svdzj_ONJWbg`(x>lav?Bxbowxwb8x^1 zsnjM09WSiOOx==3<^raOlmx^y{2SYj3&%J)(Vl@Ma3m7%a2Khnv`9y=ye=AAgLzT9 zWpNJ(A)(x>q!?7AnSkjJ=(>GB&S}&i62(t?;N`VC98?*CzzQy?Gw;@{PlyN@sf0KV zh*=aBWjR`q2yt6P-c%R`ER?HBeQhyc$xV~Ov9$21IER-d%e9a^P7X;U;J^lVg@R>5 z^kad5tZ6>RSMWB2yb!AgmlB8>9=1q@X(CNMwu}px#nG77x^WeU)*^MOw7%Z&FaSv6DJ+qB#jbu`R$$?t{brKN3T>rgO=EnfK`Zi zco$;yF?`s>(^^hn(debMYG5bdW&;hXl7sLXhMv3KQF*)Xfsm zaschPa170iIcb=F%p^N*A)T8ksR(XjMN17*9)Fc-x2!?ps#=9rXDf)Iu{61EU{weo@4l3SdNQEam@8&?46HE;onO^Oh}ji<3>w`!HT`4ohcY@ zo>BN?z(7WQ#`>UV(~|0(kq_a_JbGJT|Hp!b^WVSJ!Sgv$n*#3#$W{O=ebWEoN;g$mu zDqB!L=B~)RCYu?xuFcKE8wv&or223BPIP7O1K^kxUqn`-A3KVQO!_pS?~3OG$(1q< zNb~=NCw8{U8!M(!0FG%z5|Yd-u}|R$gw0;#)}OObhTRrN6!BH0Z}S|(VN7VIC?qAd z$W@CSgP#9L93zv@=I{62aLo(lSNE^_LI1Va_piKXO1+PQTxkV7IX#m;H$t2=J(wI^ zHOp6I-l>chZ3nvywLHO>CDI4Y+}#2{E0Hm`HfCAbap9OQZeSu_WO5}xM*ti`+6pu( zCgD;aT1H^vp6UiB8oAauj$@kcS80Jr&Jh$#77keBgG&j7t!|1105GABMl69Z>G!C- zmS&4(WN7E>mI#p+K*L6)0JjE0g=wb!w)>hnPnttj>$X%;hm!I0E7FUOAh zVpds;WTSkHgZP*^d?|bhm0EXM2S78-oqzl56^vH7kj1GR%m+il=I~G7GU~nBb5Xin zU%T(mZz4@1OBiF!)k>6R6JamI<=@=76mn&ul!`NIR-$wfQk*SI$>d0;a<|P_bl-f< z3u~?!Pzfcww*Ok8*?{WD7wkh~V#t_&Od|+*(QvlW)KXom(d#&PGGKuMD$u7Q{jS;d z7~qPMHm$hiFBK&8xm=lWFvp^V;Rwn&IjhY7P&qkh1)+*T8CNiIGJ{rX;M!QU>0ci7 zStV)FTOb)Ps4+l0?x-w@O86z{@XJLBwfm#4CRl7+u-ME%59GP@RJ!#gH}IL@5eZ%ME%`%n9qOh7YI=5TzlD5?_J%m5)iv)z`E=D zR|06D8HM(*SFs$M_etxbdix>(Sv5$DbSK_hRd)tU@$tV^_ z!eJnroiFJ^CsXi2!4;r<#L>{xkV;VPif>q~+=TZfC%O%hQQu-XW~58h&fFg4FmJ%6 zT!jWN2y}0zBDzXqW0@ky54+7qru{%d5x1h1)YH zgkmmo9uhnyUPhT+sgMACZrx)IR$95ZD603vjibI~uPG^D7~<9N231vatmOsqrh2T5 zZXVV^j1t%-GB!l|G2}{@F0ow#S(o)lx$tO)$QZaFT|%&C^=2+?;<@n`zg#FBLx3U= zhPjiSpEvHjydn5}B4O3;|KJ>9WjhX}KXdb_^YE!7t5|m35Q8%1&i#u{^RtnXhcT|^ zKDtd4FN;gM?s8}T%b(tKZNGKb^sNNMfHDKL>Z`%D7dW!+hXX3_pT3*!;d)UUvl?7% z-e+25uMUYh5+^IWEQ11x5--!a+hU7k1<4=Kw;N+Q0rqv|PvBah2fkbKaW&yoXi08W zCG`r(6|bS{0R=`sntDuz333Yc_pkyzh!Hb2QF&?@sn6u}rL>BoUa&q><|``Gk~#ut z9Ot8en#$O>1WLyv)Rg&6-TI6i7h*HTxL|89%RvJjAoY=OZGJKnw;(}EIy}+87{_ug z0%VaLXkK&Da(Fv~S|-SQQ&1CEN5nOuk`}4N8{sQM+Bjb6_meXPLljNPf^MQ=#9C%m zWRNrj%zy7o;G{&w%esSLN9SM(J>w_f7;drr>hfm}vTm#xh#X=Gh!z6@#N;bgQ1avM zbIuVQ`_Z%W(d2tOSp1P3#w2u;Cb6T1AT{Ug+7y~?k(*f;4T$wsX3j> zT&Q6#57k%+eN$M;P4C3}-kp;ypPqu;4Y1101n9h-=pyeL9Z`vSB5L zfIgp*1sTJxibBuo9Nz*DH<>A+e|9em6EGJG1WeawKlqq-Ek^nA6~m*5NcC zbSMKHcuh%XU;}+Y;cVNB?V)LSkvAIEe2pAdo2d4lrV(~f*4%!XkBf2s~OKHjE-rqA#j8fLC|Jb1{ z_V5>T>mK~`!&~B<^BTE`R7G-*Eo4y=WUH}LDt3J2p=`vW_e}}rxnAX8VF+d-cERw^ z-6tDmHafB?$ZF&`!AFoW0?8GK)V1!L&u+MOV8!=i<(LQuqr3gW0RpTBcH+XGbdL~9mPZ+4252hYhGA?<%x0qb%`h3LFn>wyM z5+%~B=W&IMDc7rFpr&ojC=nt=PC1AI%(V{eO%2sEa-8aUcm>aE-V2Uq3coVhEi<$- z_#n>qs#Iggj$g@{{3`qBf~k-VT^Wm!q@!R@D!_$Uq}OBwZv-mCmfIlejnFVW_F3%M z0#bx*rBSyf(XGV|`9q=`$gn5sm4cP2K(x4vneep1WJpf`;MI(0y?|?(I2o(Oa?1$~ zOA4`PteFWo$QAzd7jr-`aWI7wqAn9Nk^Vow4*OE!V z?7t2-jJw8f*Kn3IYOICG?KUS|mReZmKP>>qMHKFBOv#lJp34F?h;<~pUbQ1Lb!*sXt%3!p2~w@i<`%%hSa8PJ7%yUUAX3Ri#I$*+Vv1|R zmD^2^7vq?ON+B?O4<_cuO4E$teL;4|r90E`F;ZAV9@GdnSx^u*TAQ43+n%ByI?3_c z8mv)Ip)NJYF(ze3Nm(3ERIUX4gj&jd(ZF6H#u1fbV9W&3$Z91{1W3I%s@;xwJG>gt zD}}0`uFIJitvZd#z{KEVkS=jB)(RIlYXHsi25a5b!XfDYgZx1m7EAhW|MXY8OG{?h zm8;utPSuZ|AGuOLv}BB5ero@D_{1`V^G00QjzIFkXuL^Hqp@5#^4G5|{|Mt4X(UaE zR;VdbBr>&PD)WS6q)Gh36S!DNFgyk?izXErEAf4mV*iCTSNB8DFXBAVFhr3B!7* zP#rm0wV1t9*kaxe68CmS#nsYlJx4};*Vx-)Lv(&}MDwK5;U6(f;v=Tpcfjdck-_Vp zb&J4QDlCPVx#bHmfn1|uDw}5ory(yZMeUC0otjvN6@G$a#!*qw;px;;?c8Mjn|iJ$ zjx+D*VXdB26?u&-(@>ZWan?N;LYf3aB2)>%I=+I-mBzuc*U-g4MHf^p%ABMbz9F)Uur)NhnhSNkxK>)Y5qE zM_*8ADHD|gWHgxe_rF~U1evMuo4Uh;a z8FQcZjRlC#5e`v~l#ydFRn^f@@ zM;U{_$IjUWIa9%i_cC#>=33UZn4JCZQ38bSOswvmE|cC1f#58 zYJxd!C<(nZ-FaT7BOYQyGDIP@9~??2HcZ$B`vSNmS{kf@Y-YsNN4Ed_iWVG!SwYDX zTuP+K#tT?8&7he*KaHa7Q$L@5LB0%j(vO*piIcypyD$Cy^p75n?bv_tZ*QM+e*RE6 zCr>S33%A(H19s$}{B$}luLe^&zO0RD`)yGqWlFrb>-%0-3Txz0bGNwU$@jsl>-$v$ zP=FY8%iS$Z!!L<4*&t?OYXhoXWA?M+Oj7$|4d**v$=NJv*tX$xj&>-1z08O}L04M;-ZiX8Q z?QwX~M;yk?iOVF)h&adomO9nvYiipJ|Dp1nK+Pr2n9Yt6gwB~p7*dnQPXoyEaB}XV zI)IZ(OPeXT=UTOcY}NAaV527Nr_~0mO_?>(8kE_1RO6iXt&s<}m{velo7D$523i2P z$Q87KeV+7$@TvuVl+J{UY9)ZP#h!kuw&sEaZ0V3aR!29nDx5?}>BPw5jx5a4;58@#Gvev;#C(E3{?zxp6Le7N^3!;BQI<}mZTQ$IC01!zcCQY@-eUu z>m;sX;$UCwy3>D!K>E!dH7-9I?{fBa2)hyxqX2weJ8&&fW{$Ge*Y;g=&(wVmQ}k`0 z0qHQ(ajj0X(uXHL^?t>Kh=}C;O%PX>L6xLFW`ly?7H!ljY~n>eZf)e-YQ+$Oi$vTgiO4ZxV?}$Qz9)2YG zsDcG09jbhScsT067btg-u{*zu5Y;>@?9r6O%%73t@~{PRcLop`#V%RXNu12N`gAlQkweR1k-vA39wFzl?{$CR?3+l5JOkS0@LOY3yyUd6rmaGFertKEUx~5UfZ`* zvRZ0O;T3jSZ}F?fnOGCiOrRO)N1{bTFmuB|#`FYbQXENlv|{7lj|`NN)Pg59=1CSK z1%smyQ^K(V8EyaOHwr-_B;4J`V$re*9D|9;<&~2ygq)A^;a4u}Etfs@zJXXJVxt$( zfaPLWZu#ngruLTwQknR!H@PkB2)|QY(RpyBjqIDLjRb4$kCRq=YX`!R2Oeb&9BvNtmA3f%R}z zbDmCWy_ihKWUM}1vNIT3Bi2fD>9SexO|E?Uw*ALWvf?bngtM!L}_wmmY7MUpWql}Fz|&=&@EK@20o4kkYEm2E-i|$6^4?;uthZkg_XUBA3??;cm!R1!DDYVqG(9;;!pGcuoegDCZr=>RRV9l z$072P{YJltR2Y}_OkaM;sVvumd6csJF`kPq?N;9=zsMBbh?WvC9m*6pT{yDmxT=o; zC3|#eg*+=PH6n%#r=3PbdDv0^>%ppAwHRD0`>|O)zrw)f^=eFPGm5e+pL-9O5`1BT zM3W!m7_mq(d~qZf$E58yk22tn@^$^zf`R|_Qgxrz2bqq?y`On&ZG>1*FEt#C# z&4EXR$JW%wt#r)B)TR%}3mUR)^yY)n`aK~TT>u$@fEyxRz%(T}H~=8HL?+#rq&Cy` zH^Ik%5l0dS5T%mvBOs(XXsy^S=?}*M00iNP3MXWP-p)AX2#T*}FhrchMh92GKg1}a z@k20Es4EKvRTb~D5F~#D;F@^wQd{+UuV$j;SgkY_8dr8on-kW^Pb8 zNS?0k2NMZ?5LKAy);kSupoEg)dg0Qgu`(lUd?|9A(@>pp8tcI+He5+9;;}1JnscQQHo{J}fhWP`E zZ9+cVlQOaBFYjCi92vQi2foEfZdK}6gDC^F!_mxuuGSYtO5A1tt=smi`d42+pay*x zU^i*AfBiN6WXHTpLZw8}+eYuWe`(NpRc6NfnA?Im+oL(P0iLUKw}-R0 zXWrcsjoPF|(8yfMa6k!+G8_?X#Qehk;H7$`e49<=#DY+7K58XvDyt1Jp;iYU5Jp-u=azXWQw(HKcqowF%};m z%K74HKpDUK{!1C*SdVy_q@&_k?g@#QdHHhipWXy*72w_?_mK;yfZ#_2s51NvF z=kb}K7QQ87VtHCu9ij3KVY)_-kQGu9-I$q)9$s%!eM|53lnTZe4=_51@5FOTk95#GHbcw+g>+1=y5q&~&x zFs0+7i}APiDO$TdSomI4vby1&(rCcK=<%tk$7e>*%?^fRcv_jp#Qd|NPK zO={@s=-zh&1W&jb+t>RBSM-i9>v>Fk4D3qa3rxdCfVmTU0jV%Fz+)OFUw2$G)sdb#q>Y5VS57CyKU~Mw%{sntO~oLiMGcLl*?*aM ze&=+9K7<9P{A$xUIb1Z#$DDmRA9E;khPI^k;H&FIgfI@G;n8MB2SzUP9oXXF#t8~+ zY1VE?T7JpDrlX79z)d-ih zG%Mt`IG|Zm#9}q|8L%cIXA$8B2XkPGmuO_i-k70T_O;pvdyl7irwXWNfn0GPGi{yf z!(oxNfG;F(@*JwXPS!F38+JxhYr;2{raMoIep-~4u!(#BP(>s`z$hy^X>gP`q(KJF zI2A_bCvT;{*1bWLtZAV#!LGw_3~vp&Z2)dPGJkD}7B$A(DzBjAO7f#xz|LoG9sP&6 zZtwcqy`Q>eEYdO0;t}zQ_76<^pSRD;RqQv7T8*(X1s}1Rn^v?$wEX}3R->qw!}N;4*@laC;q`Nwk3>Yt6{iISOgspHu{>wY)o3B4H~6%=W*q?nJ1a_FYqOh6bo1wxGw1D$9&f@%26Z9t|sY^)4k@Qn?HmCB~Z zmqVAi#(Df8IwHLKXKYR@?V-z(i9E|kqh5+^GOt}nS`K0!g^VF|4`As}F+Jmcr{1sC z;7Cq-31SN^-F?Dv+W`QPn}yum6E8>fK;v`@&EQ9OKB={UM7Nzqva2{Y2Dd(t4R^#X-!MZlgpe zhNLM6v!U|4-~?dJH{?*1W&|!_y99_X$2qpUmWl(NFhsIhPDRV=(-g#+Gc6WRDA{Gt zrdS(Dq($MD7DJs4A;-<^4>8f=51(7u21os$nB}6Kf+)=C&CY6k`|9#1K&)Cwx~95-8U?o%`{u%(O&s6S-JZT^OmHX_@2=vG}!9o=b zZJFL=T9sUh&lsi$DSyl!=WeBp9U|VNEVoth65AWM_~Z ztOm*kuaCxV&Mc}G5KKGDnNp*P_w_DhaNXQS#~+DuiGIssXfuH)?)6{Q!`K zEP3DZfbD^mqG5cD4=xKia^H%mWPMs-x%@TWcFs#EZvCJZ_O^OoRM!xZ9s~=HR`zzLrcnMe!^y8 zNZJMccG@Oss$~;IqBNf(jc)T6gKG)dWRH``X_mwcQH|h_d`L>uLuw>BawC9?y{`bm z?P45@(afU4Ss0ESiSn;dmGJOae3OZ>!c4o1n>$Y(i20QvV8+UXnJ<+GgpQ8gD2vR3 zZ7BDm1v^-JsbN@kW>^hY*Jwm_MAm3b&-1ry9lFhXGy7AH0QMsM1$j~0FwHEckK%tV zYoynwMz%A~#Ev_w4;hqdrSjmQ&3)<#sZ0ZU+UJ%TcFl_(oFCmkCj*q-KPMEF&5ItI z75#Ry1j)9z_Ya{E;BMiumP+6=NWK|P+w>JYP0kq7`Tyum<>dKl%)w;1G)x1>v}97# zTO3`^vY21*jdU4(=9lxd1WDltS@&=%YfC;K58)Z{nVZJf@B72BUGChU{?sjFF3caT zM_}b6GObDbhhvGX7@zw2%rAD92F$FJ&8&aaI7!2Q?2^vg(CtIUNcV~o458A{%+gj5 zv{d}KUJR_dx?k)Ki;pX;?79KvzZ$#q?xo@Vf~oKUR`)XyOW?~3eEX2`w4TIwZ2(XzlM;0r~$?KQh?}_9YDhaYRRVp#kD(um?MFZO=>a8 zR=y!y!B{-(=()0R{ALk9pb6kYhtJ-rpl}Q-m}O-Eoz(lr%>Xg-SD=wI<0iluhcIjL zGB7QBqf=Kv%V+#k56c6x0ioQE$E3hlfT~$Yl@>LwhI@c$2>^(kBFp-eH4thsbF*fR zJ+vk8VClrvs%l>Q<9}=Ic#$?gcn0>~UwGASJW|e}x&u*hm5>VTdT5Rjuz8vL=SKI= z5AL5A+&4dZfUg$VeqMObjIh&Ky#3LG$q6X($& zN2x7(h?{{+d~9aDOOLfAgdFtaG*0HoWzQTqufurxy%V6+PG~0GIFu$&;@BN;tonnX zWF7l1hkyZG?iUAkU65zK7P$0x9Q&`2TP$Q(mId*ZK^n)ardXNd7=E)~>%JMJ!r+Ld z5{*5S%r;M6y$%kBbP38?9>uk{4BqtnMX7sMhN!=wUJx(}Y@%NFQAbQa2E;uG)~yI1 zS`m=O-1k6Ob6mXez39Px8$r6x!%Q+5o^S4SY)e%>wVdAU}7n?If)!uO9 z{tUVr$j{8}!Hl|S-uCpYZQ*q80sw9exD-r}q+wu)5i)>Fe8Kh_Q8waO=|aLCqnIE& zCuXoORsg|2%CUv7fG<%p1~QB4u1*bHlUcA${{JiDRIUnWlJ3h07zhS8OGui-noiy+ zSmw9D1=j?`01a-Wg)GZc0?AV^R{~975pt!oGAdxq)1b`dN}^wFZDpPv#3madKT*XD zW+{lWT0MKNNeRn>dtZ~n_OOZenAn`>*F|y5r3o%9yq~{fs&!{C-J@q zA7x?c#PnkV!2jD%kQHaEMshUvrJOv_GX;RJ$3-6xvHUk{elu-9w#Y-u{FQ<%mna?9 z_~@_(h*=?{!tw~|Os*FI6zF73On?@{S1fXJWJayvPG4cl#HO=7vdI zgRz^USF0n|k<=;xCW1+^pB>9MW8nOTPlYSuKqsLV)C&;fpm8wmEsdCzV|-huoZB$5 zNt*-0orD{fD+4{73{N|ukC*fdh79mjm~0?L@V4x~dk*e|C9 zw@+($e0~~qlJK}7x_3bgWgy$bbHfMbH9RyYqTuj#A2Q~==;3)8_LP4;F(N`7G!vA` z3D$i3XvzF{RUkV*)6Xm#GYQOZr)2J!oa!{W;kL=aucl@?P5z+Ml+10D(~r(NIDKOPbQnWZv!7-R zGYA!s`b@Q~E_3hn)E!d}-Z3@(%!16rbAtO91_+W8A?J#Q-M^5%APa^DzERM(3qtn# z7LgNrrV|?Oot633IO+Mb#!5+-!m%REmvWtLS0qeB{DiPw^`hX*K*?BElVnUvGh|Oc z*%u;l0TajCe|vgAY5XrJ7>#mFCO>oa2iA<6jb!cGvlhpG^TtZyt+|V^7qNt!iItUH z*nZSMKe8UY%KC=YUecBLZkW|EVpnn+O8(lb`ihJxG;&}$LM0k7{92)5*9|1-yZZY6 z>uxOCbocy&(&U>6`QUP?#e`Q`_~JM?<{&1~(#lAeG0-hDL%{0rrFG^l238n?Iob$z z3~D4oZiS4YK$8wF5h}qJP(_SOl4jOGU?1%YIv)zhX+j<=7;TG%}E`Xbukl- z83x}qKa!LJ zz1i@_2i9V@G?OmH(B#sudo8O=y;Ui=Kr#g-gbB7m^H9f87BzCY)$qi>Jq>&AE43K$ zR)%Ityd;$bvYuL=etL1{*`?v5^U^4hZl96@pbWLrw@(iF2#DQ2<>2j84}e{rrV1q} z+&(RR+msK0HJH!cGg9NLBhbuI<#a+>f@7&v>cthROsA;_t-_hEi=+D%LaxNJz$jrC z7&SL~#5kBE7$_(Gn1Pt>!-o+<=Z7F0&#Tl%`Bjrie?C zoWjw|)}M{*_AXz)TbYQ=n^*O8#lA9EtJ;72n^lfl;8^0i-#myBHF8hs6(_Y&+KTJ@BS=>Ldgi{^p~A#NzzU>dbJS{ne=mrKa%`CpPZ+qI zR0HBmP%PMyP{_iR42}#Xj1D;|I-B>gn$GHvvWq3#U|i+9Bm6oDm;&F{;+dvpLBz_~ zpCZYOmy)}&70PMZHXroezsr&99Gy9WhvYXvx<7TtF+5c)xjJw(0BnpbU>50k4 zN|O#66=OGI1&pF#FNsp@5rqK+rVmJSDrM-sDIir~hM`ECdf)Q@p6B=8%Lp?gGXds~ zkeh`YHkga}PpU*#y7D+h=YoBIy3nczg`JAp5#J4V#2{T7FiW)oQcP;H(3 z^S2!e!O}bOg}S<*{3^lG93LEW7zK_s;t;a=s%94JT_E1wd9mx$iN(4)CL^!K!4R8_ z#o!|NMk=G@nBaWo`Jfq}hi;LQ6;cVWNWD7Xsvp@vJSkJ_*8IC03XR)HmkA2G<+SRZ z;hg_-2jnLqB|G>2{3yX|vpZCsB+c7R0`tp#3S9$uoQx&NRYNB>nWyZWr_0)Cs0Bk} zHD~OCXSOi>5HbdQLBJ4|^ml_`wkv$~Ez|cuu+S&k$|2=wK-4gB9r3LA*fQV2AS{k% zr8hQ;+lW39By-%!&_I;T3BVQsWhy|J?N;ka#}Y|EXnF&y!M zN(s2)=tn6yv&e)nt{7?^1QK+1h$dOxke6}JTO8H_M51llaw28w>JCl-4uj@dUYA!= zIN+0=`3BK)@8wY+&XBj2-ZRTQKxNpAh;kJU{(fRz;kSi-zHVVY%N@GIFTsgpHGk~%I zvx7UBT{ey}K7y}q<7%z}%B+G((oFJmf_KU55{#->4uy;ny)X~os27-4A3bx|m83P? zBb;EYCK~%J!`#OEST!?yP}=IGg0g`bt8D-g^$5#X7!7kl3()NBhc?wxl#-Umn1BV! zKrlEMOw1+6E_r2hyI0pHtf!3nskUis<=*Q9SB0C|RYSrrll(SBNIyintU@u zGgk|EbY(cBB*1%@Mze~fLo<0?weqpaOvbo3Kuna5e$7Dt^Nz%%uzz%o?LwoUk1tfqbOU$ZFpbk)r zs!9p60@&ng?GF*4)6-h!+ zNavzqaWaM$YaEX8fr!dG^F!Wvdw%t;`7yrN?YUKV7U^3|_#k#r1x#}(%1`rMjX*Y< zJLZP>6?wnQuEysF!McyH?xE-`8dKa1Vg|VVcvuW(rM^omM2cuxbESK10LrlX#pRTY zjh%5n6K~*SijPWH(y7!{b1=9_zI4;>@+5(>ExRgppWL2Cb91Yt_jTKb!b77rA zvSDrpfBW7OC0gZ1((K8ya~{))()$*upt&1Y|B_eN!pFL$e9(8sL5Pz$7#96X-x>8y z1F;8|h7YYa9ZEuDdDwqN_|Ou6>;`4{`IE=J7Zgxlbo8d>@G(J_V`7d>@>5v-R3+3n zPZK`xQX8q@+FnmFf^*>*FSep>?GNEK@9t3Ol$Ca_C5nK(F(@lvI+(Iv1A{C97gP;t z>AIPOY^%LzSJXVUG<&-j;`Z7T%d(@knts&ZMx6h5-IILB=FCUF%RoAjTVy zL@+MtpEw@>L%x+{g>Iv$5>HHWGBj>4mbHnQxWk%uBm{_mzRT7v~GgE{1qkX2uf>$b8MjXroqg0V>P*=KV6-Bd(=im2H z`R_24vFVZ}9mA~VL|eRIPM#3U;J?z((}7Dm7nc|8KVj`;Ej zy9@%>`e`DsyKGqE_Vb_GNp(_L3v4mEykA<^dBoORrtZVY8nCqH!4*Ef7T5)?a;z-D zuc9l*=8r|r7%v9F;-$<%t7WGP!3bR_iQ!@xzO&P#KkZt2Ejh0!-68l@RWvFt#PLe3 z%%W>^OX*_pR5jqm&J5fcvmaa-Zlvxo%88)zvc!iN;>|1#rOZ|CB#Spnu7a%k5of%uWBa)L&2^#)HSX7&y zap_q8fo#0Xebm_1(6CD5V20KDas1l~EBeojJvb+(*cfpO7Zq!qu8e?7kOi8>KSzB` z4&UZmS#xIi`>EE%q;_)GeaWnBZHxQOpVa_f8?_)~wZE+I+&G(Xj5_B33@(javL30N zn5blD9Ec&?fB4k3%?@SHPkHb2-4uBRU8$%>IMz+wl$@W{e?4_cc8CC33Di3J;qG9y9~TZpz%*Z+^^0TZL3BJo#EsvL#l9bV)D=L~)-# zAutmswXx2f?fJ4I8kmqAaTS`zw z^h_xc0viT*T$#PoIfGMdrYEd$E2MI)}5VCNisxjl=d)L{N6cCTX!Uq`bOJ6NixD5Gf>D7Oq?oS1UME9 z(`$e+KTs)Q^y=uI`OVy#7v7au(KlB%9jxrhC1%dg3;NGY9A7AZ>U zQ=uZT#sN#LpK}J{o;5Gr$^@B?bfBm+(22dXh zyB-UOIaq7`#BTK;J;5@#(zefhh!sX)3&p+wO*vIbhu(ZVVlP%^{ zB#-LDGF|D&n1I^o7P6XGLgWtTdj)-}-nvhQs_8YZt=|1|%#i~XADUT?KI&UgfrXA` zja<45v6hDiRef8bez zD3ZaEP9&q#a|@c0l681)t~eMv7s0D`s!Vcjrh+qVsKvGjwd$Ym>L9DmM=Y||Zkfmv zrI)|Fg`#A~H#gokKL6pR9`8kC za!xP6gG+t#7!y9MCSr=1lA)w%mK8DW&-r60k(8Kbw=Ga|xDQ+|>o#Z-Bmr-TH+H82K(h+)jT+nU}IAxGL*Vr;LjG3k|6R z2o=N|kcxNa34i$Gb*xDgNLeX^GJ`d-EW<8p%7hh4^VAc#S#? zNDWSvF;lKgP)SfWw}SiBy@9TUDrojac;;7*T5TW}(A%^w|0A{!qy~drd+69P- zYVz$2D)pNY+5?{Xm1uC)D6QZ~qSc~eP2gh|log;wL0O>|pJ}YD_QgNUjsUG+anN@% z3z#tct6iMz*Ke?n#8!~wcg4N3I6bR7T4v4|+kORNN|e12LtP5Hn6HT2-z!T)Bm^BS z9#UXFdtqs_Kv~v;Qb0@vO55}lpIohGZ~|}Netym!3L&m}GIpud3`WR4v6>P^L1N1`-#B^n&U?&+~oW3q*4!ybb zk)&*>k4ZWdptDCZ9Gres5!^om4(0(_>O9KVZ$s# zo1(UaW^c$;Xcm{O%LMOd!_;@Fok}m%$n_c$vuK$>tTv#5T2=*svxSr_3CA+i42#SX zXf^+M>jGz#0cbMSF`$GV1m?58cHKlqOq^sW+keRaY9GO=EIR_ajCfTarRtR&U%qix z9J0#3|9HcpeJMwVB2v=?$4FTyXhE4$``vc7erzY(+!;vj8ySmx zT#%5sh!cHsDl!=`>R9dpia5W7$b=X8z*kgute=oM{-(;NdeO~QduCn?)Djhp8V&Rt zFm-$ghK4gXc#efO|JsYI*ipQ3{VSbB8g$xWiDBR zh0A!;rOY(A*#&-EmbSC`kmyhx3c%Iza3<6FWR!rwjf z3%#d(?=hz+!KhD6?=wwt7YGLKeUGr~(=4WRV|n(rd7`B4)4Q+F+1Gzr&A??|KPKud zmmzkt5zOcxa`pb@!AtAR26sy8GcxvZ442SWR9I@1{&&3nPFdxhG7j+wAM2d?QTwb4 z^7iN^IqG@UnAp&>+VCZA)<`|rT(1}YNPbrBI3#9eQU6bnm4;s6oTwY;Q$8T8hKP3E zouP`AMpNaC3CGMRv!uFZ z6uh_Rq*1c`HD#{QK$8@} ztu=cztc#{5e))!cASfPu z{X}!j0RV_VcfXg(Nrm=zYf<=9Wo`eo>sO`4l>5yF);%%g)vmSWLtNS^uD83odimD z*VyH%GW5tiB`zmjA(b0A_3G^Z8n{I>t3jlvcDV#B+{{>3Z4UOab7&aQ=SKRpeYWIR zuT@-`8nz!FUSFs_M~(r@V?6e^>S1%?7-0W&1m(mtQ-T)N7Txja)yGJvISMn(-~S*+p^C078P>TSG(K($()lCq-JWrW{Ofh zk_@kIa-{#*DV%FaM_sy_CT}zpjftK)u{qo8mf`*1>)}uSgn_R>tYcqsG?TzIhNeoT zotVrNG4rSq(BFi*{L#?x%>L_zVBJ(GbQYO&`-LsNCKj$dv4a+uZ8>miw{#i%(QuxL zi5ZXJ*f;K3)%vNu4#6lpCd@G?R$Yox@MV(I&9x}~`AY{b9aDY9gs{VeuyZyb=3|A? zD8wV-2RAgVxo}J%W|RzO_~s^9M?7Hg8IIX+0D=mF0ppL)6J%YLSqW-&$=HvO>};6U z0jnQrnSQWK<^hoHj+vnxej5UISXDJWjeoL@HFxK?7vXD>@u(UwqoSNZtK9zj|0yyn zpMT(N@+6E#jJXCYiXCJ*_z;D7^E9&Ku?1p2APMt!FvlQ5*5z$MvZh#Gjf-jkp@w@H zWl`o|+SaCLlVp>&o#kIOHvGT0!e71wA|2_BIY5J(F{s}G8duPmJVt|ktXmTz$B27T zvZ##_G@EGC$tVG&f9v+V6H3X>?LQ0P(n?BZ)pj*W>k=S6CjNb&=}gxV6MK5c_aEPG zzy%X?)T>?`1MV>SfB3@gU%yoaf?Y8oXg5A=HzD}_JoPqeEZB07T>XQ}*n1#JbLB3O zx6-!s3#(1|3gK180bG6X3W2FBnHXjJ5S3SD zS9M6=-zjr{x9q)ri$cp{Ra+RNrf;EQTFpqY8uhIqQBX2@S!%}gZqD`VwmQK$<{(Qr7NMEs zEpRG6#vC(lU=G|2PcOV;RM>8e|LZ@8KYdXcl{mmI9gs1(`drtb3~5Z^7%>dBDZ$Ek zO`E3=+Jse`fp1fN;6gI2s9ko;9+a`>1VP!Lv^DGnw$1|Ay>1B*M+E809$hLCKZ8eX0nf?$`83m{{?ry2RNLZMht5**~m z)T~4kx{cHrz0qxdV@{W1pVaA`;qUSWwg13BW#=kN+5p=*Wi_syfh#s%+soS#^vbC~ zHe!eo8|#`;-VQ~HuB`LOs_c<-kUw6e8N|$@{w{andMcA0(71C;tLi?%H1Z_K3W)UhkaroB?! z%w<33Fh(0ht+_fQykbn)esp+QN^seqWrcxG1k8XeIs6K~LdhI_C775_4qIw3g#Ui; zDr?GSzM=vc4%SXp`%*efZx?Pk{_1km?gOoQiGaCQO80%m$~3b&`x|#JHXkfvU*J{T z69cat851|NeQkP;f)-Dg{p`hqSB?{W83*&=W9=u@w4V^(Z(1@L;45(tz!#F1R6m3e zR`$s1Du(%hQTkghQ3VqOQy(Hx|4+5jl%S?9%leP7^dY6dnrmgcb!s`X5z^HT<(O68 zC1VedwLy%h5?^-AJk&XT-*waIOVXe%v6?6i+cIzr83>P3hQykxq%I5mF{^6sR_jkGnwc>uD6=*t`ZcMK@A*SnOv<3DbpRLY7N$M&U$dIl;e}y5AG~|=iWQ3pK~WOb@A!4 z^Pb)Hi`U8_UG2vQ_+W6b%O?0&j<4nltgOpB8kJ94EJ1{l^4~o3+=bFwP@xHYavXrr$0Fbs1bf+HW@+$1HGY zM$8N-LuSeigM%5eNl|JirXiT-W2^BTL3;Xq?@8ZjJsb%xW$B5eG65S__SNerZ`pb1 zxIo#uUFBcvGgSc(ilkI3vBa9NKeiv%*d$#JPH<>JH1ohnM?!W!xtt1hI)C>Sasc%M>R0~qZemVRWx9Ez%tYwZlOmmMEF?q`6%6jD- za=H>$(^7B@1|<}7BRKL&P%xyzYL0o8#A0bxlCl&9i#c5hvW;EsrdVh<6Hq4Fsrqab z-r(XN7Y2-;pj-$_Gy!T(^jm6)N^3lqzzq7$4Lgku+nMJNpaEi+jgA3pmr%`o&8M{- zq%t%Upt-HS;F~C!+uN(1aemupE5CScu8Tk@MFtt`o+_8DH(Qpne>wR0sLP)YF0$oK zIQ&Yfk?sH|EeD(V#cQToX;Kjj<6ug_I_$EUV>Ep`C@Z<}gmvWO>Pmht?hlK*&sW{3ruu@JH=SoP%!{{z;eyL;J76B{IjNR!8QNO$NbaVWBa5WDlGCm#WL0h1-;} zfPnSN7Iuk=F=}J7>#RKc4{Hs<4#SrLSH#4y`Z>=3V;Mq{D&!TZo(s5Mh9{O9b{rR| zMv1gc_1cY#bxaNVEzz_bcus8`s}ERC{&nFPpvw4Jv-(k*pcy0UBOJpJa|rh7HOCw{ zt4)4qwa~0Icxs`ia7FsTju};*)6|7TPE0ZW%#S){AK+r$q7tklRF+u|l;NS78m(la zwX>K+RFeNFv@)y45XsZKo$+PTjOzP-covP|))nsXOJL@&+G+L8Xbe%Dc4F`6#ncp# z=RdHG~{0z(;{tb_~lC?BG+VlR4wI_jdm4GPuy&j zG$zRQ>oO{?M*Rh{_NKG}N@ z1Wi_#2M<;K!wpkZ7)478#MDhG*kk}Kb2e@%j?*njmvhGO_BDjZJbzUxfBN#FE5;~F zAp}!A%(?nL@a2LQTyYxn<{7?IZA^BJ5Fvl zQvzt3uV{ewY2{=5jH+lb6nAHsxhWK_N(YN7XalDi{HiPoNi-%cNV=GA0<)I1Oi(iF zm11j|#9}F8R`B|+SqJZ8tYS;?`SZl1j9jVF+gO<_GVC&fVLJ}8Ar&44( zFwJ_Tcl=}12Q7B|6NC4)I@5x$e4yg5%BuCqIkopY-+Nqpb=y3-$J)Bh6SIyaY%xUT zMZ@;cBMD5&(pR4mz$Ih9llfqmPlzEWBR0C%#>kgdhw8vsS+F@2qNTaw zqh#4%yY8KjDytg>W&00RpZWW#t-6Zf2^Eco@yUc>(Xd~>u~3|NW$fnUTQI0wp0`B)2*wa^R(ybF@abVQL%w{yhyB~h$|q&>GV zhO6H`v#LwF;0PdUfO^&Wl-^=<$#|A?G^t<>V=eo@Jq1-}eaks_F1iD>7GRpm*3%wL z?!2thd@(co3%9tXDlT!M*=xLj04?CgS}3(J~>)QpbdzFs{{*{4P9C?)WlBosq z+>x@PQ8>oy$#0z6%h_&XdIpk2FS1U#X7YbNyopvyN|UfJq@@Acjvo#G=#r5&kSl?h zkuEUG(JiikU=Gc=VyV}_dHz>rdD#1jE^I6^k+E9!$~w^_c`k}WGR$WKnOH3hg17Kj z4~VsN921`u`;vqNmKQ?Cc2;XnQE51Bi{CM8ztUovmCUTh%vZ}~<8`IuV-CkS2i6=O zcFn4|r$Dtl*Z9LIO}jsGW~|wHj8K-pW;dT8eaaGZD<7CMrb;D7 z*}vYk2<&pB4i&C=YA4awU%gS4z%G-MLNJG8JaPpPleceHzn#|*<0S5~}Wjfnd}x=v)4 zg@P6|fOpN@2ZMpjSFZncp6VAL<1MGd>0fb0_X1SZ6jG^elGq>w>bwkqpzA|8VmxLmoE7!Ne#m z+WdUEWD~!6=j8q6$FwBwya5H^-YGpDh*7N6oJJizGyYCv5?w+}s4ep?wzJnm}wKEHG&(KsRVtP)>qlH~CFEF-g2m<_eaRB4g`KXHpsgscR1)jmnQ zOD9bDp~OkiGrIzrdCPP)`zU7xfypaRdiY8JEPIYL6!DSSSo{i*RmHUU5~VDBLn#+l z(h|;(qcUY-z=$4D&NVF(l{ZmoRm&E_#{|E{QJIyWf}`I|4|OSrKOQ9e7@(PZCWbaf z#LN`}E`2i;n!QjX-%QEau+1~&3|bU@!sqXvuKX%=P;3BNNtwSHvnn zLLFB0G>eSR&8+_(y!8i=NgBI5jxd(!x zj!S}Mz)?4xF2!Y+Zr%z zgi%tFPC^Q)tO49z;gKrD zPN0;uDKRAN?XAI_J#zT*##_2SW?SuyTOyM!7dLskrv!ewS|$N8L}kWGT6s0gc6qcWP5wYFNEUXDLB`zdMAyXh z)MEbXZ85G{{cdn{wCSUT@G&44DCW+cH0DGgJSWyYL!Q4N%kpD@m~aea8zrhn_+L+@ zM0Q#98mkVlD3eebGLw-1m-^(1Pyt-nTzK^wL#>t~;;iTPZ>U-6r-L=2u~n~0db?aT z08lZ0pp0F>vh<%Q{rRg0u6$d5exnXCF>)79W{&f_CJ#(s?kP}Pr zu46s1C>lLY5I<1v#wnGu$cT*Qijv`1p(z13%(Wb~|{!km0*;i((t^rx)x zwMj(&7(dA2EpL4bD%DNdLh#DW{3Dr|yU35={4pUIKMs_P+T|=JV7RG1L3@L&1Pv3K zxg(w{(^Kj(M`?PTTskuR<*Qm#a?TUbszi}7N@8Gnna!2OIK(cn)Z}WK zDA}<~t+T7DpB(@3@cUFG5t5=?rXL%JW0r;$j){_mcTk#P+-uA6!Ro^?T{kj`v}8G5 z+GfQS92z7jnE)Z_k0UUao1Y1*q+r1kw^AG)hF9!^BONOoHCbj-02L*pS!o}wmrP>3 zi{;u{K3;QMp~CR!HOVwJCsF}SG7xi%bZra~?V_)(f{uAZmnbJjzQPqKxpP`6`9atf zu6X>X0>={Yl{f*}Zk|e>KgwVLPy(w_aRjRi#}4CLN{IaYzY*b2U#kA*eJelL-8Pa~ z!rz1;fF{Eqp0;Uc`4LdIwe--JZ?HCS_}FhJeXiRC8Y&IMgk%4D=iH0mI7ELp5QIXc z?ARy}6ZF{|-Me~DiAg-J{MeAO+I*}b&`2`9IlypC)3%M3J-aFzO6F>OM}kB0p&560 zBom9@BgRoL zzZg7A?5kIrCjZcO6fag%FZkkh(|$9usv}ftJQ3Ca9CMaeqoB;ZGF2_<2fv%)JS%*l z3~A|fB_LKC$7-J^Ii|_qiwE9RZ(SNp+^)i9@)NKl?l8d~BUmf*5S6?pf4gUMcq)jz zs{8vyf*2oeOial%PHZMdMVGXF-Len$E#z-MxFfd$CUaYnQdnwE)SRE>gR(r5uA19_ zdjXk#a{CN@4V?t$x_*kh>gN_{c=aRm+&ZMX^;!c`E~%bMAXx1aDa|>I`0zWt9bRD; z8D{>Kz*GXbK7JCpX9~&++(5ACm81O&|5Rdqk#e^vHMUa6<-}8@H`Pd9d(dL`!W~wl z)a){?)9p1$n5JQgs(b$U<-N6hdxa~MooJ*##_MH~jSFuol#`E}1eEcZ?U}CV1mvdS*CA?e)4zBqAyqRox|{8f-byIL5dP7Akc} zJ8)H24WSM|Oh#Gep+1wDRj5(Y1V?Yl_ci1P+GEyPQb8Ga2;)*}H<$E&WtAV&KB>SM zlGB>Rsaf1n6b!Q6l>N=#PbyGq!p#6*j)T?4G0uUqhZlI)Pj>y4gfXNR>%%dwV<(`VzY1d8FSRN(BG$Rq=Dd^)$&y3Rt zEH)Y@4kkqjd`*B;H5$iM*<{>nmOo$#b1h6!BE&u}Ek6-7lJEsIQdw}9jw&07VH=&M zY?DbYaER|8NkZ&$x0FCIzDx*AopbE+2hOTss17yC4mnjsEIOxaG35z8ESzSOe57QR zOp6bg)lw2SPgTRdjETi(-6s(x1G`X^x8zAef@xFNTVg~?(?qd)!>gZM5YwM|vFF+n zn*be2^_IGEj2MQkilh0xGwp|?5=NQj{69{{9DGHTjHis1LCm0V4%`@B_@(QngG&h< zGj68w)Li_@V5!TL0=fXQSmFk_DQgj*(!&c*`Rx=IN`hkq!y=2`+4YV0`Qc+7-u8b_ z^w)f(hn9H)rR832U73)RiIXG*t|M*<9CL+N@EKM{fP^n!{Xl`(q{XhfZ_K7ui$+>s z756`KO${Js>n5uyAi9w12?a6t;qv*_?zE5ZPP#)OTb&&2l2dWd3}wlXZ0ua4WQoj7 zDl#V0mB%bHCH5hWbWl#*aCl88_y)4^IM_rbCcng23-|dQ6!TNKBSFmg(HK?+h*4-( zzJe)>DXK-v6RU@nIYlWnvlnm@7n^#^4~OhjltKh(j+3Ud~j9>FoU?9ytNg===aRkQ`*a(Od^B(D*abyM~XH2e4d3t(c*&j-ioIl|z= z9J^Gk%$K^fMIlad@-klFN&qs@tRmoaDCfMm|6=X2WxFnvj8TMI2iY>y`yZoZ&`V>O z?jnH3&js70a~xg9@aI{YV{eXG@*$W5)w!jNg7oR5wCKJ~t1k1do+2^^aDgES4p#d- zaq;AxNNFDIGgYxzye9lHoham>NCSuCW^SaRJ8zap6;)W$_!w^YAueCM9U$60VCp+;#z>N6u| ziG5G8u_b~sHB`n!updK)BuiF&;=SpousN}iOeK3)7?drqp-oBoD;Z5RD*5Dw8@&56a%*)3H8YC-}Q_DH8{I@&j0Z_8Mc` zLZo&oY3)&~9`F2gaDhu-WG>plMbR**n!^9-T2?~I63?FsX3y*&zPj%+aV-WR#zeHz zY-cW(ml^)BFHtfZ_sX*l*?2Kz%(-f?xa$j|+&*2^YN#|Orr1?WL#-ojm=WA?Fq!-$ z;#P=oa&XdbSvY2kkO8Y7ugQ(VaFQ*lq@{d3n_;T~i6Um zpm3RzZ5g&htTMU3NOLf#3Bq|`V)#z7o{}Jg;V{;)R1W{pB_86J=!NKFZuJuj-5L?b z?@M;6C$Z(@80r`m>4shKbAe#&7q~XZC-rJt(!r6EVY4x?kgcq{zIfHl+{=@VC`qL-yF+&Yq8S+KIN+%Rq5!J0&h?D@$XTlJzG zz>-SUE1g{ih-qsH8uOaT|MSZJOWqDIdD~_oA{)nRzy$|j1&B#6!CI2> zF)TaXRhd6yPYpvYiarc`OjHke!kYrVnw^R19@4d=yhDcO1#v&LUfx{w62iDs@VufyrgXKzeh0{$5e7Qe)IpM{h20n(j53z)aF}Q;h z+&_8yBMrpHc&a%%yfXLR68?dB8mr<6iAhvyxS~-qu`&mDm!)`Z--!Lk%i%vixQX5( z1@gtOGQlyy5sa&sB4kAOmu}jd05NxR{Yy)&76217UCDdh2~Jwqtgrm8pv?&XywU!T z#)iK_QNC@<+Q$26My;NNdKp*&VkS8SZU$w7HLe&*^Y59j^&E`zoEH-Gt%XaGA%^h;29!~+w9a>T^C(TOKfPK*VrlJ>QHGbEWMs@?muX(vcaP7Z zA}J=OIu5SWrevpW9IhTpMT58G3WRRoT*xNg}^9i zQR8wHCL1H*qIXgql%tiVxQw+*HVp$P`^B4n>sNe$>nu3f@ZiiL!I?w7Z$4lBg+7Jg z51dLhM~6iu^X2vn#8~B44~9jTmu))ml|D3#+q?^fG&o@!CYsdtF|jG>i49P)wqu23 z=Z_B0OVNp=XO{}BG@M6uObeJLN&sARCCV))nXT55({XyKGA@ z<`@jkRWY7iZR7f*!e!D?GDX_T{QQ!zd-ee`S}bu>S&$SxAjS!9zq#&?j5Q-Avr!xL zj1!C9$8CUVIR7j<>7Bh_=?ly#SyBQtD^`jHHOt{jrHWo~1G%xxb+k}b-<@Bnp|2LT zGD;=_qh%s3-{)8D6>y&C@zY(C>1OZ9`+{@{#5B1=auNeSz7;OGa+JsUB`N;@z7c%) zrSO}>!ZU^j(6BRxhu<3J@g{;wy5 z256F&GRN#u;AZ0!aniVW{dBXEkd`Zb;tKrL51>b><=g%V1a^E(*^(vNIqpQI8|l+5 z>QZ4>+Z~`m9GWT?A?i#OAi^7`SJMO}$YQv32Ga6`&*wQ_9FHW%4O3ZpX$|An{-b_I zO}}p*9D|P$f~E9;;qRm+kCZ8uMrg^U$q0n!kgtGD#^j0FPxNqcOl6DWuum3Nm{Bhv zOT+o22rIhMT^F($xczKY@cmc9vxf@7&U{e>31oVHpt%oh88u8WOf?5@^JbJ()JaP^e)->8O+0bH#| z2LRdyoI}#!W+Qd+{FE5AfJ@)jiZ?gfy2FI1xrz9h0a|eD3ZVGIZi18{i6Vj8&I zRWlDuvjjM_pc6=%x&0EG!`7)xId`{hAZjLy4Bo|vS8ihtW?fl0--55`Tuz=@RNWzy zc5G|VrXXlLM2;8EoaoPSjPYJtexfXy;tfCt#H^NGc2Y6TzOSYxauB+R$XE-nv3VK=oPC=(zrr&EbYMr_h{ z_VfC4>jAOa&Dtl3t+|*hA8xLGOx(<7y)yU_rKWyH>jpxyMboP53UQriP-?>G)BY*R z$+$&~GO0Ob>7BT1MoMOUOhy^~?2lT|y~Xn}^rInIB055VpOgjQcJFKtq{8n)LQ;<8 z99Q2N`--ztf*k4n;58rD3+hE7(%JaV2RjQbIV7Moi8*%qu;BEk_MbwXQA^)|GG+1w zKEy40WH6$K;^SL0H#dx0M?br#yy|;@$UCKrLbG`O)IIIPGh21F#U(v+zJC7_KB>$x*RJq2Byh6L;t2oY>K3f@}XzH8B1GJto?WojfwE&v1598_rmajRhAMfQC4=NY_XmcDuWIk;QO;djq6?v#1w$i^+xVUFD};{|>_y zTXomoC4;ibLd)J-2}cd|{|$T};DV2#F6H@;^Z_o%$1WJ962N&BH%I9r&+;0wXTJf# zT=wj3uj9C&OLpu&N;y{M)1&R-MP0UZ90SvkmI}))kMVOow8Sq!*2P_^+6Z%UFipCW zeotEw&Uc@`Q(XpkOeJVht!S3`m;(G9^3vn>e!b9je-%x-yCB|^eljJ|I! zGRF7i1|)1v+iFrG*;ivSE!rOgxVV4o{#JCKts+*S3@K2mG>LM=)gLMLg$ee{w}KzM z8k{{WCjB@}J{Si`1#oe4`tTSg81(E6QUR_wMTKD~@weYEUg>l6M#QF8jG;E?N%C`g;Z>GJ zSK40A*FRvWSM%+)q}h|mD;v*^mCfE&^W4H}V2UyLS7q$Q6Jsqnqb*2hIf2;%5G;C&H-DR}CA?&@Y@8R4nT;ikN3fC{uj;%# zu=f$AFVq)L)e^~!@Aq!WVQF~;C9D1Ai8zOk%_!5Za|^S@ayI&%(-`qu*)FTfK+J}H zk;r21D^N!6B90PCe&WWI5fmXbVzIXa`0B1FsF|Ql9-W5vYz*+jz-m=4gKv47^! z*l7dSx^#rJp1D{Gud3r)0kG4qr}=1iZA5DF`5mJcD-)}#fpwiDDz#8a5jBo4UjOd- zBWl`=lIIUz8R-fx0>m)?6)+PYb1^eWT5DGY5HV9N09fPrb!ylrKLE-gFi|`{UdpT! zC0fA6c)}lg36!}XY9yK1daVAFa2+T^PV$Xrm4saJm)TF_Z%3b`=u|-Xrn4vzszQ z(vrAEPwVpTo|(7m_<)#0zfOOgV}%0*EE|`smz=(Gk{Hwxx=;F>n+h&S@qng_-U`r| zz!xAUj6zz*)g=P6jw3~4lkNaaw(c|hdzS`@!K&Ef_)BWTTv0>e56LM&pd4UB%rKpl zrC;s|`j*;QGpFM$jb=WZG7rs#cn-Lvh}AYuK~|O7M^=V(jx!sFiDXJ}5#>@4qHf=; z$;d{UVg}Rocl+}&^Y_^7AXO(LRf`>W!&I>s>XI$Y&##jr+VpQ?aTgC@xL%>-lfkf%m_}7cRv1E(wgR)o$mLQq?N=N=GRI?hHF8oBg(M4)sh>#D z6cEsrX0(H~=A5`&ML)tJ88qbXAB#^fa~!?WXHl|Ze;2`mek5@ab7 zhQN$YBsnp}1Y%O1|N8VkrX#|UWQEZ?NwPwzd*vdOHsmUGy0o|(Zbx`(#x(W z2)oP@K`DV*K60@L$ftZb$P$#2oD2H{xojaNf!4ltBol0{1 z-5d<@Om1@Q25(kbOuT5922H?`Tm&M4T7O|3bGGq4`T3>ctlfey*0<5Ct`b9;$9CWs zSHuvHot28$qT2+qX~8GPA={gmUE_T$mFhMtG3w_y@wABYQJPdx zO=Sh8#q7iH$S>#nJ}o&JK0tMEp7-$V;m1_4<4@ z-aY_wDvXFSBG@8cqydSb8Bx{WzO=YbEcy#CZr)i%_a(a3_?SkM2|T4SRaSrperwQX zl%rFZa5ERc0L`Feb%K~Kf_N#_3Y(1y&Q0-uI6mw&+rMgd*kf+^?EAr+n_@%OF)!NU zvL?_33j!`Rn`;V?8UciLf;Ho5xQ5wQH zGNw!ytjtaLaf`eSj+%gJs!Q(FjD1bxvF3EH@Vy{uT$!>xgtxe~7=C_-oC7Twz8pQX z<|zqeYiw_yt|{C=8Qqt67y7qA#-dDYrQ#3{&5j3@Mg2##K{5JF-IP_v`pAAj0xRw+ zifIfN%chGx!3CI>WPFT*qxjW4i9~sK45AS+^8hREnS4IaJ}^gQa^U+KHJnPvHfhHV&Wi5zdI93K& z)hQ~u$O}krSmX@o1I>Pv76ZpR&x&;{j`f@uKEB4Eu_GM2Ie2A_8RiZUP--SK5uOh% z(K%ka4vTD=$tLvZkHOwdI3`^gCynkN4AX?YL{9;hcz=+=4wDS)!m$KNJN6TYV>2wb z&v#L1t<>X@@EG{kBS$?)h)TBH3dflETBlfRK^NmKRPn(+ha9E>W!FqDXDAs610}G(NZ>%|H8fNkuTqe6VU6T=n1>Ps!LfR>oU6ajyjZ z05snI_kEX8B{VMN#=6=diyrT2+-uKC-ybmJqk~=pK=hYCHKK5aW4!fx{_ zA7355TN)Pa^0KyuuYV8>qAPQS&6Qmi4qU-_MtM*Xd>MdjKD>i8*<%#}x{fi4_ zlp$t&a5L}Nouo@z_R7Zg|Jxgj&U>R8_x=L0GPPcco7Ka|P?XM3(1OC9> z0!le!6f3hWv2WQ|*vpYe%b{d|7-S4UR(w~(Iz%#~C~xM$`--Y>)uxXcMg5PTKgI_p zq$SdoMs*Hp*!=Rr3h;~PfD))P4r#X})0OU);9W2=bS1aP73R}EwKyEQD(p8u{B@S! zCbb$6J8!(#CN2ElXti>mF)W5KXILeiZ3Y08pQ?4FmhxeY5v!L`uBUs||e=(>CxBrx$2wQ;E+Ax`KrqqW>+Lv!H zZaXTb(1j)ZQI7TDnEW&wWk$)86FrWu0o>Y*2`-yj0~zZwTL&_;^BiC;1ld4?%q;=Z ziDDe7&YZ2`YwP_%=90O@EMk+x+5Uo#<~wALIg5;YFdX9wcsrDx2#+9U~{>)XWQ~;iHO;~L?cva`E;`K4WhsQ4I;$ZCnXBytq4`Gyb z$=Huq2B0x+5!eA_cs!0r-@<5GBcCkR$LyfIO44g4Cjkcy>WQQ!+c%O7$G})ui=@#T zG#k1+9I-LT-WWcz(ECMBcpe;Vg3n`{34Ytunjehy&mIbJ8KE+-{@9dZ8W;Qz-c zWkSzDGajKjm}Uh#LZ-^&|IFJH=6vYAvOXMag-bw8)>-rU{0>o_q7*AzqHYBTt?sTS ze;C8C0(MZBT035sKh^}FpSKX|03HF!*}F7S8^G^6kvy10Wv49m4Mi0_PC$SoBhG_ykBPf7p4d2r3$_-1jN$3b2D`QotHv4n?lfJ z*)ZC=Ie}aqO~YzmF+~}Qi4FJZ5I^%z6@S~O2n3UY<59T5&}RuV~PLf#xS=mC?JbvXvRP-Mz9WFTLbNp*)CY~ zKov4(&OnPN&^-EvMAZm#EU)Ip;9jImd81xzwSx!`j~l7uPVAcoFRoL`5>W}@;FZ;B zb2aTEsP4wk@~Z&Hu$>(ZYgy>@7v8NvjOKThGt_B?2BeG#lrf$4j(2g%7!Fn?qu#2S zO(SVw7r$HCVtKxH@8%x5z0fE7ic*W<>x6JHH3y+pG2a~7<4f7{bHn}%Y;lPtC9uDE zmX{fv($=ll57NtmLG!(rR);J)C(1Z&ODy|?@X-a~ud-oZ{skadT5x_w0Cr)BotMf< zC~yCTPr$3%*yYaUo>`~QcxrciGm*ycKEIpVrGqc2OFA)W8&5c9@r>EgI0gVJl0g&Gc(E^m z*z6h}@&93HK$$R2+$`u?9Nw`=dvEi01bLkMIJpYpHxK)L(z{wC-7(DJ1YYPKQ918(8M$m#AuKM%MAm`P(E7 z*eM7}JLkwX9)yHHWX1JcxP)xf{qs{ZEfySO_BGrLo`zB8@CxK{#LR)1(CqMF|3(SV zDz${a3m)3UvwW>XN`RPyvg7_3Ia+ewgj%w>Ece9_Fclx?1q0?O*UHPxoud&_feIWj z=+>*N!<-G_+>)^H!&uJdVEp^?!7k2$fCX(bd=RXyfXj!EotNf0Z~s5vh}w&eMygM| zA~#I4#Q-rT_Jsd%&nj8yHfS0slXfGo74-*Yee3qT-4#{Mg=2i*A(JURkRLO3$w(h1 z*@Ujv$CQ3buXoOQwL<;lF5YhwFyLm$Mi-8i_N?DM<0&-hFS3MM4$9D&9ffH=@CAr* zba77=2fv*k4tp=0zB8Q0{<2cx7-+U&ud=4;ABNAb6=X5%3@8)tG7uAFE%VWRTv6cG z1_x0IrC8vyXNPN!#}ULp%T;1!Bi0MYP?R(ZDN$A{Io32L=H3O2D|fLg$lKvjxs&Ef zPm0}bjRK;-@Ws$DS%NBGYE>LZ=bY-hi>mI*l_xJM<;sf%F{#4FTW4nSSIHBzesG+z z+Y4hj{0_KI9GbD~mW{WtEI^F!r4wh=EAgcqg`;W@k-RMq`_Jfz zSn5sQ8m4XZ-(DBqGt>Xy9N3p2t95#SoNPVbYn$qk5Cg{?i2e6S8#k??)AgG9^`RM_ znBp13l^NsltAE%kvDQ5mhu;*X8j)J56^P1U#y{RLW%uZTxnip zrXDrC5gPe-Hx{)XQR&E)xn2S;;L8;;8^$r7Ra?{O;MbEPR)$5!Aq1Q4a{{=Do6V8% zMXo7EWHZJyC z&e)B({9GNMho;1uiNWIpWm2qGh5*W#07k}Mw)}BAX4}x$S-T1Ihu2Nf5FUaSR4V`4 z_?W{ke0~9%K^ZpMb<=FKWD#S^Br1hqr12XMVh+1_J16cDR2)z&BBa`%sXPa0C*n~Y z%uQrf`?;H^p-oJZkcM)^?;o4*y}mlcx1Vnl=L)w5FtLn{!MG2CduG-ABr|9`K@t)W zyD-&1FRcbE?7XzFjbmczK63K=qcwE;^r1CO&TpEoG<#nGvu`}PU#;2J08aA}L4Eu& zO%>~&3O)c7BMOgm^HIZi)xfjo^v|PGY4Ltr7-xM_3YA$O(?8xd57S-)V@CjnKzYB? zf~4Rpl*}PmLpY|Wzg#khW|!w$)W0}DTFUkZxU7^Z1XDp%IgLnf&Ix-LtC1Wm$B}dE3j>kn;CO!=) zgB*_B?9JMVGavD><3q{lcq;K8npLSlf`;wODf(-}F)EmySwxb4fSz~vOQ3v7nFD_e zmrPz6t(P|N5D0ROMNV}d^P^4R&kvlgq^Ad8iLnD07C<`^6d1?RFBy(SJ$f3E>xImu5Q zJQzFUj;W|ikXHSk-86(29Q%A%Xe5I&vcKMc1yF`pcAgvHA2-VC!!fP{dbng(>(q2v zbZGm+5INbk*f*n$N1qY^vH#Aq;s_?CDG@5YSsde8BK_&x!@QE3+!E0<(hfwn=Isg= z?hY644hqZs5u3s%G-pE`3Ep-8@}Qpq8dg8R^^m%sG@JUkfS5keh@bin?AtxOvbxAB zmB)*Z>2peBZ@y1j>;TwB1YmUYB%a4A+Ypvk4Byw8mk}y{z>?@%CVW{bw`RJ?*&w?AfEOAN}?gL$D%%qE)wMs+AwKDOJ;z&IGX z((61^(ozh~3ISZ{FiVK1>lV_udr3HgLcq>&dPy*OXOO=u2B0n26)f5#OoODoyVHMZ zy+3$m3|*-%0PAnE(tvuM+_uf*0%bs@6O|7wRat>AN4YkoXfVy>iS$~G@!Q<%QV%lsht)6%fZG>J#z z6RoZOctKjMwb@^2NzSQJV)Ao1CMJI@jRK_`gy^u#1CE@{)mSK_2lGpJEOfjJC=;Ji z#3DoMaUnbuDEk$CbfCInRB4uHM-^@2_5d;6vjbj2ZsL%cr*=gYzw^BpKLWK9&KLr- zK0fBa&B&NK0_^dvxL<_(i3v3`c=NR-{u9+Ee(LFx!Zl|N5;yPghkr|W@Bb-2(#Au z=^qeh_1jI838pkfnty(J$hiqdrCVj=r@LfDh{ohx0y9;x_TAU5ya;v?_p(kRh?#5g zZWNC3-qY?|rLG@JeoSE%f@$pVCpIjjMe^ecKBM= z(yFVL$H+n{w;oXqC<)4#=QGmQD%n&YuDIC0sG7}MtdFPtG}G%0*K%<(gyifPUpk-v z=toxq5LKJ25+^*Z&-~!Iwc*qqvd%cBmBjL?7?RW29WL4vQWpTzFy1F_4u`D^C|s&2 zuv9foY&4L^1v6X&lq-57JfT>;j1!}CfwSFYg&kEIh%Rbtr@hQxkh;aSDOrk4Ln;WB zX$83&BotgvDh_b$;dle*`3%_M*=H98tbH%~Q11N#+u6r|k*93I!1vNO1laiL8^b{h!;7;d z4_zSN(XFE&fimSQjEotq#rX33qiPxjR=k)tCD7vtrXn$ATx#_?oLJ&K0aeaw--gsO4Scn+Gi0|Sf0o^!k>-w)G1 z^xmayr!j^SJtPhLjT6IK-_Kkx-p(qmmX zW-w({MN6mxP+*#iNzh0RZ~=hwy99JXGp!{eBsN>CJsw-=k9jYgu`OIw8nAB^5TgNP z=9XaMrZDpZpCBtv{&F;nn=`gFBS0PFx874;`Mm**M`K$P zA%8U>=qDnT(JjjsVrG5)-o;2oNLO3udQrO^CLlF5 z6Ag0%E9&86ynrgF9!sEY%Iz0z^LkFKKvCLERO|aTCyKvW^&)+CM86Gnl!Nv_efOM7 z*c9bU`p4t(2|<|ysD_~|ZmiWj;sD2D4-p@$OIqS+IjW{X6V^fw-04cxOD;y2Kr`cP z;nNGeQSbQ$AIkVz!nC@Q7>+Jc!*{lNl8~FjaT`Ji*ogQ1TV@77%!=ShnS2zYK~rl^ zjBy?PsGvngOtg)-g;g!T{W7gajn3^m_#(6qnvv5`FZuIctKQ6xP`*NAc?1G!8t|pz z)l3_kbkE4;$A~1&{<4oMYqT(~M|ymdCiyp}li7d{jm60P_XpPkO6bZqr2TQpEb7k{ z$HYDf$CTdy2^k(MXp#?B4;e#s+EZ50)NA-s2StH7=A;z^XsQ?VT@=2y(Vtr8qckzl zIG|^db!NU9^b9~-ut!q#^>sdg1`|``WE{#QKV7^w9@0qAu-Z5#=H?7H8*j@e=*t!1 z3-4)st5cDTC(?g&QJ1#c$Xz_*QMwWwEA=pV)z-8tymh+Pw;?JOFyL=Ci^)84x#b9b z24eBwfKWZBQsWjgwS%C~w1XJ_ntk2K6d5?iTUanh0g+828m!7v+IUA2fOf>;sG0+- zICd#@FM)}ooNv>>tdr=`1s)Z~oJ}FgRsIhEIj6QhXGh2sKJsAbN7z?3Dsp}J;;Qhv z!tjC#%%dhp zGbJryWkk^w+fc1jpL6Xz6#}x&H=Dja$fq2z!&fe%tOguIY|h=S|5NcF$GLmL%x%F- zYrTh7ijo0DQj4?$Sgq4dKTF_Pf}3$7Ck;ww;ako*P^@_VP`F9ktuK=1ao0A!3!AP% zT?xwBoPRXwV+*PvUCJ0}lcU&|;LF)!S(RdF@jv9h_7mGmp!r4oPO=qExvS8eF3ZF= z%)yR$7APBxkcQq z0j zSH+2)j@T%SI>r}|n5pumhNMNEN?NhxO0MjuLqSu%l)5xf0=vxWciGpv5X`kNDH$u; z2J~_AqX~3ex*%EIl+3361b~$VGZe#!D4E5~I?uJF+3YBChLeWU>_JEE$}nS_#OAwY z_PEoBp=H9^%3wm zY@M1z<=ZooXqToeHsFuB#4P{4rW`PCttU6kI9R8QssvKGyn(F#&wTz`FzzZKQ2{q| zKP2{^88&!_**;dpJSJUf6RjU*37TdPYDACvgUs4;UVUx&;@lyXHjg;CW3T00Umkw3 z|Lo#0ZN1IDy9v`ZWedx88+&IcY5R@m2sje%;B8-jrgf{Q1{2vIN@tnGMXU!qk4 zF5ECeV(wguGLt@|xYY=VSow3p5|~nY_8I;uxVL*;7KT)bD|MXc1&k?+3Isn%w}gNF(vk*DS^bW)SquYX&3$Qs4GU>lYk(k8IopsS z8(roGz{}fP6gkT+^Q1R{H8LB}By|T^$J5?m-bZTTr0=PqGR&|6G`oAupj7Zefod*3eVV%*onLC0mIm|(27wrLd>2_f= zxCO=(osxQDtD`j-*7`$E0Nr2V3BMnv6#-?M_LE)363@=r7-i+8$Qrfvl6ocZ1t{4l zds$l#&aDQlj)1Skm-566%~Y&3#CvK%FxuRE?5~Ao-uzN;aj8#=mDb>QalqD#gH2i= zq!I?(5R6?L^qn31NtQ>5!jOv0YH*Hb>=0y?U9aGTq1pKpV&`W#ShG}EJy2%#%HVq` z>Ya=t77RsfJdPO?Q{L=f9#IFS%6S@nlMQ3BdS$9~C0BZ=sTWGcu3rk9K zk#RGq8a!>{wvYrGT~WYPZAz9nM^_>zK`@h(+LkU5!~9C#d88b>I6Ra+i-_VSyuu_rK1^&D$WU?i}iG^k2U_4@lLBMji zX_6u7uMGKMih*I{k6P`~PvrDty6Y&A?wR#K12Zx(KD6lf&ji}#hs+Vsyi zDAUe36s6RqJV5O$!2tZ)y^CmB!tmF?vA1jyd4o{q6s2QsF24bVyJT8jy3*KJeGu2E z>%A9fVnzDc?k(f~28bD%~CE*Dkf^CP^1kCBfp^JdtZOQ$hWkxFRLk15yA`{SZ&2nM{uGEpsQ z4|vj1!OVkw3lr%JIc9S5sbiqiD+Qh1r`l$(&7m@Gi%`a1tP3(>MDdSlR|fDX{S|!O)U_T;_M4s)D2APHN(A z5SQwHHtw5Yg}KrsX;^d8C{4PN6ecId#2N}+h_($k1*&C9HWYDa?AtFggg-dr`HIh9 zH%)@ehDA6-OkZl$7(Iy-?;N!z32~_jx3qEB!GE}63hSI&F|31qC^m)&=oY4#pgw)@ z`iq=Y9PM-BJpcMwne)>eB}@7B8k!YC~E!k?M+jAoi?H=lz(`z2Hwjj(gxE4f91;=?pHUy?6 zD|E%44W3=1IXP68=PP?J>mCE2%nSsKF%**kuJu^=5U?2Ri*sn$phdx@lT~eu6R@a# z`-0TUy1}Y`d^7B_Q9N{ir^ayANLg_4tXHd*7SleXsCV)c!ec`iv#*?(jD4+pv#I;T z!n22Xr(U1u%6TX()g^nTeI8q^H&H8M{8<+dp4|k*NZPj)t}fG>r|$2ZYBS0N-A2p^ zW^fLgo%P%f2T*LWbPGr7#4*TN0=sxYt#eJrZda%la)o1Yz^smG5L6dcYYdKoY!E|GNxADg+u>ye|dYsakp%D$#qS9mRx z|1&^q+;2dJe|gV|hi)sZVtB08G9Ki^D zDT7hWEFBH-q2uzcHKEd9B@y*nP#P{QQ72K+PXC<`{mcz9yswP)isDb$NTM|uvo^f9 zIJ|hGN7uF%d>A?jh-^$NJ{adsz%eu_1PtLRW8XF(QJ`cRk8{He#~NZ{PG)MpD?7n$ zVI^ordLP{5%P;j^4mnW^k4>|;E}n_XiSaWhG5J3 z)9A%i6VzG!_+Pks@^@d{$Ep!08|wtI#6^dA4#ymnxgN~_9VfssCKf>%fF?|9JZkZl z#2ej*SbsXE8QC*sXf3DVvoYkI9bx`<4{kPnho4u5jV8OE9Vj#Da@rLv-mBml2lNc# zId``=d0Q~l^d?Z2$dU=l;tlC3o0JN(o+Cv*pl5I}7EsPFt)T?KIUd?AQ>%#$SU-6fpi-kTF^Na= z`~Vudl8cWm2wz?qPTm}XT4X1P-xFS?3JC#2P7ON@%TTCBfM$kRW1)=KyH67grg{G}N?UQyw9)!;4kjE!Ha6gl0e5|bVAcZ;b~%S1y7C1Q?>*B_>oa-jrhO*@Nt*pLuN|&$UnFf;rSmz?x1{Vgj@j|Hr9uMJYbk6eb1|Iu=(O1BH!N z%48gnD{DGH<2B4W8@wu*uw4laikoOma7>vE8Xo1w$8gMKo$c}I+!U0#z9$WJ3|KEd z(E6BAnz;Qk{Fkff$^Y}gE7BJ-#CFCM`6y9JmUE!&nMKtYVoK@Ld6e~0yR4ed=~}AG z^w-9bkf#6Df7-qg3SGIoEMmh4?=7gLcGET1)&_XeDA&@&zg+n+XG@? zmzWr%CsxLQCiFhumk>;kVqy?5YRXf{fNk>A*Ts;K_+UITrvfvdBv{8O&a^)aV&D~+ z6NM{mmQI@ti9yNC`XyxDPZ7&}RL>1$dUMkT#80QDKT5ZNx zZ!0!)tX>?e&A}WKJA5S?^%MR)8x95*HN_lr2zCSj>f-FM8=+YsZf^A9R5@*=My&Jf znhrKz19uCtsYx1TLNmIY7~wcg?wPXsa5D?jGHqLvg3z9G_xkfc@}O`u2s~oJek?Lb z8V%{Gn?1%;qaS7IJ8xe*!P!k2%i5^OtMCdb1QXNJ#{GmYxYE@oZhZ!2P5BKl+DH*u zR(xt8M&BZ4?`vkYj51m;Xu}f2-xF`ywr8!tgS*V*xBGj3X)l5RZ3glc+@ z>ISO@z)hcNx-vC5cbr;>EM*Zhr^^QN#Bt2HS-m*sm>7ts!D7S1e|_q}DZM5+Q;0I9 z+ID(OhMUO~V@XH132zqdIB^(~44=HeysAyVS@y%KG7BFggK-KtX4np@|8u|PZgl_0 z=vJ-VMFPGOtjt~E(H*o2TryoIe?k}@flCd4>1fyy@9j9pYd=@)PRW1uo-?^olY;cJ z*^1GEa)P^g;Z2MDA!{vcrh=v#og7c&(Z=S>{3oZuiTS0LFiEPZS-PMn-{8?=?-|BPZa={G<|CHn1U9_*TV z0PpdZd>;fe+us_=&FzP$QIy0GdwhQQDtSNbuTp<;nMa7i4WIzc$Wbs5?42#rjA@fK~`-t zW-pVp)N4}w%k!HKWe(_$;AXB#ljY`W3W&0`wo=oG8K#-TG~UbB;2v|e{XFACD{E>~ zfaabVpqbv>tu2!hn|swGz+++nT470mKlT_^(XE2Z#i?aP`eq?2B_Id>; z1YDM&a1xRX7^9O48N|9-2*xA|3d$fD1WYE_2O(1pdra3x4<{RWyl8@4FR?ETWff|1 zt}E~^x3j(_L1XvC{PiCwxbWf74v;L8v!&drWS zGkd*^ect<}n~G%zX=18Pc9py$x9|2*=A7TZ;6wvR@_hcxRl6ZzfS7(2AebT<&MV70 zh1h?Oi7bp`&86mGGd6al!WcAt-`DgZV5DV)lBV-v#I`96wn5)yo9htO4A30 zI?if%K1Ne4HHUjgJc_w7SbI&FvPq>(f?+bvN`mP&VOu#g4d=1;bG8P!a=-B%a{VVH5w9Rc z^r8}4K)u2R5}JyN?fxyOfY)S8mX-t%L5h+_5xHJPFCy6#iW*1-lkJ-hq>=`t5=bW< zkd{UWWOvH>f1md~GdtPrY_efD*(`_8@p$I!nVp?q<~;Mf&-=XZtKv;77T{)Y!fm@E zW%uq%t+Jvj>$Ice{o-2t_$>K{?Ijp5#k>CRl5Mxm2yl*3ro?2o-ZMXV^rghKS0&nm zV2Jkf>B9QD%wPnP&(a5MQ&3JHFe~K-yWGgia3VO^Z|B7?t_Ws+c4=Z^NqG6mH%;CAexmu{%mMgI9vr&{N`^9~EN!k0M$a)=!}Cua)0LCXcxWrA z1PdPykAZTjdL@;RpEtbftN&Dmkwu6W0~)YUa8wI$n&_d$p4Mu6PVkHQ zRG)s9iwKKVDd$4q?qLn|) zseW+oyTg~fKV)fa$V=I_>LD*R%C_tAB~`xW4+SwYw&--}TJ8s;Ab*c-@gp-h2GzYTp{^-PK+q-Yly+^u?;7FUKBxIrjLH z>ftX}4O_BW`FW<9T~ z1AZ+h{UGxtxPXVxtZkg_=`~f8*Tp8UOFXkynCZVf^_J^+iOj#`!yE&iY`ipYaQue& z(`%DYuZc}sUo~UHt~sv-GcnR^QX&!;D}or3CTAvW6xYHvK?qs?N=%0QwK13&>Bz#x ziEfjb;vx1$y|%e2G_YF_RnV=CgGR(Ls8`Ka64sA{W+W)xP~qB__9k=f89DkH_g6^F zFHDk}0?_pq^)WZDowmC&g zUwV0|6*aI*$K3in@P(;Ns@Jf@`95o@Zs|-2CQ4?FeLz16Xd~!UM*32- z_Y<$~3h2Z>Y4r!(*Av!MQ^WE!P{xhsTZ$t!E-wO?xT!$~?rV6FQKMbl*ZwL^$H!8@ zRRxMpTwgtb{kp2j8EDx`=X`t9qT>dmgL2Eit-1<+#pW7bs7ezi(-h~5$(qZ9s= z*Mc!>C9Qf2dg&m1G1sH$mBeW3iPj|Vo*(>Zyt0j7g@d8q16*tx5UFDaE)V(|7snub zW}TI`27K8|1RX~O9R?-USS;n+57Df!KC2iY25O0h6;?Zu<6-;zceJH~5*Z)rMGV!o z81ttWAE`nozx=^T>kk-cG{YBq_k&pbo2LrrL9@IGV3!>eX;vr^(53v}?|2zFqA!_n zDLanorzY=f4`)Ln8=erdY0_Nc|4o#sEKS4UX8Qq64SI^)Wk8vR0@!QO^h^#kosoG% zlj(x)a}$GB24l=@=FK!Dn!OoJc_TKF>Cc-Lwh&Ri^j64)xVa{-=eDh$xHjSZq3QOJ zJy;MoGRQe`eR2XsWqksg#C=^S^~#Pj4I_uVBjbTUXdED&vM$EU0WVGWPSd|x3kzn# z%KYUv2*jBG$eG!%#h-m6#xQQWuokbEhEEA3s0A5A5aS_(_I@)fP8Ra~(N&r~WX&jq zCs3nsB4jw3C`7h~#f-qW16~eF-5nt`iXI45>d+d3MKQT`Gf=Q+JhwIe!ZxJ<7Hpw@ zvwH5kI$7uT{I;M`wmI8_IeOjXJYIKez+SdDj3TzL^Q9Z*g+ru~8C~qy>FPXbtZxdgizggb<3)>Q$oX^|eqWIA{*r+veOGk=*F{GPnZmjsu ze`suY-Y5uI;@mPN8DVAOU^Xl=GnRyvv87oVpw}py!KR_5VHy>b@F+!#1FLJo$xs=~ z3S~S68W!qfG^rjaC_Cb&=LwYLE>Is-YH;XOAGX|wZ=BO}+JOg+=J|@{FTA0kQYG`m zn4@Ly2kK=_F)cBt;!A_J&}H%LVI(5!1~ES$w!ctulQk%_>z%57<;md3QKvL-A95IuX#k^-;m z7UtHQ^=>e4Yl36$>$%%?(6k%X?inxfyzc14oOkiLC9~l`W1ZLg+RU2`fDvAI-n)Wv z9{SdF@7i$;pyrM6D)S9I1>@Ti(-;Vd{Dls-TCH_B7_~CEXI}7~N+FnRUCfANyc%O7 zM+aXSWg#R8rjcrB`@vb}rB8!Z)8JTWcJ){J!ar!xs!6!YHhNzRvrM=+=Fw%H5}6Qe zP{_pGH2aBPFIE}28lpB6#{Ua92Tnu5*Xt53QI!&I^c;!;CF4_vy;1~b9I z2q)P%V6)$&3QY$(L76pp1j@JuOuPDp|lNjaLkrY(iv2Z^yS%)S3|DQ$_N!*2UD;)jA149ku=F=De3HM zqZIBrbV%^`7}LVNh9XttULUGw%tN2U7!-}D>-}Q#Z)*dJ&?mhOH8M!q7PFgLce-x0 zRJ6rO(FUVWO?RianBS~5gmi6<&rgNtyfxS+L|0!HwwQCaSL?gOxEXAaN+Npi+_x~e zY$CKr_6g@yjf_S65MUBKx=R+ov}0mY$4}KXK?~0sN$sTEV$iL6O26f6b@^)mQka{> zR0+=LNdifJ3XXmLzHNk%ZSsncdXRm%2VrH_Gf*^xTXop9LtuQ{he4$Md+xTKRcG~@ zV)RvJ42vuA44bKpmF!ylncL@ykJ0;jq(Kv@%pq#>6WU)*;ja~VhH!^1c7#1~c;ezR zuZvWVGFSe+Us*Z}(6|7#kG~BvM)(Pu!PD5Rc0lAUXLcfYPVDw&LElwui91##Iq0)8 z$wBW`+Bo2$AK$ey_{-Yl1M7ll%eDgj)+g^@7r%d9^1-#i{cD4}R>pg+Ot64=t_=FD z(8Bgz9V%Uj1_!}9kLTpQ z#Vw>e;{JhE{m**m{awd)7lV}ngNfuhpjjp1xuKcD%zwXUxvDRRC*WXU8pI51nT#3r z>1H(`CJY=Fe0Qw3TMV0t0T*D1RID)WJ3vO+Oo$VR&C~=sB25c0so%6(PHV4y13hB_ zs}+emR>u3#^T)8uZo0&s+;Mi(aWZ|LA4OZ8E6`i$6fU5DBiI*&&fKv=Ulx2L@I*kY z@A5>S)j{7CvF}eHYz(M#bi#w9wZ3_3`@pFTi}q972fji|h6&9ORm99Nt>dUFiFtrq4>DH5JxCq2cXg&3`kFxt z>c5erpDxzR~qZM zo<7(l4MTHm)64#ukX7d~*u{Az>m2Z zqphA5$OO0a(g9g~L9l@O>FNaMSzA~c4DHrsSSie6T2k$PFjMbSCWS8*fX#wqN?D#L_7&zXx&Cx>j=|!NxOt&TI>sMN-sc_! z#1vZQm!92s+SYeJh>&WpEAaUAO)`%$F-ms35@K@&=8#*a803^4Rxtj{12z*&8k$Kc z^Qxsf(F_Drjgr`!+hV<)EFxR{C-lJXRUt^g1CbNmV5R*pTwT zHxDy^BM#;ml@Uv>P)uZZUjTXFz<7oBj%>cK^)T~CAHm~0Rtxj*T$Z>4#zi1Wz`k5x z4Qwowt*1Df9xe;6e9nq}ERfWwZu(S|RCgSeislYDj)7g`V?>nZ=n#lmQTcy7E`1&l zqb*Mwxax^3mBfU44T#~&;Cf<7Ft9^EVcM~MR#IvtnOf!n^#)|G+mO32e+=Q$_V=sy zdJ9Jv_zK)MY`#{{9R38Ad=Xf}cbtwH$a2N_j*q1@e<}a<#g#_J!f|pL$H9do5}5qm zgMr{r3Hd>cE5*l%YAuQsrahYs<-0J;8NXq1qBjE0su=edWX!`KM=j9_)6M$6;xbya zuXhD(xj-`zj3u>I4SJb47UGzWZK+o!zCAWHdf8Mp4EbRea!;mopw1Wp16OTs2!O_R z=5QgHq$lo^X~MzOGk zws>ti;JxfGbKB$yxD-*cu=!;g?g_ZjvMjg!6W2{YcUZOPmf@JwvvlNG>%dtVrZV|y zRk&nn0>=1`3ND>d-Py!3$e1LuCiY`w`~4nQ8WW2-4O4(=rJw*B@o(4Xlea61ghE*O z17SdpUKSwuun|e|&D(+Zj_z%(c$%(P*?px<{Y>d35hl)^DGm3UAIPFFa&ga-nr44 zeOZCKmKmX48FzeRCBIp5aP|DK+*_Jh*#4SIfz+R*;-lcShhw34!f>fB_GNlLQzq#u zhI-aN4rjc;pe;M()| zFWRtK#+Cdc36GdD%)#Q{8Z7T&T`Et1;5A0Y3BF{AmFAz8%K)p)Z8um;@v-wqRFeYu z;iQ1RWS7sZ7Knvvzp#tV1+;?~a@JHIbbT&HErv?Qy(!wTTHH+dW`MRYH*9oG zohtx*!F3^HMCh#W%`YdsyUvHCPy7G$bm_OvPEu;px?#H}1{q^~8`KLL2JdoywI_~o z9$T#S#`uMF2EEg$7+I^cE<<_;7Cj4mr=k=MsW#>n$JK~-| z^x@BpWMEuZO_HLjOQl}YAuWT+bOVUlRpbBTp{=ySz=_dmxOIZHC{lfX>e2t{hGD&Z zLU0=r{A8+nl)=H$kR|1x$PQ1J6sm(2b=pi}LsWWbD6~ZNk|#FByH@M&!$QUlD9PH> zm(jk#D-dT%6|=LRD|P(y83#2fX_l~%iIr&D5tIybMM%twVrLAqa1uggv1ENXrk<|x z4n&c1Sy->vlxSvWlE>b$N+Az(7}3F83X>ciat4Zz*1Yvm?2h>1fosp-fbY)Tuz(m# zEq58Mkh+w%>PmE3a`-h*pZ8dGX!0LoHVkv`W0B3u$IL@3GlsBE{bRwsOQ%aw_r})_ zT%_)B^$NHH-Z51>HDLJguPdY>%wx` zyl%H1lj_n%hnr#B+?G4^yv^a@I6Q&PjS#FfO4{v(NCR2$h0N=^#a z5XTCW$KSh&TS*}grQeEoN{J;ArQ7Dg#~=)qQx5XT4(o?!O*N^ z$-hcI_KWG~4YfXsXl2&G2kmROKyr7j4EXYbCY5TM$)AT*UtTty02AsJcE%7NvoO

*5lzub<75PzG+eVrI_&gB4erQx`b(fOl4K%S-9t(Y+SQ zUS@@|Jf_S3A8BT_e>i5VXA!y-$VBJqHk@cbsZ`_SF+=v{h2hraRn0U;1*iQ@%nD7+ z6@JJV2if?T&NCg!jQRlD$^B^Kqv;`RC;xR<>uV;1UEo!ld^5WOVpPyDG{o{~S3SI_ zQSadBmxU`Zf8*9;y3vA?N~ID-ml$G^{jD2@SXpjmhd*tg`Vzrk0i#!x?@q&Npe*Gg zOZAKm`<0O+_)dlDE@5TH#H98g%(&8faacQ9QNcMXTlQO3?8_)w$i$W>?pYDx*nVSp zT#KosNet`7MHGg+(exleS*lO9T38q*GtXF2aQfflC-hT`FqiH{$>e$sgGW8weRCWO z1JA-Z^-7Lur}y90?uNMvZLGZvWI#csDw@Ztjxx9M+rN7@!kwmDfyv7@L&HSLpuWWQ zRx4qyW66>{{KA88s+o_`uyaS$=wmeqX2_vRf%FpRLW!sMGrn`%y-^>aOo3_dA{bqEjY#WwQFxptX zcH3Ps-Ur5=J3P2>sD+sZYi|1&YT3hZUl&^w298Kx@{G0gr_^y4J@!>GqYMELguif|>)c0#`k>09QY5JrCq1PHK{i+J>|L_9Il-eN70N%l8U4!Ct6%Dwz^YDHhWW~1XjEVRbeg~lamW#mWzYV>ss>UfAzPVA!Ciq+h~cu@<1wSj;OZRdCc0 z5aVJCKTR}KPP6*>KX0R542C5Im82;-$dSc@J4g{_PDQ^7>kiZ%9KDWK;GLcElWuy7 zZb+@VD7uH6vDav08Isli?ceWM25Nz3QpVt5X0&kZ5=_-e#tg))4AWAX!;;@95*-4y zgl0yKbZi9afXyYBEH*QtSD!cetMz^NJvVqA|^%*!n~KB2Js@a|8mU>SKo zhgj0?ny$3y;oF~r<)Ui_MdRBJ0=mv$xAlk~6I&G&qx^$o9`Xy&_(#bv!jjS9Pn!rQ z*)9aQtZ)gIr2w-oS^F!uGa?hu^1Q#lp*gQe%%~T@wcKJhOd4i7k%l2W|f4Q z=k|`qw;co!^Or22w+TzXVo5V#h>|JZw?^Xml#^GSIbaL*#u1XjPW(>3S0VvBto+g(=z37y_^(Yr} z#l((}>;RNhOP)4bpqQm7neeLCu~nUOQm_UqGpE@llS2$q$}$ycX0oOxJH~FIWwxzN*IY5~blr)n+s5f!+;#z^L85n13 zzko}1VPPW1BF)Ofub+P2;3}tNsAP^{;ogKYhccm-0hb?yWDGPj!~X>%mA+KUG8I~; z^O#MBV8SaG_Fd-}34Av0BYnHf46b|u9E;P)6bl($pWY!ssUD=Ng0cSaHsM-A zS-xia6fbx^!ja~%0^8rK>ezcK`4^He`p1%Ji48+he=F%`V~)P%xeJHFtjJo@&N>BU zFfn6jPQB8sEZf0Xo=lLw^hzbr%uW76Hk17i@E%NK(xrETB_{G#^FdPiN;?@gp8@Dd z0g#6K$kVM5-!O?W%8eBR|5+B+N~>qXlDfSh)S~_Vg*IK+piHo~A8^#5rx^EBN|aaE z%Q3Ncbc1y;;zuAW3wz^f6~;*+2}d1`O@%qdjY>{;}#o zVf}nWlMXnP@uIx?FBj=HWJBkFbW@NF5|3_V^bdVaRXmP%?RO|${UaRn6$lr^i|bd! z1Y*{uhyC{_CTR4k{?((=*r^k@Hik`&V_tTY8mh}n17aN>$=b&?D<8ulMl&%+=rSn@ z>;6EiqwH7xu^v-RH1=4sM8(L8R>HPCS3Vq#Z)0?lL+-zl*Xrl8GQb z_ALdQ+^slcxpSc$-X1W*u{4hP0XWa1vA>g!J*$G-mPra@*shNY*Jvam*n!|OrRRfM%7w|UuQKqwF>UgS zIVObJ{9aUi)a-DKKj`sk8$+Exl*@`KgH?jY3})@Rj{D-ExA9=W$~>Z!smyf#`pp;u zy0mmQBKcqALoeCE3Mz$WB7w?U_F~isS<98d>@5NR&3{)90XO!L4WGuyPa_=5TmjKA zABtq^A}NxB=d2aKxgE|cOK|}EkFE<3Fi*3I&VmgGUgZ+?rkO}$8~He4~AthV?TV#^f6B(9u!tKH*vWNKNG)v z(ONOD3|`xnOeTY!0kXf;FoH_-f8DUSWWzT8`>%m#g1{kt3}lI{`q(LTxA5La@$ZaN zAW14F+?SuB{8)IUa+^VmDrnZ{z?Fj5|) zSOHJ*|p);eY~&(7Wy}zP;0YS#} zHRS)M%)vaS=lly*sU&Zh{1|jxbkjwKm#h|=sk%I+p?RhG1tVjZJu5@(LDBgEG<8Uu zsjMZ2fzkg;qVfkpERhUmZr5ya4a=}j{&u%Uab=o|I(#V-_dE!ImOqC%M1rjIX}gMx z-bSifxYy)3=6nyA#VHRZ6%T5Tq-a&cDOuRpLfsLsm}rotqGQF9ITlM6Ao7oHlQ;g} z(Jx0Raj2}o`nTRYvfDV%)EFOAcQQLrMFz&^6MnxQC`-%!68ycFY>Il-!Z98aQM#8* z&$8{J(blHypv09l6q*yqZ9VPg3X$FT&IY**aENk(SaG$m&B5=ljr%vV4`aISK!69TOeTJ7XT4K?!HsrX#Jbw`pc1XM#L<) z^0fP3??gLm;A>bMfVu!{86LBGa4f~v!nQvKYxKb;zC&-v77IJFxUXhX+iqdt{==Pq zIlqduf?j1-jLLCJ#d+PI&)r4U(zVY^;g{<||C35q^oBBV+__>M*33V`vD6AUs>kV? zNYIT?cJs@sMREjd+I?uTh|?M|{Xz(FU;JBGI7#sl;i1qhyAGxvV%{>*+rZLT%zPH-^ws7FiE4g*G-nu2Db?xu7FDH6?7Y4y{IywawLl=n{=<# zBt2$JWmM}pDh`yXf>O;WByF)r784)KPR8^j`CV;4Ak~nkP%Q5F-)$t&(6_eFKO*{I z;E`rnDAfgyEn2%Hf`mhQ1-|pY(*b$t!OG~?Xg{KFmE(+{1`@UZQDp6=8HA8X`tUBoNkx}Lue^l43TKKo!NB4; zU=>j+yj04P|F%}gNn%oi)05slQC(7skAYpT7J9f%t$oJ>0%E4Ksr($rzFO{&4$gj( z?uZFV`czOFrvl2{zsebHbpaZ@iyt9{(PLi#s4J`5|7m;cf~Wl3SrvKq*`}MQPp{_8 zeHpdn{>?>O3{I9FbNfP(t5n0-G*Z<%0JwBn z2B7&v6aU4^6k5)nu8d2w5o{KsEXMc(WsR$k83$AA9!E3j z{BzVwQSHd)#FuZE9EP|LA>;oX%>cBR)G{%&;y05$t@<*ha@X9>AJsE)IZ~|Nf#~w0 za?*v>o}g?}D0BFNm3ef@3`(dJf|!#ofJ@k=9y@#KTrHa`GMaVWr`a{nYSaB`H5OC9 zeVcitLDg=5rIMxWXAjJ88MkosE_?;1F5e7@xhL>2W?fk-Q`{^^7D1rwi-ns-$+F-W z=fgB*EvFd{w4rKK2AXkjad~4#l;Ur*t=exK1S5yb#=*4<$s1aaivwV;up&x83?}x4f5_}AtC;CsVf<*s zEEP7^(`QUF8aM`X<6R6*I|5O4@8fs)aw4%pUN z4nVU=v#f2`iC-SLEgOz0c(l?ah?y&6ex;w+u^eSF_TL#}nt$WzV;+qniz#TG6ZTXb z@QOl6!I%_&!4{Au--XVIqOp@`hMg=C41Yc9caa7(6*#EaVMX$?sR_FDoI4tctg1=L zn0~o?Ym4J&3=NC8GvQ0^#Y_!z97{h8ugMU~xPVP*%7KYb_g&@TBn~nA7+WV~8t+>s z>yy`xU$QP5-`3(#%-#?K;WY!?aoCSknnsLwM(M zWsHF%T-JZJ0hhq5&i_QuKr;h6^OFUMahti3%~7^0(Q|c}!Q^%(n+a8uWTd9DD%JFd zx>yBG?%9ajWwN3j>bwqR%=s8WCHfwI_rup%DXN^pr z@(^}?izo+HXA|=?F-;*PIZaCkoH$4v%=;^T=HA!QNu-c;fq+R0YuiO8F+S2f#AP&j z>Dw*y9**9Xt-!^gWF;)DWF8HpM6L|DEDI?#i~n3n$#~~y6+-@eRyFtr zp#ArAGQN_XL=9sPj#a!4*|I>gP7DiA0$<{3{vWK2?UfILzpPO)jmB;m5bnX-8vM_I$yE3xj*tx^1 z;b7in(GQ%<;g7v^y0})FaiMgXeZuBZ0#GR?=6noyE5est`qJ=|hH^pY*)bSeXMAF_ zV>Gh9eqOM2JBmJJtU5b}rOB9M7-+`E<<*kTf?(R4!JpT};aa_3ak{07a^2m_RZe~< zZ0(iA-56+5kkp$Cs)mzR5a-M-4Q_`nps4}Kir^>HtOSXci9iioB-8BurU+LIxq)3IXX+4^9%TD>@I)X|nm8iS4 zbYz&3tOLzVG;^sROmh%}zj44AU-2=YO9F5irh!z@FtIP2?VFAwpzG?W?#>Mu+#|*ndJ_dFP(G2*=V=9@M2$t>$N?wou5Ar~V{HPg4l#N`MWL^DBVjX>+FO7iE_8&FBtK}$9 z>gQa`3}9J64B&!*Srn-Qxnu`vVhG2F-!OxSk{l(0B%#E|h$0ycW|PAB7+?JR86Syz zIC_(|0_6+dB+G+P)`oIRbOwzjWk3loXgUDPk8#GpEzYutF}>Gf9Ux|ejq{+E3;y); zIe$bvoe21PvEoN#TwWt7G6q9)_T|R_nudv(GNv;#W7xxpF$p1aW+!?sPE3Cz*kO+S zFeM2tnL*5usm`4lVV#Z{fC_RN;0!e5Sojvi-grM)xg&Vyoy4?vf=QcWed#fk8p&mmt~oOAYdw0tLP%sZ5X{=_x0n6(gOdgYN8Gx|EJLDUYN-c&5l$lc z@)^#p?9^vk)Z+D{hH!tKxQ>5)H`^dA@YN<(23^<8xN`J|v;Ve(e%Fj9sYf3pK`Cut zB7aE6!nCGUk@KT(meF7b5Y=B?ygRf-A) zIP5J2Dd?#$sB~CMvo)z?;VBSIAeKnj4-L;aioN)f`2lRsQ&e%@9 zytt{?%9sb9hdLjFYW7_n|Ix%`Cx*Kjb|J-Q7H)rN5VLV1B6vpmisKX?L90Zle2{KB zmh2ydj@G&;8Dc)N7@;Lt7e=E4g5&O7&o`{p-TW~Wr?k#5;+vP4LJ#vQKiPfE!u9Wb z)b8Tw{jvhxA6_g~fzN|<2F>yV$`oeeh0ZJg`1MoI8vFtI%8vEx{4!m{4C^G6Ip`_C z#D-y1?Y}03#(uNNhV%>qM!*Q;`o+9N-={RW9Qtzp-ppReTI{bof#pE2uMT@6|C?Zd-Yt>564;1nN;bUAhz83WDiAtgxG z-J&iKbCt}cekhp$t+49f|FBg|Oj1~>Pd3yCl?Wn-3OfnBmGd`5H}yw$1ZCOyGg(Xs#wN8Nl9n?0gKPwwmpo%>N~2_O zFgEBJLYX$Ttxy!nv4YUhj3J{1g8vN*f`?ZH3#|8k8kK_NUUYuD5-8)p5YWs^CZTM5 zbuj8pff9E#*rhDwavN5n=_H0@t75%iWhRRmh=FVxS4UeQHvSrUshKi{V`PHLkMH}E8v9_{cT<@$ zF3zY+#t1nsQs;NWI+w`w({PM$z!+c2``9g{{HJhQ zss&&*7U>en5yBRL|NR{O@WX-AG2VIt5cL0G;-H3vt8h z6kMk&8c4|gmxhK{A&!Ay?A2Mi;UET!bK3?Qz8D>ln3@yk4^=_=h&6Y$b{2Jmm1QKM zXQzW^1FMn3U~9668Mr~iPPA!m?fbpY_%=&Ns`f8!3Z@MEnC^oXMfY;F0;DgG z>M>R{%)ac{6I23aaI-df>Wp#neH#@ax~iWV8|N`&R-UFrrZuO zTC|4+zWT1H{w;vEvL*Zc5%hScLbKK4oG?iU=PgTv3yP{3?xwh}SXx$Uba=ybex4|A zn2&4&2Gu!MQ7W=nry{BYf-erX>Y=^$sg|>XI-{_-(xfm57&S)&6Lhpd*oV0t`O7)D zgU~&!{>bA6YoLb)l3#pw@9EJk9Ib$_z~j@_V~qyN)Z0f|nJAgWhg_vEnaE7XMJO3T zA~7ahE40YM&9d+@$2UhXxiYwHSn?Z162}xg&N9s(VP8!b_tNJF3mJZXB?4w@&>QIh zjAUzQWDR_&KAitz63$Xs#)0yaLChq60ok@#(0_x%M)loN%!r>~q2i$~+SeE4dW@Vh zihyGP8W_&RPoIT!&S=GzDEt!28qUXf3XDrbC%rb)K`hnL;>$yXKa#>=R_PpNmJkx& z1ruZMsKqSZ@G17hqi$bB;z?~k6)7Ow;(aBt&d?C$C{Mg`!j=!>(On#^Kzap!Te3p3 zSXa;tJDCc}Mb8S9-G-92zG7U*$3Bn(MlHD+UoRZ0p4b3Xos^98p{Wee)AdB10io!{ zZbC_cR4u^tx8>D`dYPR9gKH9E77OBL(~w((nU;kc;9WTL<9NU%>EqJZ zC?&D7mdwXA!Bg*1Gz@OG8oO_B+fs>I?iM?*lmO5$?L*<1LQ6R}{FkVLQjNttPINv7 zE-_j+8=7&Awn52L=qHBwKhRoXSX-X%mkG{e?d+ttj#TXIv=e&Pb*{91xy3*;12Iu4n~t;} zp(W3)*-8?0-A5J!k>t8}8dlTjHET7cB1+F)S`bR{5!$|NV}IGvs$f!BE62w#XKbsS z(V?@E`A4}Gzbjd`=La}C6Rm)+z$=^IJEj{YOJZe&lWojSCf$rL#2iUypSx!Tp(W(% zoZ$)L#5#k@@Z|8=h339+G)wzq<(nN&`cgq<{U9bW4d8-+J!e$_GXtu~-J5aw+?Z0I zvtkAF5^J|BmL!a{L}n~ZUk1VA?bW@FfZb)I- zBOLSHzCG5*g|nBc4+?cGN=WD5|N2Txcc$viPkDG(nu*Df578=At3xmMu9K3v$ge#u z#rmlb2{XoNe|fJ>j~R3=a2x}*!o*XmN8;5FFN|*3Xa(wDfyEo%rRr8$OKj3Mf?0Be zrU4>QaI)gGzr5NpRecE}vF(Xwem+Dn>y;sG%{IUIYyV7!p=G@ind&YTSJK1BY60fN zRL5j;nPAYUTJINuE?~^rm?4^kvE(g_JzJ-=9kfK{Mb<(PiHzDwMO!I1LQ7<2;kyf! zvDNWgUQ#mAuuGMXSYaj9Q}85&cF$e;28>C3e1m`;5rZ{E49{?Bmq(`W@)f#K6O z=u>1k=1uBE&&U~(!KAMI3euNb(fOs7jbI|V0!$tvnsLlQJ^p{OGD9;U?rWn}h$MdH z)(aQ>XBh#rlRvZWJ#|K%7G1^#XtNm!7mRr`nNT1p*Q*yX(bs}{f!kkJ=L*xhTW|@d2DF;{|`->#!bIUUz+?7KUwqnk8Zfqh&7 z2F78TZq-$TNK}xEmyFMnmxSb%eC(P@ogR-dx7T?W&?M@mV$6hEWYopboQ82dpy!5v z+LU=8Y;%!?ehflI4;U3x3eD;k|7DI1iJaOkUin=71H#I%nv!H?aN`RyY4lj2Zam(Z zrzMiEIuLBPw@HG-nhwFrzFk2d{;=T~Ahve|OU0hy#pbCHc9nR>Q(>uZXAFx;sHa_+ z$XFJCzMTihbU_V{>EiZ-*epSutenm>y&2Z``_%AK>V+ zXa#%)E_+~}Kn(9Rav6KFMKCm4rkLCR@jO&8^im2~C|tu82ok8uIR#FfFElelbdF#SzgFR)rb%jUh~Ej5Ci z7ldO_vfb|PLtDV#8+L{7&idJcW6QDoGBi9vAh{oXU(;aa2WA*^ziY_HtUIFh)$#hH zkZ9G1W;L|U{1qUWd=~=~pSy2I+k$cC5L1ya2nP9=pg~-T<07}>v1zYH_hz&L4PAjP zJ7Z_|dA3cCIWcg?=2U=ShjpdHkGf>=0Xweeyz_<#vXJhP{ed+p{{)-$@G&nr_g4Sv zk`cc!V~j6oW};cx4Lchdv-2@QncDlrtP4>5_C*F`w)@Mngl99+)-W5iU_HMce70+DAEP0=dC*oL#M~sP?d38^&wHrOlpkWfwEDInIqq!nR ziwECtRWLzhEVoF^ALma#A%GmPe9{27TZg^W&<}8QeY66;0xxcO_n7YECGRs6u#10c1oDM;SAf2twDtN0Tx6$p|wI>*US2egQpQKZ5fs<&JXz$4GW@ zMbNPX2fli=`j$eZy_X}U;mZ!fWB~yta@lErOF3QTy_bKrR?Jun$I^i(z{QV9Wu8E{ zYM|_a588E~25>p`YHbz^srqta-*ZF%YxzIFpK*T+mi^NYi$3`lh77eDfrMSPHuETrel*k0pAT&l%aTwg;cG9x zGIh*|%j)k!nRWglH9#S`RZtoqGld_zmCayA$9_#7p@W&J{S+=;J|}+9Qu!_Zxrv59 z0d0SnS3=4XN_O*-ebkg%(q+n5Iwhmih?`vC?W*WD zj8>pgR^aM~=bPecR3A#FKG<{{Ae%{(|H`&EOh0=_m60pOjP>bbE}dC}GOlzoCQKVf z?RoNBrS6Q4S-_}FWi}iGod_-Ysk+FrfoZeV%8b(SKd%t_p`L+e65Qql-4=WV<4UQ5 zc;u*GxUj;;Q{v&b1{aQC^#WH$uxasQ3hoq>0%DABlWjHC2vH!mw@fA64B*nUOb|;U zUi|3aziCuoPDOP`#B0p~b-s!*wJl!vZlipFqhAuOfUm%}|7WJif7sH8=#nn7{&~~9 zk|VF5MVeB|7;3-yF*=%1<{k|8kTlF@!mhfq075@2V*2jbRGJb_<(!cN=78zPnzrg$Y z#X|F`3dAIB?JInl=^}k`n#iH;(;d-W7JG(`^`5B#u@KD$CO&)LR;E9LWAcevMv~$q zeMQox2M>R4r6xy5|3xd%s4GB&6!m(_DJF}g)DF5G|pl-3QjHN7OVFO0-w3H=-zGRRwF4M(E&%m)I?@Af_ z=^UeE)G>i|Vr9u+y`-4YD-G4BdX_Y2|MS`#Jdb%WfIAxKTg9 z(JzZuAY6gP>oltdD(M@Z=!RWQBHt) z%{-5@l)@u_XE?@S%9d=&0JLvkmbkD)-dC8_e)ky@2BvzHo%S~chIJy&B!zTNuV=QuA8Gqd zcN0gySu611__Z!*h>2O7I|T)hG(Lxl+kDVN=}M0$~D@f2g) z^pF;fW64V<#Lq3WrqiyBrE`wE%U@|7td4_}&QArUY5R&OJ=ItXsrLHN`}r{I?KAgm z5`k9_F(S$eswvglLb|KE-W}Pka^Z%k_$Y#!1F-^EKfFja<0!P!G`yKVb~1ewNnd{a z7t_ue{Jud}AUe}$IjfX#%m%;-|^B|ioXjc7CmH)Hmt^n4~OS%4{XETLsabZKr_ z^(ZruU)-#01G6&Cts$vj=R=^I6I}g5*vs0KF>eRalHH#rpZ$bv61$gpH%ubq=}2U3pZ()IbW>68J1?C044P5(=3j_JlrxsSc_2Q)(Q8C2 zU@Oq6*HjBCmBEw;!vKu}O#48VAAQ@ruM9V4A_e>8lU+cc_;c{Gj{GZ-szOz8g#_5Wc zD<0Q;YG|Zr^ z%S^$b0Bu(As~4?ooUxU1_=96=P1YjyF;cOYOp=FRwMa@<(kzkv{`fBFQ|*FSMmU** zwS7i2o_o@RRfl(GMJ}bN(~N*Fi}tnZ=c2Xj1a6 z3^N684smtvoxByi;HV{cD7FL>!w+>2KNerTm%b}vjDn&Ti9H|&^EB#Z=CKlHBrzSy zj|(;;$Sd{jl;&bu7PGSIA!&=TIINl7-!?NmBc_ro@(#`{E+AOFRS z);VJh$E1v@$rz2rs0X2mN|(~J`%a7Qt7rud)(Sj6V*{wg$I^(IdM%2cw*yiz@JQ&Xm6}6&X|%q!K(g~P_n$a!Rc=szr1FTNx>zje@`__t5oP~?3QB!Ql%rIK0lwzY#E2zTP?=MH%B_>P?TA{u9;}-< zdR?u+y+upp!H{yxaAzwgNj3ICI%D?bxr3|RNCqgmX+IOJY9U+Zk2v=00l#+%8v4V45fFj zE;;JD2@BV5j_##s1rGWOXkZ+s3(Ce-KR${tTxV#W2>7?_XPh%6hSi_w(qT$seo6<+ zJn)}p?uByF&BW!tQ55DYJ*eCR#6syT>v;=B3!bz4-JD}EnL{7PB=q%JZI+VNagUcZ z-_6E|z`;^B{=MN?N;)Giz;^bN%1-VFh#3L1g7HEP2N#ar_YSIlXq-;bb#Ip5CXW`K z<>fEDanL`&(H{`404uO6&l0LlswZ@Svw3N+E8O+k-dMK#&0Z^MC6CV9MVCh{qd&q+1M23r;xt@%9!s) z*FS%J;(#gDp1?Z~tV$E;+@j(Ny8@`?8>2aD+5 zue~KMJ!bUd-LNaOYANhjCP$fH^Mi@;b2ZGN$?}!b`5o5k-dj-VSa<3p>WBz-fn#YXlkl}~F(yx;(|!k4Q11Fz51Dh+ zMog{ha8_vKmIgBRXQ?gWanbidAnM(Fw_=jY9*Y@|rCw40S3JNd_<0lWOI^xDTqF(wg z(_SKjwG_6bc16eD&qOy)v;xg@1%^#~4HcK55?4PRiRJKDuSNA&hoRAN@yi3Zr3WfG zj_rky$$B9QCj?7zvkOKhl)i*q&2C8I()_XD7`WGSxvOL?0mneFyOzg6W}nW)a7? z>}yLGB4x&s8OPyeb}>-KL&r2Vk9}5J86p^H1~lO%+Z(K@V4Q1!GP-h^dF+ta`8A|+ zb>eOfMXF{j6anVfD^j&cSs?5DQtyCaE?Ff4)M@{M;^3@d=G!;Nz9CqBnM%OQc$aBt zj6KrOaCI2ti5&m?Z(qSGhWv%Og5GrAmPZp&G41D-eX{#_8mB}zOSA&bdfq}xwewrB4eqiwVKW+}`x2TtziM1|}q~E#=BOWw{a_H2J&HMu# z{dv&}umW3lCOY<+3jvc7LO7YvSF;Wz_~)q<<5!{>f=B)6{8H-WJ_S*k9UU4NJSE>Ebt?W1^CPsF^Tx57Ku3d;iF5A^1y`^!? z-^Dj7!6*PKduo!rWNP$Vry~0HOBUOE*(uNkD;j2oA=_yG?!x z87oU*m9*(P_6z^_hQkrovTS6`aV*Wm{4#$Q$3&O#x*t7l@KryEsX2y1PRN^sUhbSj z9>l;da4g+X?S_TP^GY?OvK~qnW-wD|MvVD|e+aLL3N1~!yC#+$$H+*Exmgx~LL|r- zu=Z~^+b|lwyvR|~V_)=pLaTzY{G*fiIj7IGEjyy_h!H#-dMhwu%6dwG8Fp#*Aj%9&QQMq(VIA*tg%d6LbOA{NF{Lc~Uj_7d2p3Q>9>M)|rj${5T^f6s;BL6Wx zmx*j^WHbNbG7z@QWqQbHVOrj}Pj(--_1zB+y-#rT7e^~#E1+g9e5z@b2PI>kZ#Yf@ zZl-VTcGpbm_*j*jW3y4RGza6L2F3}rT5Ahg!fbO%pJTUMII>wp8GPYU(XDzIR}EyD4u&xdf5plDsyR=xQcR4= z;14BEexRyNx2N>Qlt1yXu0k#2-sN)dtIv7mEklAMT z&s0CovGt_NuRQg>jVdIkowXcgn&g{V9-awe>CjR`Ogy?w$D1SK->uX*%M^&26vo3@ zG1!-&IvHyi`R{O?TfGhi*~wLE!IDQU{MbbdAJk^2I? zlEp&3dhm=@``)qu0mVl(HAfi)ER9{62ZWg?4WhNanZyPKC-$pG97Eez_*oeH*tIj; zQT?4?D#yP1T8wFBqX4ayQ|V=YdA? zsQ4%XfR?rbg%ehJxM3+RE47m?w!BS_hE24-V*Hl}Y!xWcsAoig$=~S~c;!g7+ddUn za&acIaShF5e>~YO79m)fuX0lI*mK-=M z^FNICiSz)0i5Zl|5%7Ifr4I1KT2QG$x^{5pa3v@`oIJTuuGh4xpUJ_}$I3+xN;0fX zXZi=H4~PL`m@YW~>AtH_J0%xD!>HF#UyBlm8BHzt_ho$Bs(0RRX`kTe{X{EZE5N`w z`MPt%=Ejz$SK%;acR<+@*UvbY>PrGlnAI?wOKuX`ZV2Yy3^gT7DPzXXgnnR}MVdG< zB~3UYrZyG)t4@mg&zJ;`46cY!KQm+JJ0pdQu|am z*&KakY3xd)8Q6=?-+dl!5|b2qvsar7e6Xno7vLBmCSr!yVl>Rkw0$?~<9*dkkeDLJ z>=K#8v4M#W)~6akb6M=O_ib(6b(|ne?SEwpG=fdZMksg=juMnD_x_FEnXkZ(_jaA| zt0~CBAu&_Kb`=z>&ks}Na?6hI`_hHh_?moWCW85~!vl`LQDV7E z*)8N2BU!0Zaof_z4sm2H!33Mn>k(zM!!eH~*|T{#nL@MR2TxmT{o>%9(Q(L_>HHGP zJXr~R3E7I{r#@^QD!jLt6@wdysn)w59OI|zh)5R;D+58kbPM!88#>zq2a&k|8Ml{J7WN`YKYm-MaIC=0!oL3`= zF>(l@%(0>w?$fO7j@9}jZ+{ucs&-q&d8L+`R9vY@Qzxa5RfB0HDAjA))G#O(8ztd9 z1g5|!)c)OK$0buO+?v2K` zeH8BC=skujP&WS!@|6;bm8`dUtX4(N-O*Ncc@<|ow3Xx|S{a+0%A|c^7^4`|6PkMz zF$wF^vcDa0<_D9cgQdhVIWfR7SH@E3HN&^(GSq$wd}2guHl??DNo1;{#45H@9r(q{ zl#);se1*+->sTVZ0=2*{3ovUGeolUQXb4mFN&3dqfGk0rRVO*J5sET~5;Qx3%x3@i zQ8zDYl{4D@)#RU%L(DXR*2b>?^Nt9_q8t1pw*tQ}UIt##Zc!>3N=sfvyBy8)m10K8 zQo*FNAAKLx^6q3DK(ug|k&djBq16yJ3>!n0#DuM>kbF3^FX@IM1hY0}VV$@Kn2u@e znFptygo-XT5i%9EH5WAF@A0W99Dr&3ol2^%jDL4b*hvf7^r|w*%p04V&FHKCcfM}SF*3B*ZRF5$)uHE*L z`w&NOI9h>Lt(3l$x>AhwLPIF%iA~!*g)Qob{PF8&+w4p0hA~3vOM=bwOggJUtvy(o z+QyEc6^4YebBE9ky9zY>=~Ts)WH8anM9EUDOu?o-Oof(ix@eAZCFtq_Z_2D2zinAf zw=pU!VPdc^xnXTAIQz4oP&$(IqGQzF<43i#wph}lPRF`U#HScC-Sv0yK|R$3=Pj`K~Wf z{;P8ZEnkpd=!pTieg3yAQ~lxcG)8y=JX&&grQi;CjX_Az5X$xI>> zn$2}&Qwrev#iC)U-m1-ul6jn~z2TU}mBDw$g$mSgCF9#XTJ&@zM5~@^ zO0Fb?ln2AwTo~x7hY!zf|G=)publ?zlBzG0jA|z_iRoX;5;Rvmv>^H{M=KDmz@qir zkL^BIt&gp-k1#FIVivyixl{7SP<;uMbs8QA$0U^1)33~O0g5PX1ONvivZ`@9iZNa72g7@S{oWZ*LVRqmwB2JhKA|l@atx&pbYAzl2{G$vjf$X z(Xss8-czCvaI^x^3it|)oU%#o3t9c$RH??uP%@pwk5MrGjDcI+Cng-*Llbkn3in3d zpkW?bUZ|$oni=PS_Wg;n`g^7lxeOempO4VYV$56VNoWO1%?-r(dtB#F{bBK(X-S5L zdn~CyveXRxxM4>p&Kwd*pSK7R922?1agn{5m>|w|esfub#LNoAkNEXVit#BpB8mjW z=#5ufWYimnv*AV?S*Z#Kh=l#Vtc-AEWG*lg=Nk zX>sWMot}vA23(o2ma<#OfMLEeU70!t*)A9!zvLO4{sxH6q6JxS`5gKys)z~q1@qvb zI>_nGkdO6U9hco=nN1a0#e6r_QL43tsru++6j54&(p(n1TlC>t9wgSHVd;kuFxZ!O zw>AKbpH`SS_U?@e_TgPQMvQ?n@-NuN5Hs_}9Nlf)qK#2^#PsJkI*3*vT!Bj;V9Jta z>nNcQpm7t~1Zu%rZrLZUn=TK=$mDq=%e14A0Wc<=l`^Y_|YgaRbwVs=F0oZcZ&A8WtH=y?ugNy8?8VcE3jo}(D9C`7E!A1 zlAFi`8RW7On*5X8|J3aZ9l>Z&=DADZm|4pNP_FPBSk;2EG&kb_C&opigUe7WY`Izjlj%jzUNOqpCs>x2~5F@DM7$(+nRJ_9@yESyJg;aGubm@#A zrSg@M_uJpUvsHmwyxK-wIe{+}BW8*&864AZ!kRk%{i0LR3PdYlE3p2p_l~}Hf|6oT zGAb^+7OBlU+)U+r8YOn(y=$nu1jK-{^UWlN6qfFc?NC+=#QdR~V-;f>+jkt%$PsDp~r!SuPG{I)A`?aOY;H|6S(Q4ucv7WoaA( z%EAQYgH`Q%Jge^!!!hY&HeP|n=bHts4A)=uX^mDOT7mjkVBy-Wq5(9IRpm>iHTeO` zB-GfQRq=)UUp@DUFp89y%-s8+Q<{?1iDP17Qqp8a^IjR>EZ+r`0bfY{Oj9z!Kb||+ z4f8JeH<#!V!x%xO58J(Ik@~yJCsrD>F0bHNH3>?ql(gm*yNhFW(y;VN$FY<9(P1nc zHS+Nr=ds$ZRgx@j$GEFJ#vYMDR-{k6k}dD=s{daw`f0QR(F(8vL#Mw^EQ!gV`zT~$ z7G~;UZbh3bCQy9|E>WiBh?G{wvhgvY9K)3i!9q%gy>?jgzs9N7l4PYO!RbK7n71xf zqr$W>)f^5`?Z7bt-n&*OFPj{6Dyh~eaN(F*TbwyeMc+8YghdSju{4^c502`&tWCbY zGSDRX62Sulpy3?jBng*eyG`1%BO2cp-J{V8?CT0#^Uyq1DsdlCahV%Bms~F6&N}>> z$(5hm~BBWKyOV;OiP2*Lq1AYTFm7lq1lQS`qu^bEM>7*p@E5vy0 zkv%FFt=+z_|9;VR(F#N>U@LI(|I9Y)xMUf{m3B{YMz!QQ6`#0i)`i1js9tHEzaAU| z)&MT~F7TBNi?ipUwxPjSMkX2Ki%Moze>uuzh;43C|LR2F73#%t{X(@#G~1Zk_4xR< z_Wd=+D8ok#&1~3Q@U?#? zg<}%RWQZlSynU%$WKf_qB}*S16mDj<;qruBJ_Ryn?JV$J{4+T1Z)%vYRO7&E;aC_{ zn$oq0Y2P_mCVX)QZJ#skANZiv6%!>tQcQs+85;SBE611zrtF@gl@0ypi>{AWAX))m zfyL`LAKPsLrVEEJ?k|%5H1U(QiMANIWvBjOgD932E3r?PkgGEWkfq2mH1j)x)!Ga9 ztd!|%qhmlB)k&~2H2;D{Y5#m2^e|Id`b-mw|KJtU9I8HhkkgMrPB-&&-h)b&hZo0B zdsJ?*hHgGWS9)514Nf|7V50qlyV~}cM#XpQ+#;(EQ=4%QCrK8w@>fL(%IJoSR^Y>} zz_gd%A>&U_si_vatt{}dNJr;$%f3{|z&P{A4plQ)!5U+HQ#eKnfHSq=EA!z6BMDCR ztZ!EuC8KI-W(-ek?^QG+OZKsLg}?}qLXGwTAY;5%8pkqTF3$NLFT`Zpm*XP-<-tKX z#;74scG5ugz5vA1)t5lok+&{%VZR+scw}yo{nf%riDRAmOxgBcr0svW4{`MDXa!oe z8Zv!@GL^Vttu4l3T`ch7m>SId(zXTTl)f}(1wbjlWboxk8-)oaGfgZLxH6AzU~L$Oq#BB{MeCyq%EtKsN53Un0bc>N zh_TslpqZ&Rw88+ygl6oI`sK5VE-i%g-q#3UF7JmirYZcjKrGd9kq+3B(PYmU9?(2i z-u~GP=e45jjBql|lroX0(T|;mp^rI^d8FBGo(*(+(nCU<*XGXEhQyVCo1-7%*ztdQ zw{^kT)?JE8Q>ygaR#h}iPW~dgz&$oCs-TQ+zGwv+c?Gt_zYXny977d0>rPlcjO^X;c7SuOa=dkzu5pLA>MF}0JzNND^ZSp$7-c40Tv)7 z)lj3`VhP7I(dw3CJ9NM4jwdk=7Ny-aAd%TQ{-Ol8B8p1!z;#MtG8F0?h-0ZxH2$$3)2*eLeG7nH7NHYk znpReJ`TfsFpSWlRq7`Vm6)1np-wfu#RVCxIOIT$Q|fR{TF6mucVY zk2?4`-3Edf7)ZZF{AQoHMF~n4O~zMi@1|Ii=1BQPob1@^+3oLFHQm2p^qZpSH^^0VS_S}G#d+B+WP8=XFs}A6_?i9n#PHmOTGt`If7*dn7bWYKuQDrUo8pE zW26h&P|S=nanMApOr5LmT$LbIip|5J41ElFpV~?5=_>ENWh!-$Ev`Jdf6V?B3aw?ALK7Pr%taDiw?&{~QuA=u_DF}Bir?0%&2o$pKdVx{1f9#qU0>>O&RSvYA zquc6Jj~(}5B;peTUY0C7Kz^qxgs67B-B#N_(1V4~r|r*$y^JsFfQ4uggv(mqq01#4 zL$_aQiae2B(}BPAkKpx`K8qjV${wkal9OHLWT4RY`aGvXPSXiM&T-&lNB=Gt*iH}_ z0D}r~>KcQT&8RXKzm`Fuh?n&eRhy?y6Ptv2NR6~Od0it*6vWonP}I0yiFO}xQnbO* zvpNW7dk|U7(MTN&OmLGg^@XimKcWQd_u`G_AR=) zQn3LM`Oc)wla@`2q!!F5QyV6GO8B=1BZGiPW7SS;1=_16Th9vT2`o3vUnI35+b{^63`9lB?1CH$-T~iTp6l?Q&nUR9fX}B1fgHB zDJLhQxN2~gu71-wtsZ!s z5~hXLUJSsdtL6S^@q+CSfh&AaeDN(p+hf;iN9v2O7!4n@_zEisWl=BBSvq`1KkrBq zR*2Ojpx7b3$`Buj{{#JrTQUZ|BcC7GpkpjHHzChX3|I9v5RG1?-j`aNXe57I=ckkY z!+Y@Ftjz9q17FE9I4z3dPCw+@uq@Ediq21s=(C_y!D8Xb!qVsay%Zg%+KDRB0+8nm|X$lz8Y*93*Dcl9Gu-t4of3$L|uw6=-P#>1@C=XU&`PxPIK4RBpu%$(COj>7cUOu9ukaDQUGnK)-PP9uJ8rU@+p)t#-+Dj#0!{1NHa{xMT7CKo

VllUa`NP2a~5B_61we9nkYxAK!vSX4t5}+W%R3KY^>+J$%|NN>17T+096mdvK+I# z{Vt@ZC|dsB|7%Ql%=uHDp9f7a2gbLk&~boVMJc=|IkCn0GXD-tLttJEu#qY6{F*uA zg3Fi}PNeoV!j3gmEl3?Hwg2MdYMGXFr4~up6HUAZ$Q1N$s?@9s;a%BlO1Tc*hNuTq zxsyCj)1it;jXc0FlT+$jE&-O$KavCNz0tS|{43D2q>UMXa|KyKhA8E(QkBwmlx3c|MTla@>7zMXA?@(cNv_u7w4^#n{B5lzT z&XPN-{Co!B&LW(Z%PGzzd#y(VscY zvHqxkeseGL?98x=&bnCLmRV?4EHkiHc*g6QzQj^djGsvcXFs& ztC;O#fe7;=94~N&T0$Q1EkQI)+3?P({n7WEn|r{0x*B8~a9{?LbN0&WF&@^bMv zflTP%>rj%uAgI71wnNwQun?ywwwHa|Ncsw1dtsDC1(h7qz9JmS`ZziDv!yg+8@9)3 zKd(>E?hIpe+$Z07{gV!-oQ=fk_^Li0c+!3P;Jx>`%grGFW#~rLt@ChM!W2M~zps~A zl&SC{L2Vv1R#ln)*|CC#+ir{=v0?z?qtze4i7=c&EQhmx^}XLW-{%Yi^^ff`v#cG= zF?mxd2MxOq6K9l`vr_0NdiqV^j>!}$Ec88FmGmpK`DrVt`R4fVKDG$F#PJHe3b8ul zfJi^lgqGB=!&LY~9JLY>JU3Juv_89rKCh#OBg~?mPQV%35Q{CE1aovTkTY`ZjZ4U7 z$H(a0p<$R0QZDH@;~dh(AH6jHqz5lKXWbCr8@kQg2U?kqhhPmK4Gt4$Ne$dhn*n)mQMS+wfFoL`kxA|@ax2G_9rr=xB#*Vir;nQ6}~ z3pw&TIK9zL@ohBvgOvW*6(M!c5tD089yp}e1H)NJgQx;72b0kU-03VteWFjDC>1T} zZNKpp`R5Beo3|!x;|m>bHm?XcqC|jyZFR7KOx-W^VV9dRPo!nZX78IKH}i8VRR;a$ zZLS=C)uk!Zr#H1?N2B%77Sa{ZH0DC=Hp0-a^yB(lijN2q5lU3K= z7l}*rN`fX5lcw(fXYHc!xw8< z8(n4AK3Q}r6P6*1GAhJMt*lDZgwr8G_`6IXu!uhq;Maw5J`NbO zB{l`R%j}rAwy6bfypw$6o|rjpwU=Bh2yt_Q*$JqXonxdgf4|R0#R&L8;3Tah0D%Py zjlPQs$jD3@P}ss><4*s`M?MtH6Wt-KH-o`Ai7j6$0QYljdsluO@%o|wZ1jpGrhX>MllD3ZUs4xz8&H*m&s3^OBk7tHy9;o13M%x5eTy&*q_Frksa zQ1wbWi3rckcP(_6g0d`^*5I9-z1c}Y3oGX;%i96|n<&5ZsDCx8l^*@}0Dz|V;RT zLRYzIw)_tlO`9(q3G)68ixD)ApQX#dSMh0--}|mD`EDjHlgIFm09*IjQq9Q-!?paF z75(HG%nlF^ej-=Ue&|oI{m&8W&x?l~C@C@FrwXjbIG=(Zrf{Iffh~w`cw#oGVdd2- zoH&Z!wDsEoj_LW3_wvXCrp!TawcuoMo)(Tb1S zaoNz=6WPrg1&dBpoI&=ISonj&n?OzyV%R;k-!;cS!O)^!FE$KUdNPzCXi|UiBDYgT zw`LfrctH)vY7%w73N=O~3tf82WJu%uKuA{!cI)h3gj_2UFaCK6h+^MKoU{{Ie+!epMaF>CbhCL!1s#Yy!wIF_jl(XV}Q}2eep+3J|=zbE)0+u}_ zPP12r7KzC_^TJT5Eay5Mea7u;_TE;6&at0)7piq_v2;zVpB^%V$$1hX`-UViOAyyS zWNV;{P7RrZ1yNm~^bs>7>0$AecZm25I8GuuzmI?KMWr!KHRwbTlm47TEYzJ(89T;+&o@RL>uouEkku(1W8+ zs#!-4Px#v1#xq`CPWf#i5*R)mTGhofN*1QOk69&gwlbvx&W^wrh2gpYD3i-DEhpEd zH`J!Eb`qsW#AOIlBmd`0Wtz~Xpbhs_Q3;kX1KmL^*YDx4z0{Ot%;}!R_AR!v%|u#P z%1=5JfLo!-y?~$J=-S}#vm~21W0aYbtf1qlu9RzxLUwi_t=CK*G*6C$Sq3N zUW>e(9GR|3rAnci%GUMp4J<6B@zux((d8&{Tjq1cP6!*%Ry_wdRlSR83lA$O02fd$ zOsJsK35rIXU&xjj4fpK}K~hgezVn5RIA_HhZJFkmS}I%o^Z*t)Mvb0u)h~>xh4exQ z;QLAq6?SY#L%fc9wHe*Y4JLzf26VJPFWFaR>2mNfpApYKzkQ>jtPoQ$3W#pY!c7>+>&ixj!o64^98X(( zOp;x?{ERSw8_3acR0H1*?P$eOJQpE(oo4_Ss#*Obgmb@^k>AyNjaHO8_@ITXEVa-0 z(g62qp2XKy2IJiR8h<{6vkt_;u{GJ=+~(Wm*f%kvTV%GAz*hntJ`<(bRHUfd2p-M*o$r z{D!sS@M}Zs(5l#G=l;B#<|0C2Wg7z8tfUsF z;PR64miMy`$gdiCu0dtXqw#Pt!OIkPCCS7a>;aq>Aj;y~xhJRNVYB?oQILp1vOJQM z9rd5$H?|8nSa$U#DB*fXQ?zBtENdk{^HGL)+HTU3H!Nm ziCE-PIegn_2*@g;LhS_C?sPq@iXelS6Q zYM~SkM!2}Oaas#qvRFTh{%lvH=iEJRQ}x7#)X$BZwJjG0XHpHf-;#O-=anu{E@ z=w^M^YH)&FoQkAN=$>5eAwLy3Zd z9v;1=S1e`#%VfjLh{n+eg;=rKG;%&cOtDW z^6449`$R6Bf^Wyl3u5CU$!H4)XeLj2AKv*Laou!8`_sf4qmm!&WN=p@Wp?mWsj|O7 zL=+*b(yB$S%X~jdMA*+-qVdMkF@o{QQ;kdBBFB*i5fZten# zZr%6(H5b5=ksT-IcjEYjb0{?0_WQ`}O8$-lRz$he-S2ks5NdGKuh79%BAg%P3wo72 zteT@$RX;^5XjV`^;sh9aFH>;ouYnJUa**cl01G-^DO1^aJll`9R$)E)E!XdibzouD znQRSh?p9XlG|!lRD=5*+h3@un+qywBwgxTuWde17`wc+s4U?peE~JRzQ$Loz`)al= z{7ay|So#)+M!(|KO1E>PGCa!bhJ4lnzzD4b%-f1byS>egv#ulNt2-!43(E zUeOR;0<85{kD~?GEWhGiwt5D@n^4u6Uhy|<(y}tT5L06%>BY_C;g zCJtDoEDEW=>p&e4;v)uzx>*HdBeVT2YA8lxOZG}Ie0=nc9?c&l1raDi#pWZu8HG#i z*~QCkcbVft#)kqgY(icv8+=SPICHhR^R_lFwfLu`}81JVr^2# zG~~Vc-Dxs$50>|*R%%ktzCdVwTc3cDo~1lcn<7J1;dKcvEiXoqZU5uJyris`=)vUm zyXRppLY?bwL?)aVx3JM9$J2e+G<%@Dd7?Y2q&r?=S-_^G*5#*}Wqr8&Sh9)B#FQzd z${hKKp~2g(F-|N*-=d8Up|hMlmpaxaJ_!E_l%M*;ST(f>e;XlhkB4jcSy$tmP0Z}& z`Ng+A$^~40ECkWp2juY(JVkVsTK$b2{-3bhAIA|%!u%$mauhTkpr+mS<|(BM8K+9c z@$<#1%ctrJdrumVMUQmb*QLTq;|MMQGc)4DX`~(bv3=&ajiu6CO-b}UrbW$;`>OSi zI8O;Mt=V8hKv~*{P=1m+D=k>~iq&gb$bz3X_4#2aN?q$xW$#l@xy8JKh71hpttY%m zVwU%Dp%${Fj`B?o&5%~kuZq<;IDM?~+c61LYhp{323cY-GDY^Pk?y`<-;M7x^t_|E zLHPh64~UU6v0GT>+U6eQp>|YP$WI<%mfPXcsIj^bJ`eN}${zK)58F``s0KUwQi_8ykbA`mRW>8kh!^93@m$fR?aChcWAmvZq2 zW#r&kykQI3PaOseaOo{=62VPeR8-^o@y^VYMfPrNu>?x4T{ULPr{$(^0;3%iPuDOl za1KN*x3&A$J6V{mTtqzy7ZEb6>A^X zog2iQ->gBL4Tz`<^iMTTp9Sb_YbU1eXpWcAbzfM#Krd|AI<<~VHMg(c`LWjbAR_J= zXq=O^1>0fAc^s37$nw*YB%a`{XMa>{RDRl37+Ys|vp`fBNy7;X# z^qBBLdzo-x)Ox3x3b|04(~8QHTg2eJNNkWO^aEHSDSAua_N*{AwkS(p|zVV z(X4~5=-M(ArVRWDlo$al#ExMa7aEUoIe78&IyhALy=Ax`TE#+)r+qyXzt&K*^GE1Q z=?aACc#ssc2HWykdR6I8Di94|$tO43Tw9MX;8mXvGCIZWGjK`9?GwAIR9&(CsI>Mv zH#2O_dfq;x;ZVsvioCmheySu(Sv1}{kGjC4e61E#?d|4|m!D@&kHV%(E*=IDI%`WA zG!))BQH1Jba~fj}VZBTS!0SNwXObC5$yGWOmYByd7X)dP@1Lli&kN-#W>M=A6nL zv5hN4ypxC?z}(_{H6Izl8U~K0PeSjjMemf*=o1I+1uXM#dzVdT3RP*CCDCj-2KUr= z3`989NRdUp+SeZR4Ep1MvUGTH+>PrDn zh8#TZ^(x4;lZMGbtU_E_HDZu}pVr2{b|r@ZjzbF17*BzTJZRkqH7y}8A5^v^nP|b% z;;(smcj`v1PakAEVd4=GLKOJqMGIe1FG|m&yJ&|9PdzqpEH4RpdJ@xt@SrDA-_uhOWHqY$_%Jehw)fBgo5!8F**-T%-o%SdT1cJ*xWVQVCi$OM z5tAeHM!r0ub3*qA?;JzhCrmRkw4&BsUNnhY3&C#O#asBSzd9m^?f#qbCERZTgv;ot z1NLFSd9l;Oqgn^7roTpy0TJHabFQ0zVUtbt>4$+H73qC)X_K?+f@WEg-kKK0MwJ$0 zU4^ra+=E~2t^}LA-uN;tAxk!VDOTXr*DXg=n!Pki(Y5^rrM_?5Rl6{K#zj#6)~ZAz zV;ISt9EUBB#@bCgtYXL#_i&kjQmE-3C&3)4(J{gNM5?Qk*JJYP{Gus?a43feT~gtl|9gsI0}mNELYANNdGfxHA!Pe51F7MHeFFu6r!y$z;X1 z3Mo(o*?(%J<~I8ZzB(pR(}}9qs;tWq47WD+hL4S!=KMHysntKw?(66C*T9SUAHG8W z9+;wpmjc2!NtHxG+X~C#HqJVtzReXM5T=@cG5_V|#DlZfAerf1b0QCE_b8{oV;jeo6!c42iYy)cUfO@hRbYqnRDOcyblXbS*t`_InYM zk{FxJg~5r?_>%KLbj@jW)KTUV=tGIcRY{YFAMxLs_-SeP6^|8L&XkEvvLa`Wy($9N zThNQ}*_fxF?)sYH)g2#hxnR!lUP>)PgitVs*kqkn!ir0RGp(&9+x$i+Oz~jL@E)%9 z?@6jF-+f*@2(DK6*i;y|;Dfp4nwdjxt=m&-lj%ZLubDjCkmTzDR6MH1Y3z27J&vX2 z@xP{;znJdiQP)7d1nY|rELKu1WkmjH!;HJe4^wgH+YVR^I*-;x13v@RV^(qJQoNrx$-Hdl~oxt3?mvHjecF4=@6Q5P3bC0Tj(~iL6put>w404s(8-J z0DgKQ0PAmmvF!CX+dX&bp@p0gwZj$Nkm~wZMDkixIqi@6p3cAEB~R~_wUT&m0h|8U zxA)Y~yC1OH>{yT{@+IRhln|1;cTG$?fjz}f3=Xnr3hyxrCbPY?>ZfME-8l8bYJ^OV zz_xH1(SzEIr)$}X))v;!I=LaIpHt>&i6ldsvb4;-Qn|$O<6m_*>AmF(RLL?>)1_sH zB~{-0GB=FOTt|HGmZ{%*d))ghjuSz8Zg-)Om$2WtSm_74AoVwm&0>KU6^EZt&i>pr zz?$Sw1BWonx`?BoW&J?+l|=5dAxoM>ya%hQ(YIZ;Pk)sZ5D)`LqreKy)r1J@mnjd`u-NMoQotvwLsl)RxCx|UNKM(}`>sx@2i}T+^Fz9cp zkPwhV(ZbQn%^C;>!)R(i4h>Id3m}J%GQ`%x%nit){vP7?7e&s&)C%?wZ5wkKGdGAI z$nnO)#>(0a$i)W&a!5MaJGrVmo0?gmb4XdZ+n8C%x|(_dIpiGOEL@$P>`mP)fNrku zVFDy<+}^2JxJo)XI6FC7IJyC0l4NY`VQjGPXFe$lGbeKkpoj?i-!1WgKg?W6{xw5{ z^za08e)JNv#+hg@zbkF!??<*NWNx6l6WSQf0{T5fooM3_xmZfYp4Cxd;a}0Y+E^#H6q|Y0;KhVZg4iH3@3#^=81bFfK{Rwpnh#w6Gv) z$M#k}+`h0WDb+Ui42ZLX%}beZeX0ZuBenmC=d67$5T4b9@5~bv#D!pFJHmTv$A=&S z5%ZJllpfw>7FkinoRURNCFbIc7@b2wJO?B6bwQ)n)cd;NKBoHHfWDVqXIp^Bz5q=~ zhI^PrY>6?;w^2z5x%eWK^^p*FbrI;hhNIWc>HTUkw~!E!yI9NDSZ-rTNUCsE*ex9h zmM5@~yUPF?LAn&ZR~pL$oh{;G;M6G1kDAB0hzo28dR_KWYeTlmBx6T-DomCi2$p9( zyF1@!`AdNA@)`rXX^@Ml0X;#uy1ml*lwh1BYM>r;im{UBC8p3ODk?G!Ujz$UdjhJ;{_zTECkpZXzy=SasJPi)WMGiPL;g)gvc_@pCnuKbP zoL3()bR-N}DUvnGBWY7L@MIv_vBA^9l6glkYvjv-n8_K?Ym%t#a?>D-xp;xbN{}ZS zAy^JT-ACg!$*82i@?yuU%583ObM<&r8_AgSyo+q&`r zU@8pGm6Cjv=y!4N(E0ovXlHdG|y9PxTMGz>B` z7_w=xq^4{HH0#m^7!cYXM(b7D1>(G%5RH)vF9g6HBuJ>eyw} zF}hg2$EO2RHNn4(_y?1Ri|uk!2|1AUaJV@7q%auf%Sm3c0l0R1zJ#(I`j2R%a z;t)t*TdJ-2a50G)+h=n#NO=R!a4fMmTNo+s`f5nt!2~ptD5B|XEguQI4OxVBS!Vd@ zqy&h;NT>n0)j|S`j%i^$%nvKcjN?cTb?XhZgD6no1Wz0TBGTIfYwD#XeHc;1%^@9> zsHZgoEk7jTzz-Z(k25@}z{(cp85X_;E5wohGmK|cL5wX7tu!Qo)tv2{YK)cfBxRoM zE<1f?%1kd{W}+!|Oz$=Vt+HTWj>u49(qzqUmx(?oB~(@yo$Vn)F1H{fm0Qm%)7-PZ z9-TfRSqb9mY4a|TZgQd^)lJU}kf5v(X~Jo{3#2bfIg`~@W1EhYD=YY#+M~yuWuDeR zfJOf;xfxRH&E%C>FsoLVilE0F!IV?5B&Q{*&}33-T|!?NouVeIOU0HH!BkKXoeI$_ z{cJv6Pk>hVC7BGu?8W4qm^2mNk(vvO4XLiFaAvY+E5}v{i**UH^_IJXGF8&qfj1jA zFbmt06T95T;#C!~Id-FK>Gf&}CuJ1a!BO?*uLoY+$Pp-VuzB{loyTu5+7;2sf?qV4 z<4me4+$WS5C7*P;P2(9T8ne~(x?SR3lTPX>7;v;T1Pc!|+o3Tdvw?e8Hf4ZIenx0) z9}vcSvNu18fjF!^aZu^Dz!8*Y!jO|w37`^~Bky{FzjtLVN(>5Fk~tMMyJttn&H^9+ z&IKZ}!cW4wx~brgAy~4f2}`{uD=hG%koM>`Vj<(fY(JS!w$wV+`}AcRApiHj>@G#v?X z54O7ZKCkY)y`7!`{=Q(0yz2;GFvy4|n|$~eV|xKPrvEIOHBnuAgcI{4>TJ#7 z8OHYVKhS^!cK9R{ciB^)B$G~Naj|xia7_cr`vS~-34nPdE?KXIc^3F2kp@TtU1Y4J zCBXz)puHiaX^AL9YfFSz`|K|TUdwCDmIA3v0jnvXeTbgHaf;q)V&g%$B4v{Tk_XL2(^XPLZhVBg-c;xseO;H>a73pD zNGq>#bWwq{6%!3gYz8}RM-d~km?4<;lEkdJn{ik;*D`=`pbv~k{AXbS@fZPR5Ca*P z$ubCVLwbdqq)K)1iksxb1MgZ7y3Kg>&_*)HkI&EE=SlEQlpUG<5w-@OQuYQ0nfT)c zb?Sq`GBs;$Bw@i+Cwhvhs+gW^$YgP-LP6o&5p1I-Vz^PAZK>9IGgtSBukt%Q{-*); zmtFL1L2-h4c>mLY;{0C>D6W4QP)a~9Acy#~LF4#r_55uPsmV(G-*!%B@&^s|d7@9F zZG3HGc+^0;3o;Dq2CLV#+xoWBY}XfVCI6p{=9E|ZqIMkl=NCu%ck0*s(Q$Sm3! zj!Ivbs+9ERZ>SyGaRtx$Qu;%`?(+Qhx7m5CW1rb(IF1kdeUwYzAghchaUQ*5{z~Ds^6K5!xlPCu*x14&tr^^1aXp5y~AT@=4Bj-7ub}RQ6 zXp72HI^Aj>6p&+(O1EN__YuXSO+zjnZu5$9a`O7KA{>Yy&3Jel7NI+wQ<{MEDEtfo z4mGhypw$&C@9E zMC@PXlq?NTr|Xbr9d}qket4)mvt@nLF~9uESN%cwhu59vDgD9d7jftp-DUfOa*j44 zxJz2S42rt;Bu%(_2V}9$)pF%yAlw-eT>aAL^H-tvM)5ssm<$+^2M6}=;Ir)5S$6pD zvI3n3J3=WXZ@Vj zNqiczqp7-+h!z}f-4Y@cpcBh(jvnkcz3NB8%YZ`an`uX2{oWYPCqzJ{Q4ZyYlQ5hl z4I-_hs276IzCI2Z{YQJNbwym&yBJQd$L(8641);ARYh@X^{q?H7;{&;TvpP&QLln3Ew6ynZ>Rry9D5v*_B#H%k);8;V9yAx2wexM?b%jlrKJe87&)uDyQ zrLv2o&POPbPLIXPf7ulECeCF85&2V&X(|a(AL;rhUFa%A%X9`J51LLjOVv^&-r}{y z;R?73EPzbc6zVXPi@Kxn;$}p#^=O&InCMrh)F9589te_S^>>o4kvsb~k{ED0@>Bx8 zVb4Na{P(}VSfxMpXk}g^I1a?_dUpc(NY#$+NACA(Ifk;YgCQ184`3GvL+^mJ_Ou!} zWT@My55c(I+^PY^%5K!5IG#NQ5T=^wIq_CGa(bl%0=ZCHVl`T(wE6%IIa_K&dSUuD zs)T{p=CZCNx?)Dkm9$wvV>;}3QI$kSdIDv6a%qWqB?0*+F;6j1$pW<(#g0=trK!!C zddh85KJq>svI$%%=PBz06$xc=c1imw-gL@|vnd}^jM=jojH&$O9}Djr5mdXxy3_;m zsbCV!pkaS2mBxsGNSCy_cJ|O-Zo^pxUZuJCR0Tr3VWP#^IWBuFu z*S{=&fhc78^6w@Sc6%=0&kU#(Nil^(hajC^T#CWB+DfDq?l4gO{Zys>C94xQspU-ExoO&?Y!;XG<#Xp zXwm40FQb{p+)o?#pZ2Po!@U}BZU21V6W&W8ODAh5BPG)$OX2S0Ax(EoA4uO!-{$VG zx7NdG0O)P%Z8sQ!lG2WbH7x1sA_a0PDi4d;#zpdfmkC#x71!xl+^|! zGx(<50g>ef#}aPr99fb~yN-d+8SeMjy^mkws;ZGi)+OV$X+}s&kf_9NQij ziM$pG7l{(VZ+CAm^WnHQeL#3{zx{nad$N5yd#4QG2b81jpyvZ*09q&_7@TN$NbdpP zyWqQ80x3BrjA;#~h!7<1CEY`W(0DKn32)z#u(NWP(;s*?YI^v3d;qXPq@^T#THeI` znD`+Z83oJc_dy00#!`A(_N}zHbc(b>iVmx8-G&TQ4+<<4CZc>v=uPYHT5>h#fQm;AH| zuD`CIl%O+>sAe(b5@u-Q_|BaNl58HdnLg6Q&lMYwQ)GOnYuS<-{iyio4U{&6E=U)n z&bD^RO4cH4P<0r0>tZ8)!*PgW;C$fDm&cOl!+WcC_s7utE}kPhtcsACN`r+ar4NQ( z&8vUf_hTG@4sYg9hGd4KEM6`Q0{3hX}5PMNXUJ;PD`u(_4v8xbw=rvtjE&o2cpS#!GVdZD+Cw2JdG;UNjM7E&6 zJLdhg;M6Q%F<&BYcT{{|&ALm!)5FRiNpJkJT@|jprfUE{mB8s*|25_D7fhjf&j_E= zU51CO%dca45qdc@i!jte9M&m{ZKW7MJ zeegY#=nFZG3@85dTH8&exqf3Jv$DE!X(%A2%ILJowPc~~?p`yc%&JnrP|zpSr|mHG zA!_DT%a>&117DlnhGU1eUFW)owOK(1dQR-d z_tQk>mx|j3Zf7nXw#|1oCO_C57Zybjr20Y~4nO*e9?H(v!D<@?|iGKKqc7NtU z?_jyLd=-3t_rKVy&t~Xf_9`#R!d|83L$`?+UK z@LwRH3Jmdk2jqBbVQyn8;p73-e})aY_<>y9hR=xKdl+~J268Can7;$+1OJxxjNAPU zJ%YLaF7>}8N}9Tv+B;bRIsPU3Z;M&W!u6evlOvD=%+CGapZ{-8`F4>u-QjbXT` z8>}2Dm|2d_DD|2X1Qq}Zzydq)bMkNs=z%~Cus;~zTPO2p7U2J%<-gkK;c8)t4g!LC z&_VzC0rK+jaPa^wf&Zcj@bH3R4SoIq9sj0*Kwy5pf6xSYxOrh{?LYWHoUo4l2Mx>% z8_$2xIC=jm4+P@k;r$1n0Ei3pKWIGMT>mTs#>e?jc>=H^c>XDmlULw>k@tLN`hV&t zz{A7+-|FnJbYZdBIy4&3()Xiurf?H{u(#|9zH%kbUHd| IWf}DU05B>{0{{R3 literal 0 HcmV?d00001 diff --git a/submodules/WalletUI/Images.xcassets/Wallet/CameraFlashIcon.imageset/Contents.json b/submodules/WalletUI/Images.xcassets/Wallet/CameraFlashIcon.imageset/Contents.json new file mode 100644 index 0000000000..39f252e34f --- /dev/null +++ b/submodules/WalletUI/Images.xcassets/Wallet/CameraFlashIcon.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "ic_flash.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/submodules/WalletUI/Images.xcassets/Wallet/CameraFlashIcon.imageset/ic_flash.pdf b/submodules/WalletUI/Images.xcassets/Wallet/CameraFlashIcon.imageset/ic_flash.pdf new file mode 100644 index 0000000000000000000000000000000000000000..68f60cae43384df4ab9ae3fac592445fb5e1f06b GIT binary patch literal 4199 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 literal 0 HcmV?d00001 diff --git a/submodules/WalletUI/Images.xcassets/Wallet/CameraGalleryIcon.imageset/Contents.json b/submodules/WalletUI/Images.xcassets/Wallet/CameraGalleryIcon.imageset/Contents.json new file mode 100644 index 0000000000..393265de7f --- /dev/null +++ b/submodules/WalletUI/Images.xcassets/Wallet/CameraGalleryIcon.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "ic_gallery (3).pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/submodules/WalletUI/Images.xcassets/Wallet/CameraGalleryIcon.imageset/ic_gallery (3).pdf b/submodules/WalletUI/Images.xcassets/Wallet/CameraGalleryIcon.imageset/ic_gallery (3).pdf new file mode 100644 index 0000000000000000000000000000000000000000..a5b36548a83515321e7aa2563d062b93135c37dc GIT binary patch literal 4174 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 N)4_s*syb@m{{cAl9UuSz literal 0 HcmV?d00001 diff --git a/submodules/WalletUI/Images.xcassets/Wallet/Contents.json b/submodules/WalletUI/Images.xcassets/Wallet/Contents.json new file mode 100644 index 0000000000..38f0c81fc2 --- /dev/null +++ b/submodules/WalletUI/Images.xcassets/Wallet/Contents.json @@ -0,0 +1,9 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "provides-namespace" : true + } +} \ No newline at end of file diff --git a/submodules/WalletUI/Images.xcassets/Wallet/DuckIcon.imageset/Contents.json b/submodules/WalletUI/Images.xcassets/Wallet/DuckIcon.imageset/Contents.json new file mode 100644 index 0000000000..a596598c09 --- /dev/null +++ b/submodules/WalletUI/Images.xcassets/Wallet/DuckIcon.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "duck.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/submodules/WalletUI/Images.xcassets/Wallet/DuckIcon.imageset/duck.pdf b/submodules/WalletUI/Images.xcassets/Wallet/DuckIcon.imageset/duck.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4ee986711eba6d2aa1aadf22c4cf1fcc1d62334a GIT binary patch literal 43310 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 literal 0 HcmV?d00001 diff --git a/submodules/WalletUI/Images.xcassets/Wallet/NavigationSettingsIcon.imageset/Contents.json b/submodules/WalletUI/Images.xcassets/Wallet/NavigationSettingsIcon.imageset/Contents.json new file mode 100644 index 0000000000..31daa63843 --- /dev/null +++ b/submodules/WalletUI/Images.xcassets/Wallet/NavigationSettingsIcon.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "NavigationSettingsIcon.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/submodules/WalletUI/Images.xcassets/Wallet/NavigationSettingsIcon.imageset/NavigationSettingsIcon.pdf b/submodules/WalletUI/Images.xcassets/Wallet/NavigationSettingsIcon.imageset/NavigationSettingsIcon.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4f188553a0ed649a4c4805c8fbee47b03f09ced1 GIT binary patch literal 5839 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 O{5(V~EHY}cME?VP++NWD literal 0 HcmV?d00001 diff --git a/submodules/WalletUI/Images.xcassets/Wallet/QrGem.imageset/Contents.json b/submodules/WalletUI/Images.xcassets/Wallet/QrGem.imageset/Contents.json new file mode 100644 index 0000000000..ae81ff437c --- /dev/null +++ b/submodules/WalletUI/Images.xcassets/Wallet/QrGem.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "QrGem@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "QrGem@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/submodules/WalletUI/Images.xcassets/Wallet/QrGem.imageset/QrGem@2x.png b/submodules/WalletUI/Images.xcassets/Wallet/QrGem.imageset/QrGem@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..35d164f8b318bb1bee29ead067bdf02332cc2656 GIT binary patch literal 15212 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 j1x*SzFt~x2p92Z9FkN7nR=C$!Rv literal 0 HcmV?d00001 diff --git a/submodules/WalletUI/Images.xcassets/Wallet/QrIcon.imageset/Contents.json b/submodules/WalletUI/Images.xcassets/Wallet/QrIcon.imageset/Contents.json new file mode 100644 index 0000000000..9bead22d1f --- /dev/null +++ b/submodules/WalletUI/Images.xcassets/Wallet/QrIcon.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "ic_qrcode.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/submodules/WalletUI/Images.xcassets/Wallet/QrIcon.imageset/ic_qrcode.pdf b/submodules/WalletUI/Images.xcassets/Wallet/QrIcon.imageset/ic_qrcode.pdf new file mode 100644 index 0000000000000000000000000000000000000000..cf234b82239e82c027356a047d742e9c99dadf49 GIT binary patch literal 4962 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∋!}Et&TKHp+v7yC&++6; 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

)48Kg&M*Nl` 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�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 literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/TelegramUI/Resources/WalletAnimations/SendingGrams.tgs b/submodules/WalletUI/Resources/Animations/SendingGrams.tgs similarity index 100% rename from submodules/TelegramUI/TelegramUI/Resources/WalletAnimations/SendingGrams.tgs rename to submodules/WalletUI/Resources/Animations/SendingGrams.tgs diff --git a/submodules/WalletUI/Resources/Animations/WalletApologiesAccepted.tgs b/submodules/WalletUI/Resources/Animations/WalletApologiesAccepted.tgs new file mode 100755 index 0000000000000000000000000000000000000000..614c2fe0e7261b9679069b4f026c19f77cc22a0b GIT binary patch literal 17922 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 delta 17 ZcmZ2#w$yCHOR33R($b8Klb=Z`002D+1@Zs@ diff --git a/submodules/WalletUI/Sources/ItemList/ItemListControllerNode.swift b/submodules/WalletUI/Sources/ItemList/ItemListControllerNode.swift index 89661fdf44..72784e604b 100644 --- a/submodules/WalletUI/Sources/ItemList/ItemListControllerNode.swift +++ b/submodules/WalletUI/Sources/ItemList/ItemListControllerNode.swift @@ -3,7 +3,6 @@ import UIKit import AsyncDisplayKit import Display import SwiftSignalKit -import TelegramCore import MergeLists typealias ItemListSectionId = Int32 diff --git a/submodules/WalletUI/Sources/ItemList/Items/ItemListMultilineTextItem.swift b/submodules/WalletUI/Sources/ItemList/Items/ItemListMultilineTextItem.swift index cfa233a510..93e3f4c752 100644 --- a/submodules/WalletUI/Sources/ItemList/Items/ItemListMultilineTextItem.swift +++ b/submodules/WalletUI/Sources/ItemList/Items/ItemListMultilineTextItem.swift @@ -3,8 +3,6 @@ import UIKit import Display import AsyncDisplayKit import SwiftSignalKit -import TextFormat -import AccountContext enum ItemListMultilineTextBaseFont { case `default` @@ -14,22 +12,20 @@ enum ItemListMultilineTextBaseFont { class ItemListMultilineTextItem: ListViewItem, ItemListItem { let theme: WalletTheme let text: String - let enabledEntityTypes: EnabledEntityTypes let font: ItemListMultilineTextBaseFont let sectionId: ItemListSectionId let style: ItemListStyle let action: (() -> Void)? let longTapAction: (() -> Void)? - let linkItemAction: ((TextLinkItemActionType, TextLinkItem) -> Void)? + let linkItemAction: ((String) -> Void)? let tag: Any? let selectable: Bool - init(theme: WalletTheme, text: String, enabledEntityTypes: EnabledEntityTypes, font: ItemListMultilineTextBaseFont = .default, sectionId: ItemListSectionId, style: ItemListStyle, action: (() -> Void)? = nil, longTapAction: (() -> Void)? = nil, linkItemAction: ((TextLinkItemActionType, TextLinkItem) -> Void)? = nil, tag: Any? = nil) { + init(theme: WalletTheme, text: String, font: ItemListMultilineTextBaseFont = .default, sectionId: ItemListSectionId, style: ItemListStyle, action: (() -> Void)? = nil, longTapAction: (() -> Void)? = nil, linkItemAction: ((String) -> Void)? = nil, tag: Any? = nil) { self.theme = theme self.text = text - self.enabledEntityTypes = enabledEntityTypes self.font = font self.sectionId = sectionId self.style = style @@ -198,8 +194,7 @@ class ItemListMultilineTextItemNode: ListViewItemNode { boldItalicFont = Font.semiboldItalicMonospace(17.0) } - let entities = generateTextEntities(item.text, enabledTypes: item.enabledEntityTypes) - let string = stringWithAppliedEntities(item.text, entities: entities, baseColor: textColor, linkColor: item.theme.list.itemAccentColor, baseFont: baseFont, linkFont: linkFont, boldFont: boldFont, italicFont: italicFont, boldItalicFont: boldItalicFont, fixedFont: titleFixedFont, blockQuoteFont: titleFont) + let string = NSAttributedString(string: item.text, font: baseFont, textColor: textColor) let (titleLayout, titleApply) = makeTextLayout(TextNodeLayoutArguments(attributedString: string, backgroundColor: nil, maximumNumberOfLines: 0, truncationType: .end, constrainedSize: CGSize(width: params.width - leftInset * 2.0, height: CGFloat.greatestFiniteMagnitude), alignment: .natural, cutout: nil, insets: UIEdgeInsets())) @@ -357,7 +352,7 @@ class ItemListMultilineTextItemNode: ListViewItemNode { switch gesture { case .tap, .longTap: if let item = self.item, let linkItem = self.linkItemAtPoint(location) { - item.linkItemAction?(gesture == .tap ? .tap : .longTap, linkItem) + item.linkItemAction?(linkItem) } default: break @@ -368,18 +363,10 @@ class ItemListMultilineTextItemNode: ListViewItemNode { } } - private func linkItemAtPoint(_ point: CGPoint) -> TextLinkItem? { + private func linkItemAtPoint(_ point: CGPoint) -> String? { let textNodeFrame = self.textNode.frame if let (_, attributes) = self.textNode.attributesAtPoint(CGPoint(x: point.x - textNodeFrame.minX, y: point.y - textNodeFrame.minY)) { - if let url = attributes[NSAttributedString.Key(rawValue: TelegramTextAttributes.URL)] as? String { - return .url(url) - } else if let peerName = attributes[NSAttributedString.Key(rawValue: TelegramTextAttributes.PeerTextMention)] as? String { - return .mention(peerName) - } else if let hashtag = attributes[NSAttributedString.Key(rawValue: TelegramTextAttributes.Hashtag)] as? TelegramHashtag { - return .hashtag(hashtag.peerName, hashtag.hashtag) - } else { - return nil - } + return nil } return nil } @@ -395,11 +382,6 @@ class ItemListMultilineTextItemNode: ListViewItemNode { let textNodeFrame = self.textNode.frame if let (index, attributes) = self.textNode.attributesAtPoint(CGPoint(x: point.x - textNodeFrame.minX, y: point.y - textNodeFrame.minY)) { let possibleNames: [String] = [ - TelegramTextAttributes.URL, - TelegramTextAttributes.PeerMention, - TelegramTextAttributes.PeerTextMention, - TelegramTextAttributes.BotCommand, - TelegramTextAttributes.Hashtag ] for name in possibleNames { if let _ = attributes[NSAttributedString.Key(rawValue: name)] { diff --git a/submodules/WalletUI/Sources/ItemList/Items/ItemListTextItem.swift b/submodules/WalletUI/Sources/ItemList/Items/ItemListTextItem.swift index 058c960cf8..82cfe59bef 100644 --- a/submodules/WalletUI/Sources/ItemList/Items/ItemListTextItem.swift +++ b/submodules/WalletUI/Sources/ItemList/Items/ItemListTextItem.swift @@ -3,7 +3,7 @@ import UIKit import Display import AsyncDisplayKit import SwiftSignalKit -import TextFormat +import Markdown enum ItemListTextItemText { case plain(String) @@ -114,7 +114,7 @@ class ItemListTextItemNode: ListViewItemNode { attributedText = NSAttributedString(string: text, font: titleFont, textColor: item.theme.list.freeTextColor) case let .markdown(text): attributedText = parseMarkdownIntoAttributedString(text, attributes: MarkdownAttributes(body: MarkdownAttributeSet(font: titleFont, textColor: item.theme.list.freeTextColor), bold: MarkdownAttributeSet(font: titleBoldFont, textColor: item.theme.list.freeTextColor), link: MarkdownAttributeSet(font: titleFont, textColor: item.theme.list.itemAccentColor), linkAttribute: { contents in - return (TelegramTextAttributes.URL, contents) + return ("URL", contents) })) } let (titleLayout, titleApply) = makeTitleLayout(TextNodeLayoutArguments(attributedString: attributedText, backgroundColor: nil, maximumNumberOfLines: 0, truncationType: .end, constrainedSize: CGSize(width: params.width - params.rightInset - leftInset * 2.0, height: CGFloat.greatestFiniteMagnitude), alignment: .natural, cutout: nil, insets: UIEdgeInsets())) @@ -160,7 +160,7 @@ class ItemListTextItemNode: ListViewItemNode { let titleFrame = self.titleNode.frame if let item = self.item, titleFrame.contains(location) { if let (_, attributes) = self.titleNode.attributesAtPoint(CGPoint(x: location.x - titleFrame.minX, y: location.y - titleFrame.minY)) { - if let url = attributes[NSAttributedString.Key(rawValue: TelegramTextAttributes.URL)] as? String { + if let url = attributes[NSAttributedString.Key(rawValue: "URL")] as? String { item.linkAction?(.tap(url)) } } diff --git a/submodules/WalletUI/Sources/ToastNode.swift b/submodules/WalletUI/Sources/ToastNode.swift index e69de29bb2..8ca7d38cfd 100644 --- a/submodules/WalletUI/Sources/ToastNode.swift +++ b/submodules/WalletUI/Sources/ToastNode.swift @@ -0,0 +1,78 @@ +import Foundation +import UIKit +import Display +import AsyncDisplayKit +import AnimatedStickerNode + +final class ToastNode: ASDisplayNode { + private let backgroundNode: ASDisplayNode + private let effectView: UIView + private let animationNode: AnimatedStickerNode + private let textNode: ImmediateTextNode + + init(theme: WalletTheme, animationPath: String, text: String) { + self.backgroundNode = ASDisplayNode() + self.backgroundNode.cornerRadius = 9.0 + self.backgroundNode.clipsToBounds = true + if case .dark = theme.keyboardAppearance { + self.backgroundNode.backgroundColor = theme.navigationBar.backgroundColor + } else { + self.backgroundNode.backgroundColor = .clear + } + + self.effectView = UIVisualEffectView(effect: UIBlurEffect(style: .dark)) + self.backgroundNode.view.addSubview(self.effectView) + + self.animationNode = AnimatedStickerNode() + self.animationNode.visibility = true + self.animationNode.setup(source: AnimatedStickerNodeLocalFileSource(path: animationPath), width: 100, height: 100, playbackMode: .once, mode: .direct) + + self.textNode = ImmediateTextNode() + self.textNode.displaysAsynchronously = false + self.textNode.attributedText = NSAttributedString(string: text, font: Font.regular(14.0), textColor: .white) + self.textNode.maximumNumberOfLines = 2 + + super.init() + + self.addSubnode(self.backgroundNode) + self.addSubnode(self.animationNode) + self.addSubnode(self.textNode) + } + + func update(layout: ContainerViewLayout, transition: ContainedViewLayoutTransition) { + let contentSideInset: CGFloat = 10.0 + let contentVerticalInset: CGFloat = 8.0 + let iconSpacing: CGFloat = 4.0 + + let textSize = self.textNode.updateLayout(CGSize(width: layout.size.width - contentSideInset * 2.0, height: .greatestFiniteMagnitude)) + let iconSize = CGSize(width: 32.0, height: 32.0) + + let contentSize = CGSize(width: iconSize.width + iconSpacing + textSize.width, height: max(iconSize.height, textSize.height)) + + let insets = layout.insets(options: .input) + let contentOriginX = floor((layout.size.width - contentSize.width) / 2.0) + let contentOriginY = insets.top + floor((layout.size.height - insets.top - insets.bottom - contentSize.height) / 2.0) + + let iconFrame = CGRect(origin: CGPoint(x: contentOriginX, y: contentOriginY + floor((contentSize.height - iconSize.height) / 2.0)), size: iconSize) + transition.updateFrame(node: self.animationNode, frame: iconFrame) + self.animationNode.updateLayout(size: iconFrame.size) + + let textFrame = CGRect(origin: CGPoint(x: iconFrame.maxX + iconSpacing, y: contentOriginY + floor((contentSize.height - textSize.height) / 2.0)), size: textSize) + transition.updateFrame(node: self.textNode, frame: textFrame) + + let backgroundFrame = CGRect(origin: CGPoint(x: contentOriginX - contentSideInset, y: contentOriginY - contentVerticalInset), size: CGSize(width: contentSize.width + contentSideInset * 2.0, height: contentSize.height + contentVerticalInset * 2.0)) + transition.updateFrame(node: self.backgroundNode, frame: backgroundFrame) + transition.updateFrame(view: self.effectView, frame: CGRect(origin: CGPoint(), size: backgroundFrame.size)) + } + + override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { + return nil + } + + func show(removed: @escaping () -> Void) { + self.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2) + self.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, delay: 3.0, removeOnCompletion: false, completion: { _ in + removed() + }) + } +} diff --git a/submodules/WalletUI/Sources/WalletConfiguration.swift b/submodules/WalletUI/Sources/WalletConfiguration.swift index 707a740cb5..0190db028d 100644 --- a/submodules/WalletUI/Sources/WalletConfiguration.swift +++ b/submodules/WalletUI/Sources/WalletConfiguration.swift @@ -1,8 +1,7 @@ import Foundation -import TelegramCore public struct WalletConfiguration { - static var defaultValue: WalletConfiguration { + public static var defaultValue: WalletConfiguration { return WalletConfiguration(config: nil, blockchainName: nil, disableProxy: false) } @@ -10,23 +9,9 @@ public struct WalletConfiguration { public let blockchainName: String? public let disableProxy: Bool - fileprivate init(config: String?, blockchainName: String?, disableProxy: Bool) { + public init(config: String?, blockchainName: String?, disableProxy: Bool) { self.config = config self.blockchainName = blockchainName self.disableProxy = disableProxy } - - public static func with(appConfiguration: AppConfiguration) -> WalletConfiguration { - if let data = appConfiguration.data, let config = data["wallet_config"] as? String, let blockchainName = data["wallet_blockchain_name"] as? String { - var disableProxy = false - if let value = data["wallet_disable_proxy"] as? String { - disableProxy = value != "0" - } else if let value = data["wallet_disable_proxy"] as? Int { - disableProxy = value != 0 - } - return WalletConfiguration(config: config, blockchainName: blockchainName, disableProxy: disableProxy) - } else { - return .defaultValue - } - } } diff --git a/submodules/WalletUI/Sources/WalletContext.swift b/submodules/WalletUI/Sources/WalletContext.swift index 5e280e040e..caed3f475c 100644 --- a/submodules/WalletUI/Sources/WalletContext.swift +++ b/submodules/WalletUI/Sources/WalletContext.swift @@ -1,18 +1,22 @@ import Foundation import UIKit -import Postbox -import TelegramCore import SwiftSignalKit +import WalletCore + +public enum WalletContextGetServerSaltError { + case generic +} public protocol WalletContext { - var postbox: Postbox { get } - var network: Network { get } + var storage: WalletStorageInterface { get } var tonInstance: TonInstance { get } var keychain: TonKeychain { get } var presentationData: WalletPresentationData { get } var inForeground: Signal { get } + func getServerSalt() -> Signal + func presentNativeController(_ controller: UIViewController) func idleTimerExtension() -> Disposable diff --git a/submodules/WalletUI/Sources/WalletCreateInvoiceScreen.swift b/submodules/WalletUI/Sources/WalletCreateInvoiceScreen.swift index 48fc296ef9..248e90b42a 100644 --- a/submodules/WalletUI/Sources/WalletCreateInvoiceScreen.swift +++ b/submodules/WalletUI/Sources/WalletCreateInvoiceScreen.swift @@ -3,8 +3,6 @@ import UIKit import AppBundle import AsyncDisplayKit import Display -import Postbox -import TelegramCore import SwiftSignalKit import OverlayStatusController @@ -237,7 +235,7 @@ private enum WalletCreateInvoiceScreenEntry: ItemListNodeEntry { case let .addressHeader(theme, text): return ItemListSectionHeaderItem(theme: theme, text: text, sectionId: self.section) case let .address(theme, text, monospace): - return ItemListMultilineTextItem(theme: theme, text: text, enabledEntityTypes: [], font: monospace ? .monospace : .default, sectionId: self.section, style: .blocks) + return ItemListMultilineTextItem(theme: theme, text: text, font: monospace ? .monospace : .default, sectionId: self.section, style: .blocks) case let .copyAddress(theme, text): return ItemListActionItem(theme: theme, title: text, kind: .generic, alignment: .natural, sectionId: self.section, style: .blocks, action: { arguments.copyAddress() diff --git a/submodules/WalletUI/Sources/WalletInfoEmptyNode.swift b/submodules/WalletUI/Sources/WalletInfoEmptyNode.swift index 4636214a91..e53540b078 100644 --- a/submodules/WalletUI/Sources/WalletInfoEmptyNode.swift +++ b/submodules/WalletUI/Sources/WalletInfoEmptyNode.swift @@ -2,8 +2,7 @@ import Foundation import UIKit import Display import AsyncDisplayKit -import TelegramCore -import AnimationUI +import AnimatedStickerNode import SwiftSignalKit import AppBundle @@ -68,7 +67,7 @@ final class WalletInfoEmptyItemNode: ListViewItemNode { self.animationNode = AnimatedStickerNode() if let path = getAppBundle().path(forResource: "WalletEmpty", ofType: "tgs") { - self.animationNode.setup(resource: .localFile(path), width: 280, height: 280, playbackMode: .once, mode: .direct) + self.animationNode.setup(source: AnimatedStickerNodeLocalFileSource(path: path), width: 280, height: 280, playbackMode: .once, mode: .direct) self.animationNode.visibility = true } diff --git a/submodules/WalletUI/Sources/WalletInfoScreen.swift b/submodules/WalletUI/Sources/WalletInfoScreen.swift index d2d74d4310..8426eeea1d 100644 --- a/submodules/WalletUI/Sources/WalletInfoScreen.swift +++ b/submodules/WalletUI/Sources/WalletInfoScreen.swift @@ -3,12 +3,11 @@ import UIKit import AppBundle import AsyncDisplayKit import Display -import Postbox -import TelegramCore import SolidRoundedButtonNode import SwiftSignalKit import MergeLists -import AnimationUI +import AnimatedStickerNode +import WalletCore public final class WalletInfoScreen: ViewController { private let context: WalletContext @@ -69,7 +68,9 @@ public final class WalletInfoScreen: ViewController { guard let strongSelf = self, let walletInfo = strongSelf.walletInfo else { return } - strongSelf.push(walletSendScreen(context: strongSelf.context, randomId: arc4random64(), walletInfo: walletInfo)) + var randomId: Int64 = 0 + arc4random_buf(&randomId, 8) + strongSelf.push(walletSendScreen(context: strongSelf.context, randomId: randomId, walletInfo: walletInfo)) }, receiveAction: { [weak self] in guard let strongSelf = self, let walletInfo = strongSelf.walletInfo else { return @@ -140,7 +141,7 @@ private final class WalletInfoBalanceNode: ASDisplayNode { self.balanceIconNode = AnimatedStickerNode() if let path = getAppBundle().path(forResource: "WalletIntroStatic", ofType: "tgs") { - self.balanceIconNode.setup(resource: .localFile(path), width: 120, height: 120, mode: .direct) + self.balanceIconNode.setup(source: AnimatedStickerNodeLocalFileSource(path: path), width: 120, height: 120, mode: .direct) self.balanceIconNode.visibility = true } @@ -606,12 +607,12 @@ private final class WalletInfoScreenNode: ViewControllerTracingNode { if let walletInfo = walletInfo { subject = .wallet(walletInfo) - self.watchCombinedStateDisposable = (context.postbox.preferencesView(keys: [PreferencesKeys.walletCollection]) - |> deliverOnMainQueue).start(next: { [weak self] view in - guard let strongSelf = self, let wallets = view.values[PreferencesKeys.walletCollection] as? WalletCollection else { + self.watchCombinedStateDisposable = (context.storage.watchWalletRecords() + |> deliverOnMainQueue).start(next: { [weak self] records in + guard let strongSelf = self else { return } - for wallet in wallets.wallets { + for wallet in records { if wallet.info.publicKey == walletInfo.publicKey { if let state = wallet.state { if state.pendingTransactions != strongSelf.combinedState?.pendingTransactions || state.timestamp != strongSelf.combinedState?.timestamp { @@ -628,7 +629,7 @@ private final class WalletInfoScreenNode: ViewControllerTracingNode { subject = .address(address) } let pollCombinedState: Signal = ( - getCombinedWalletState(postbox: context.postbox, subject: subject, tonInstance: context.tonInstance) + getCombinedWalletState(storage: context.storage, subject: subject, tonInstance: context.tonInstance) |> ignoreValues |> `catch` { _ -> Signal in return .complete() @@ -735,7 +736,7 @@ private final class WalletInfoScreenNode: ViewControllerTracingNode { subject = .address(self.address) } - self.stateDisposable.set((getCombinedWalletState(postbox: self.context.postbox, subject: subject, tonInstance: self.context.tonInstance) + self.stateDisposable.set((getCombinedWalletState(storage: self.context.storage, subject: subject, tonInstance: self.context.tonInstance) |> deliverOnMainQueue).start(next: { [weak self] value in guard let strongSelf = self else { return diff --git a/submodules/WalletUI/Sources/WalletInfoTransactionItem.swift b/submodules/WalletUI/Sources/WalletInfoTransactionItem.swift index ec59ffaa74..2dcf846c7a 100644 --- a/submodules/WalletUI/Sources/WalletInfoTransactionItem.swift +++ b/submodules/WalletUI/Sources/WalletInfoTransactionItem.swift @@ -3,7 +3,6 @@ import UIKit import Display import AsyncDisplayKit import SwiftSignalKit -import TelegramCore private let transactionIcon = UIImage(bundleImageName: "Wallet/TransactionGem")?.precomposed() diff --git a/submodules/WalletUI/Sources/WalletPasscodeScreen.swift b/submodules/WalletUI/Sources/WalletPasscodeScreen.swift index a288cd0178..5be1703679 100644 --- a/submodules/WalletUI/Sources/WalletPasscodeScreen.swift +++ b/submodules/WalletUI/Sources/WalletPasscodeScreen.swift @@ -3,8 +3,6 @@ import UIKit import AppBundle import AsyncDisplayKit import Display -import Postbox -import TelegramCore import AnimationUI import SwiftSignalKit import OverlayStatusController diff --git a/submodules/WalletUI/Sources/WalletQrScanScreen.swift b/submodules/WalletUI/Sources/WalletQrScanScreen.swift index 30e2d8f88f..c2a8c72e2d 100644 --- a/submodules/WalletUI/Sources/WalletQrScanScreen.swift +++ b/submodules/WalletUI/Sources/WalletQrScanScreen.swift @@ -4,12 +4,11 @@ import AppBundle import AsyncDisplayKit import Display import SwiftSignalKit -import TelegramCore import Camera import GlassButtonNode -import UrlHandling import CoreImage import AlertUI +import WalletUrl private func generateFrameImage() -> UIImage? { return generateImage(CGSize(width: 64.0, height: 64.0), contextGenerator: { size, context in diff --git a/submodules/WalletUI/Sources/WalletQrViewScreen.swift b/submodules/WalletUI/Sources/WalletQrViewScreen.swift index 543cab2298..b083a8b4ea 100644 --- a/submodules/WalletUI/Sources/WalletQrViewScreen.swift +++ b/submodules/WalletUI/Sources/WalletQrViewScreen.swift @@ -4,10 +4,8 @@ import SwiftSignalKit import AppBundle import AsyncDisplayKit import Display -import Postbox import QrCode -import ShareController -import AnimationUI +import AnimatedStickerNode func shareInvoiceQrCode(context: WalletContext, invoice: String) { let _ = (qrCode(string: invoice, color: .black, backgroundColor: .white, icon: .custom(UIImage(bundleImageName: "Wallet/QrGem"))) @@ -127,7 +125,7 @@ private final class WalletQrViewScreenNode: ViewControllerTracingNode { self.iconNode = AnimatedStickerNode() if let path = getAppBundle().path(forResource: "WalletIntroStatic", ofType: "tgs") { - self.iconNode.setup(resource: .localFile(path), width: 240, height: 240, mode: .direct) + self.iconNode.setup(source: AnimatedStickerNodeLocalFileSource(path: path), width: 240, height: 240, mode: .direct) self.iconNode.visibility = true } diff --git a/submodules/WalletUI/Sources/WalletReceiveScreen.swift b/submodules/WalletUI/Sources/WalletReceiveScreen.swift index fbc47c55e9..cbf03e1f31 100644 --- a/submodules/WalletUI/Sources/WalletReceiveScreen.swift +++ b/submodules/WalletUI/Sources/WalletReceiveScreen.swift @@ -3,11 +3,8 @@ import UIKit import AppBundle import AsyncDisplayKit import Display -import Postbox -import TelegramCore import SwiftSignalKit import OverlayStatusController -import ShareController private final class WalletReceiveScreenArguments { let context: WalletContext @@ -141,7 +138,7 @@ private enum WalletReceiveScreenEntry: ItemListNodeEntry { case let .addressHeader(theme, text): return ItemListSectionHeaderItem(theme: theme, text: text, sectionId: self.section) case let .address(theme, text, monospace): - return ItemListMultilineTextItem(theme: theme, text: text, enabledEntityTypes: [], font: monospace ? .monospace : .default, sectionId: self.section, style: .blocks) + return ItemListMultilineTextItem(theme: theme, text: text, font: monospace ? .monospace : .default, sectionId: self.section, style: .blocks) case let .copyAddress(theme, text): return ItemListActionItem(theme: theme, title: text, kind: .generic, alignment: .natural, sectionId: self.section, style: .blocks, action: { arguments.copyAddress() diff --git a/submodules/WalletUI/Sources/WalletSendScreen.swift b/submodules/WalletUI/Sources/WalletSendScreen.swift index 3883f7ac52..54f5510d2c 100644 --- a/submodules/WalletUI/Sources/WalletSendScreen.swift +++ b/submodules/WalletUI/Sources/WalletSendScreen.swift @@ -3,13 +3,12 @@ import UIKit import AppBundle import AsyncDisplayKit import Display -import Postbox -import TelegramCore import SwiftSignalKit import AlertUI -import TextFormat -import UrlHandling import OverlayStatusController +import WalletUrl +import WalletCore +import Markdown private let balanceIcon = UIImage(bundleImageName: "Wallet/TransactionGem")?.precomposed() @@ -281,7 +280,7 @@ public func walletSendScreen(context: WalletContext, randomId: Int64, walletInfo } let serverSaltValue = Promise() - serverSaltValue.set(getServerWalletSalt(network: context.network) + serverSaltValue.set(context.getServerSalt() |> map(Optional.init) |> `catch` { _ -> Signal in return .single(nil) @@ -419,8 +418,8 @@ public func walletSendScreen(context: WalletContext, randomId: Int64, walletInfo } }) - let walletState: Signal = getCombinedWalletState(postbox: context.postbox, subject: .wallet(walletInfo), tonInstance: context.tonInstance, onlyCached: true) - |> map { combinedState in + let walletState: Signal = getCombinedWalletState(storage: context.storage, subject: .wallet(walletInfo), tonInstance: context.tonInstance, onlyCached: true) + |> map { combinedState -> WalletState? in var state: WalletState? switch combinedState { case let .cached(combinedState): @@ -433,7 +432,7 @@ public func walletSendScreen(context: WalletContext, randomId: Int64, walletInfo |> `catch` { _ -> Signal in return .single(nil) |> then( - getCombinedWalletState(postbox: context.postbox, subject: .wallet(walletInfo), tonInstance: context.tonInstance, onlyCached: false) + getCombinedWalletState(storage: context.storage, subject: .wallet(walletInfo), tonInstance: context.tonInstance, onlyCached: false) |> map { combinedState -> WalletState? in var state: WalletState? switch combinedState { diff --git a/submodules/WalletUI/Sources/WalletSettingsScreen.swift b/submodules/WalletUI/Sources/WalletSettingsScreen.swift index 43ab4bd2f5..cc5edd862a 100644 --- a/submodules/WalletUI/Sources/WalletSettingsScreen.swift +++ b/submodules/WalletUI/Sources/WalletSettingsScreen.swift @@ -3,12 +3,10 @@ import UIKit import AppBundle import AsyncDisplayKit import Display -import Postbox -import TelegramCore import SolidRoundedButtonNode -import AnimationUI import SwiftSignalKit import OverlayStatusController +import WalletCore private final class WalletSettingsControllerArguments { let exportWallet: () -> Void @@ -104,7 +102,7 @@ public func walletSettingsController(context: WalletContext, walletInfo: WalletI presentControllerImpl?(controller, nil) let _ = (context.keychain.decrypt(walletInfo.encryptedSecret) |> deliverOnMainQueue).start(next: { [weak controller] decryptedSecret in - let _ = (getServerWalletSalt(network: context.network) + let _ = (context.getServerSalt() |> deliverOnMainQueue).start(next: { serverSalt in let _ = (walletRestoreWords(tonInstance: context.tonInstance, publicKey: walletInfo.publicKey, decryptedSecret: decryptedSecret, localPassword: serverSalt) |> deliverOnMainQueue).start(next: { [weak controller] wordList in @@ -128,7 +126,7 @@ public func walletSettingsController(context: WalletContext, walletInfo: WalletI actionSheet?.dismissAnimated() let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: nil)) presentControllerImpl?(controller, nil) - let _ = (deleteAllLocalWalletsData(postbox: context.postbox, network: context.network, tonInstance: context.tonInstance) + let _ = (deleteAllLocalWalletsData(storage: context.storage, tonInstance: context.tonInstance) |> deliverOnMainQueue).start(error: { [weak controller] _ in controller?.dismiss() }, completed: { [weak controller] in diff --git a/submodules/WalletUI/Sources/WalletSplashScreen.swift b/submodules/WalletUI/Sources/WalletSplashScreen.swift index e08a4e820f..7266ab037f 100644 --- a/submodules/WalletUI/Sources/WalletSplashScreen.swift +++ b/submodules/WalletUI/Sources/WalletSplashScreen.swift @@ -3,15 +3,14 @@ import UIKit import AppBundle import AsyncDisplayKit import Display -import Postbox -import TelegramCore import SolidRoundedButtonNode -import AnimationUI import SwiftSignalKit import OverlayStatusController import AlertUI -import TextFormat import LocalAuth +import AnimatedStickerNode +import WalletCore +import Markdown public enum WalletSecureStorageResetReason { case notAvailable @@ -51,7 +50,7 @@ public final class WalletSplashScreen: ViewController { self.walletCreatedPreloadState = walletCreatedPreloadState } else { self.walletCreatedPreloadState = Promise() - self.walletCreatedPreloadState?.set(getCombinedWalletState(postbox: context.postbox, subject: .wallet(walletInfo), tonInstance: context.tonInstance) + self.walletCreatedPreloadState?.set(getCombinedWalletState(storage: context.storage, subject: .wallet(walletInfo), tonInstance: context.tonInstance) |> map(Optional.init) |> `catch` { _ -> Signal in return .single(nil) @@ -62,7 +61,7 @@ public final class WalletSplashScreen: ViewController { self.walletCreatedPreloadState = walletCreatedPreloadState } else { self.walletCreatedPreloadState = Promise() - self.walletCreatedPreloadState?.set(getCombinedWalletState(postbox: context.postbox, subject: .wallet(walletInfo), tonInstance: context.tonInstance) + self.walletCreatedPreloadState?.set(getCombinedWalletState(storage: context.storage, subject: .wallet(walletInfo), tonInstance: context.tonInstance) |> map(Optional.init) |> `catch` { _ -> Signal in return .single(nil) @@ -131,7 +130,7 @@ public final class WalletSplashScreen: ViewController { } private func sendGrams(walletInfo: WalletInfo, decryptedSecret: Data, address: String, amount: Int64, textMessage: Data, forceIfDestinationNotInitialized: Bool, randomId: Int64, serverSalt: Data) { - let _ = (sendGramsFromWallet(postbox: self.context.postbox, network: self.context.network, tonInstance: self.context.tonInstance, walletInfo: walletInfo, decryptedSecret: decryptedSecret, localPassword: serverSalt, toAddress: address, amount: amount, textMessage: textMessage, forceIfDestinationNotInitialized: forceIfDestinationNotInitialized, timeout: 0, randomId: randomId) + let _ = (sendGramsFromWallet(storage: self.context.storage, tonInstance: self.context.tonInstance, walletInfo: walletInfo, decryptedSecret: decryptedSecret, localPassword: serverSalt, toAddress: address, amount: amount, textMessage: textMessage, forceIfDestinationNotInitialized: forceIfDestinationNotInitialized, timeout: 0, randomId: randomId) |> deliverOnMainQueue).start(error: { [weak self] error in guard let strongSelf = self else { return @@ -227,9 +226,9 @@ public final class WalletSplashScreen: ViewController { ], actionLayout: .vertical), in: .window(.root)) } strongSelf.present(controller, in: .window(.root)) - let _ = (getServerWalletSalt(network: strongSelf.context.network) + let _ = (strongSelf.context.getServerSalt() |> deliverOnMainQueue).start(next: { serverSalt in - let _ = (createWallet(postbox: strongSelf.context.postbox, tonInstance: strongSelf.context.tonInstance, keychain: strongSelf.context.keychain, localPassword: serverSalt) + let _ = (createWallet(storage: strongSelf.context.storage, tonInstance: strongSelf.context.tonInstance, keychain: strongSelf.context.keychain, localPassword: serverSalt) |> deliverOnMainQueue).start(next: { walletInfo, wordList in guard let strongSelf = self else { return @@ -252,7 +251,7 @@ public final class WalletSplashScreen: ViewController { let context = strongSelf.context let _ = (strongSelf.context.keychain.decrypt(walletInfo.encryptedSecret) |> deliverOnMainQueue).start(next: { [weak controller] decryptedSecret in - let _ = (getServerWalletSalt(network: context.network) + let _ = (context.getServerSalt() |> deliverOnMainQueue).start(next: { [weak controller] serverSalt in let _ = (walletRestoreWords(tonInstance: context.tonInstance, publicKey: walletInfo.publicKey, decryptedSecret: decryptedSecret, localPassword: serverSalt) |> deliverOnMainQueue).start(next: { wordList in @@ -539,7 +538,7 @@ private final class WalletSplashScreenNode: ViewControllerTracingNode { termsText = parseMarkdownIntoAttributedString(self.presentationData.strings.Wallet_Intro_Terms, attributes: MarkdownAttributes(body: body, bold: body, link: link, linkAttribute: { _ in nil }), textAlignment: .center) self.iconNode.image = nil if let path = getAppBundle().path(forResource: "WalletIntroLoading", ofType: "tgs") { - self.animationNode.setup(resource: .localFile(path), width: 248, height: 248, mode: .direct) + self.animationNode.setup(source: AnimatedStickerNodeLocalFileSource(path: path), width: 248, height: 248, mode: .direct) self.animationSize = CGSize(width: 124.0, height: 124.0) self.animationNode.visibility = true } @@ -551,7 +550,7 @@ private final class WalletSplashScreenNode: ViewControllerTracingNode { termsText = NSAttributedString(string: "") self.iconNode.image = nil if let path = getAppBundle().path(forResource: "WalletCreated", ofType: "tgs") { - self.animationNode.setup(resource: .localFile(path), width: 250, height: 250, playbackMode: .once, mode: .direct) + self.animationNode.setup(source: AnimatedStickerNodeLocalFileSource(path: path), width: 250, height: 250, playbackMode: .once, mode: .direct) self.animationSize = CGSize(width: 125.0, height: 125.0) self.animationNode.visibility = true } @@ -563,7 +562,7 @@ private final class WalletSplashScreenNode: ViewControllerTracingNode { termsText = NSAttributedString(string: "") self.iconNode.image = nil if let path = getAppBundle().path(forResource: "WalletDone", ofType: "tgs") { - self.animationNode.setup(resource: .localFile(path), width: 260, height: 260, playbackMode: .once, mode: .direct) + self.animationNode.setup(source: AnimatedStickerNodeLocalFileSource(path: path), width: 260, height: 260, playbackMode: .once, mode: .direct) self.animationSize = CGSize(width: 130.0, height: 130.0) self.animationNode.visibility = true } @@ -575,7 +574,7 @@ private final class WalletSplashScreenNode: ViewControllerTracingNode { termsText = NSAttributedString(string: "") self.iconNode.image = nil if let path = getAppBundle().path(forResource: "WalletNotAvailable", ofType: "tgs") { - self.animationNode.setup(resource: .localFile(path), width: 260, height: 260, playbackMode: .once, mode: .direct) + self.animationNode.setup(source: AnimatedStickerNodeLocalFileSource(path: path), width: 260, height: 260, playbackMode: .once, mode: .direct) self.animationSize = CGSize(width: 130.0, height: 130.0) self.animationNode.visibility = true } @@ -587,7 +586,7 @@ private final class WalletSplashScreenNode: ViewControllerTracingNode { termsText = NSAttributedString(string: "") self.iconNode.image = nil if let path = getAppBundle().path(forResource: "SendingGrams", ofType: "tgs") { - self.animationNode.setup(resource: .localFile(path), width: 260, height: 260, mode: .direct) + self.animationNode.setup(source: AnimatedStickerNodeLocalFileSource(path: path), width: 260, height: 260, mode: .direct) self.animationSize = CGSize(width: 130.0, height: 130.0) self.animationNode.visibility = true } @@ -601,7 +600,7 @@ private final class WalletSplashScreenNode: ViewControllerTracingNode { termsText = NSAttributedString(string: "") self.iconNode.image = nil if let path = getAppBundle().path(forResource: "WalletDone", ofType: "tgs") { - self.animationNode.setup(resource: .localFile(path), width: 260, height: 260, playbackMode: .once, mode: .direct) + self.animationNode.setup(source: AnimatedStickerNodeLocalFileSource(path: path), width: 260, height: 260, playbackMode: .once, mode: .direct) self.animationSize = CGSize(width: 130.0, height: 130.0) self.animationNode.visibility = true } @@ -613,7 +612,7 @@ private final class WalletSplashScreenNode: ViewControllerTracingNode { termsText = NSAttributedString(string: "") self.iconNode.image = nil if let path = getAppBundle().path(forResource: "WalletKeyLock", ofType: "tgs") { - self.animationNode.setup(resource: .localFile(path), width: 280, height: 280, playbackMode: .once, mode: .direct) + self.animationNode.setup(source: AnimatedStickerNodeLocalFileSource(path: path), width: 280, height: 280, playbackMode: .once, mode: .direct) self.animationSize = CGSize(width: 140.0, height: 140.0) self.animationNode.visibility = true } @@ -658,7 +657,7 @@ private final class WalletSplashScreenNode: ViewControllerTracingNode { termsText = NSAttributedString(string: "") self.iconNode.image = nil if let path = getAppBundle().path(forResource: "WalletNotAvailable", ofType: "tgs") { - self.animationNode.setup(resource: .localFile(path), width: 260, height: 260, playbackMode: .once, mode: .direct) + self.animationNode.setup(source: AnimatedStickerNodeLocalFileSource(path: path), width: 260, height: 260, playbackMode: .once, mode: .direct) self.animationSize = CGSize(width: 130.0, height: 130.0) self.animationNode.visibility = true } diff --git a/submodules/WalletUI/Sources/WalletStrings.swift b/submodules/WalletUI/Sources/WalletStrings.swift index 8e476626cd..c8ffa7e9bf 100644 --- a/submodules/WalletUI/Sources/WalletStrings.swift +++ b/submodules/WalletUI/Sources/WalletStrings.swift @@ -414,12 +414,12 @@ public final class WalletStrings: Equatable { public var Wallet_Info_RefreshErrorText: String { return self._s[188]! } public var Wallet_SecureStorageReset_Title: String { return self._s[189]! } public var Wallet_Receive_CommentHeader: String { return self._s[190]! } - public func Wallet_Updated_HoursAgo(_ value: Int32) -> String { + public func Wallet_Updated_MinutesAgo(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = walletStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[0 * 6 + Int(form.rawValue)]!, stringValue) } - public func Wallet_Updated_MinutesAgo(_ value: Int32) -> String { + public func Wallet_Updated_HoursAgo(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = walletStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[1 * 6 + Int(form.rawValue)]!, stringValue) diff --git a/submodules/WalletUI/Sources/WalletTransactionInfoScreen.swift b/submodules/WalletUI/Sources/WalletTransactionInfoScreen.swift index 47fac86e61..6a836f01e1 100644 --- a/submodules/WalletUI/Sources/WalletTransactionInfoScreen.swift +++ b/submodules/WalletUI/Sources/WalletTransactionInfoScreen.swift @@ -3,12 +3,10 @@ import UIKit import AppBundle import AsyncDisplayKit import Display -import Postbox -import TelegramCore import SolidRoundedButtonNode -import AnimationUI import SwiftSignalKit import OverlayStatusController +import WalletCore private func stringForFullDate(timestamp: Int32, strings: WalletStrings, dateTimeFormat: WalletPresentationDateTimeFormat) -> String { var t: time_t = Int(timestamp) @@ -153,7 +151,7 @@ private enum WalletTransactionInfoEntry: ItemListNodeEntry { case let .infoHeader(theme, text): return ItemListSectionHeaderItem(theme: theme, text: text, sectionId: self.section) case let .infoAddress(theme, text, address): - return ItemListMultilineTextItem(theme: theme, text: text, enabledEntityTypes: [], font: .monospace, sectionId: self.section, style: .blocks, longTapAction: address == nil ? nil : { + return ItemListMultilineTextItem(theme: theme, text: text, font: .monospace, sectionId: self.section, style: .blocks, longTapAction: address == nil ? nil : { if let address = address { arguments.displayContextMenu(WalletTransactionInfoEntryTag.address, address) } @@ -169,7 +167,7 @@ private enum WalletTransactionInfoEntry: ItemListNodeEntry { case let .storageFeeHeader(theme, text): return ItemListSectionHeaderItem(theme: theme, text: text, sectionId: self.section) case let .storageFee(theme, text): - return ItemListMultilineTextItem(theme: theme, text: text, enabledEntityTypes: [], sectionId: self.section, style: .blocks, longTapAction: nil, tag: nil) + return ItemListMultilineTextItem(theme: theme, text: text, sectionId: self.section, style: .blocks, longTapAction: nil, tag: nil) case let .storageFeeInfo(theme, text): return ItemListTextItem(theme: theme, text: .markdown(text), sectionId: self.section, linkAction: { action in switch action { @@ -180,7 +178,7 @@ private enum WalletTransactionInfoEntry: ItemListNodeEntry { case let .otherFeeHeader(theme, text): return ItemListSectionHeaderItem(theme: theme, text: text, sectionId: self.section) case let .otherFee(theme, text): - return ItemListMultilineTextItem(theme: theme, text: text, enabledEntityTypes: [], sectionId: self.section, style: .blocks, longTapAction: nil, tag: nil) + return ItemListMultilineTextItem(theme: theme, text: text, sectionId: self.section, style: .blocks, longTapAction: nil, tag: nil) case let .otherFeeInfo(theme, text): return ItemListTextItem(theme: theme, text: .markdown(text), sectionId: self.section, linkAction: { action in switch action { @@ -191,7 +189,7 @@ private enum WalletTransactionInfoEntry: ItemListNodeEntry { case let .commentHeader(theme, text): return ItemListSectionHeaderItem(theme: theme, text: text, sectionId: self.section) case let .comment(theme, text): - return ItemListMultilineTextItem(theme: theme, text: text, enabledEntityTypes: [], sectionId: self.section, style: .blocks, longTapAction: { + return ItemListMultilineTextItem(theme: theme, text: text, sectionId: self.section, style: .blocks, longTapAction: { arguments.displayContextMenu(WalletTransactionInfoEntryTag.comment, text) }, tag: WalletTransactionInfoEntryTag.comment) } @@ -347,7 +345,9 @@ func walletTransactionInfoController(context: WalletContext, walletInfo: WalletI let address = extractAddress(walletTransaction) if case let .list(addresses) = address, let address = addresses.first { dismissImpl?() - pushImpl?(walletSendScreen(context: context, randomId: arc4random64(), walletInfo: walletInfo, address: address)) + var randomId: Int64 = 0 + arc4random_buf(&randomId, 8) + pushImpl?(walletSendScreen(context: context, randomId: randomId, walletInfo: walletInfo, address: address)) } }, displayContextMenu: { tag, text in displayContextMenuImpl?(tag, text) diff --git a/submodules/WalletUI/Sources/WalletUtils.swift b/submodules/WalletUI/Sources/WalletUtils.swift index f9ceebd325..2be5d60849 100644 --- a/submodules/WalletUI/Sources/WalletUtils.swift +++ b/submodules/WalletUI/Sources/WalletUtils.swift @@ -2,7 +2,7 @@ import Foundation import UrlEscaping let walletAddressLength: Int = 48 -let walletTextLimit: Int = 1024 +let walletTextLimit: Int = 512 func formatAddress(_ address: String) -> String { var address = address diff --git a/submodules/WalletUI/Sources/WalletWordCheckScreen.swift b/submodules/WalletUI/Sources/WalletWordCheckScreen.swift index 4d28ad4794..282f0e2fcb 100644 --- a/submodules/WalletUI/Sources/WalletWordCheckScreen.swift +++ b/submodules/WalletUI/Sources/WalletWordCheckScreen.swift @@ -3,14 +3,12 @@ import UIKit import AppBundle import AsyncDisplayKit import Display -import Postbox -import TelegramCore import SolidRoundedButtonNode -import UndoUI import AlertUI import SwiftSignalKit -import TextFormat -import AnimationUI +import AnimatedStickerNode +import WalletCore +import Markdown private let possibleWordList: [String] = [ "abandon", @@ -2138,7 +2136,7 @@ public final class WalletWordCheckScreen: ViewController { } return true } - let _ = confirmWalletExported(postbox: strongSelf.context.postbox, walletInfo: walletInfo).start() + let _ = confirmWalletExported(storage: strongSelf.context.storage, publicKey: walletInfo.publicKey).start() controllers.append(WalletSplashScreen(context: strongSelf.context, mode: .success(walletInfo), walletCreatedPreloadState: strongSelf.walletCreatedPreloadState)) strongSelf.view.endEditing(true) navigationController.setViewControllers(controllers, animated: true) @@ -2186,9 +2184,9 @@ public final class WalletWordCheckScreen: ViewController { ], actionLayout: .vertical), in: .window(.root)) } - let _ = (getServerWalletSalt(network: strongSelf.context.network) + let _ = (strongSelf.context.getServerSalt() |> deliverOnMainQueue).start(next: { serverSalt in - let _ = (importWallet(postbox: strongSelf.context.postbox, tonInstance: strongSelf.context.tonInstance, keychain: strongSelf.context.keychain, wordList: enteredWords, localPassword: serverSalt) + let _ = (importWallet(storage: strongSelf.context.storage, tonInstance: strongSelf.context.tonInstance, keychain: strongSelf.context.keychain, wordList: enteredWords, localPassword: serverSalt) |> deliverOnMainQueue).start(next: { walletInfo in guard let strongSelf = self else { return @@ -2624,7 +2622,7 @@ private final class WalletWordCheckScreenNode: ViewControllerTracingNode, UIScro buttonText = self.presentationData.strings.Wallet_WordCheck_Continue secondaryActionText = "" if let path = getAppBundle().path(forResource: "WalletWordCheck", ofType: "tgs") { - self.animationNode.setup(resource: .localFile(path), width: 238, height: 238, playbackMode: .once, mode: .direct) + self.animationNode.setup(source: AnimatedStickerNodeLocalFileSource(path: path), width: 238, height: 238, playbackMode: .once, mode: .direct) self.animationNode.visibility = true } case .import: diff --git a/submodules/WalletUI/Sources/WalletWordDisplayScreen.swift b/submodules/WalletUI/Sources/WalletWordDisplayScreen.swift index fdac4921bf..2c4d4b68be 100644 --- a/submodules/WalletUI/Sources/WalletWordDisplayScreen.swift +++ b/submodules/WalletUI/Sources/WalletWordDisplayScreen.swift @@ -4,12 +4,10 @@ import AppBundle import SwiftSignalKit import AsyncDisplayKit import Display -import Postbox -import TelegramCore import SolidRoundedButtonNode -import UndoUI import AlertUI -import AnimationUI +import AnimatedStickerNode +import WalletCore public enum WalletWordDisplayScreenMode { case check @@ -79,7 +77,7 @@ public final class WalletWordDisplayScreen: ViewController { let deltaTime = Date().timeIntervalSince1970 - strongSelf.startTime let minimalTimeout: Double #if DEBUG - minimalTimeout = 1.0 + minimalTimeout = 60.0 #else minimalTimeout = 60.0 #endif @@ -88,10 +86,7 @@ public final class WalletWordDisplayScreen: ViewController { guard let strongSelf = self else { return } - if let path = getAppBundle().path(forResource: "thumbsup", ofType: "tgs") { - let controller = UndoOverlayController(presentationData: strongSelf.presentationData, content: UndoOverlayContent.emoji(path: path, text: strongSelf.presentationData.strings.Wallet_Words_NotDoneResponse), elevatedLayout: false, animateInAsReplacement: false, action: { _ in }) - strongSelf.present(controller, in: .current) - } + (strongSelf.displayNode as! WalletWordDisplayScreenNode).displayToast() })]), in: .window(.root)) } else { var wordIndices: [Int] = [] @@ -131,6 +126,9 @@ private final class WalletWordDisplayScreenNode: ViewControllerTracingNode, UISc private let wordNodes: [(ImmediateTextNode, ImmediateTextNode, ImmediateTextNode)] private let buttonNode: SolidRoundedButtonNode + private var toastNode: ToastNode? + + private var validLayout: (ContainerViewLayout, CGFloat)? private var navigationHeight: CGFloat? init(presentationData: WalletPresentationData, wordList: [String], action: @escaping () -> Void) { @@ -148,7 +146,7 @@ private final class WalletWordDisplayScreenNode: ViewControllerTracingNode, UISc self.animationNode = AnimatedStickerNode() if let path = getAppBundle().path(forResource: "WalletWordList", ofType: "tgs") { - self.animationNode.setup(resource: .localFile(path), width: 264, height: 264, playbackMode: .once, mode: .direct) + self.animationNode.setup(source: AnimatedStickerNodeLocalFileSource(path: path), width: 264, height: 264, playbackMode: .once, mode: .direct) self.animationNode.visibility = true } @@ -283,6 +281,7 @@ private final class WalletWordDisplayScreenNode: ViewControllerTracingNode, UISc } func containerLayoutUpdated(layout: ContainerViewLayout, navigationHeight: CGFloat, transition: ContainedViewLayoutTransition) { + self.validLayout = (layout, navigationHeight) self.navigationHeight = navigationHeight let sideInset: CGFloat = 32.0 @@ -385,4 +384,28 @@ private final class WalletWordDisplayScreenNode: ViewControllerTracingNode, UISc self.updateTitle() } + + func displayToast() { + if self.toastNode != nil { + return + } + + if let path = getAppBundle().path(forResource: "WalletApologiesAccepted", ofType: "tgs") { + let toastNode = ToastNode(theme: self.presentationData.theme, animationPath: path, text: self.presentationData.strings.Wallet_Words_NotDoneResponse) + self.toastNode = toastNode + if let (layout, navigationHeight) = self.validLayout { + toastNode.update(layout: layout, transition: .immediate) + } + self.addSubnode(toastNode) + toastNode.show(removed: { [weak self, weak toastNode] in + guard let strongSelf = self, let toastNode = toastNode else { + return + } + toastNode.removeFromSupernode() + if toastNode === strongSelf.toastNode { + strongSelf.toastNode = nil + } + }) + } + } } diff --git a/submodules/WalletUrl/BUCK b/submodules/WalletUrl/BUCK new file mode 100644 index 0000000000..f7042f93d4 --- /dev/null +++ b/submodules/WalletUrl/BUCK @@ -0,0 +1,14 @@ +load("//Config:buck_rule_macros.bzl", "static_library") + +static_library( + name = "WalletUrl", + srcs = glob([ + "Sources/**/*.swift", + ]), + deps = [ + + ], + frameworks = [ + "$SDKROOT/System/Library/Frameworks/Foundation.framework", + ], +) diff --git a/submodules/WalletUrl/Sources/WalletUrl.swift b/submodules/WalletUrl/Sources/WalletUrl.swift new file mode 100644 index 0000000000..e55cdd0d18 --- /dev/null +++ b/submodules/WalletUrl/Sources/WalletUrl.swift @@ -0,0 +1,40 @@ +import Foundation + +public struct ParsedWalletUrl { + public let address: String + public let amount: Int64? + public let comment: String? +} + +private let invalidWalletAddressCharacters = CharacterSet(charactersIn: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_=").inverted +private func isValidWalletAddress(_ address: String) -> Bool { + if address.count != 48 || address.rangeOfCharacter(from: invalidWalletAddressCharacters) != nil { + return false + } + return true +} + +public func parseWalletUrl(_ url: URL) -> ParsedWalletUrl? { + guard url.scheme == "ton" && url.host == "transfer" else { + return nil + } + var address: String? + let path = url.path.trimmingCharacters(in: CharacterSet(charactersIn: "/")) + if isValidWalletAddress(path) { + address = path + } + var amount: Int64? + var comment: String? + if let query = url.query, let components = URLComponents(string: "/?" + query), let queryItems = components.queryItems { + for queryItem in queryItems { + if let value = queryItem.value { + if queryItem.name == "amount", !value.isEmpty, let amountValue = Int64(value) { + amount = amountValue + } else if queryItem.name == "text", !value.isEmpty { + comment = value + } + } + } + } + return address.flatMap { ParsedWalletUrl(address: $0, amount: amount, comment: comment) } +} diff --git a/submodules/WebSearchUI/BUCK b/submodules/WebSearchUI/BUCK index f9bd159378..3ff9abbe7e 100644 --- a/submodules/WebSearchUI/BUCK +++ b/submodules/WebSearchUI/BUCK @@ -26,6 +26,7 @@ static_library( "//submodules/LegacyMediaPickerUI:LegacyMediaPickerUI", "//submodules/SegmentedControlNode:SegmentedControlNode", "//submodules/AppBundle:AppBundle", + "//submodules/PresentationDataUtils:PresentationDataUtils", ], frameworks = [ "$SDKROOT/System/Library/Frameworks/Foundation.framework", diff --git a/tools/GenerateLocalization.sh b/tools/GenerateLocalization.sh index 326e5ce5b8..203a1ed412 100644 --- a/tools/GenerateLocalization.sh +++ b/tools/GenerateLocalization.sh @@ -5,3 +5,13 @@ swift -swift-version 4 tools/GenerateLocalization.swift Telegram-iOS/en.lproj/Lo mkdir -p submodules/WalletUI/Resources swift -swift-version 4 tools/GenerateLocalization.swift Telegram-iOS/en.lproj/Localizable.strings submodules/WalletUI/Sources/WalletStrings.swift submodules/WalletUI/Resources/WalletStrings.mapping "Wallet." +wallet_strings_path="Wallet/Strings" +strings_name="Localizable.strings" +rm -rf "$wallet_strings_path" + +for f in $(basename $(find "Telegram-iOS" -name "*.lproj")); do + mkdir -p "$wallet_strings_path/$f" + if [ -f "Telegram-iOS/$f/$strings_name" ]; then + cat "Telegram-iOS/$f/$strings_name" | grep -E '^"Wallet\..*?$' > "$wallet_strings_path/$f/$strings_name" + fi +done