From 22e19cdfdb46b302d3dbcff98083a2309d3b344b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D1=83=D1=80=D0=BD=D0=B0=D1=82=20=D0=90=D0=BD=D0=B4?= =?UTF-8?q?=D1=80=D0=B5=D0=B9?= Date: Sun, 17 May 2026 22:22:43 +0300 Subject: [PATCH] Update Ikar server and Android client --- .dockerignore | 14 + .env.example | 1 + .env.server.example | 13 + .gitignore | 8 + Dockerfile.server | 27 + Ikar.slnx | 8 + IkarClassic.sln | 114 + README.md | 204 + docker-compose.rpi5.yml | 15 + docs/raspberry-pi-5-docker.md | 102 + logo.png | Bin 0 -> 1097240 bytes logo1.png | Bin 0 -> 186821 bytes logo_bg.png | Bin 0 -> 197973 bytes scripts/admin-smoke-test.ps1 | 231 + scripts/phone-auth-smoke-test.ps1 | 123 + scripts/prepare-android-argus-package.ps1 | 222 + scripts/publish-android-apk.ps1 | 10 + scripts/publish-android-update.ps1 | 298 ++ scripts/publish-windows.ps1 | 15 + scripts/run-server.ps1 | 3 + scripts/smoke-test.ps1 | 190 + src/Ikar.AndroidKotlin/.gitignore | 6 + .../ARGUS_PUBLISHING_REQUIREMENTS.md | 372 ++ src/Ikar.AndroidKotlin/MIGRATION_STATUS.md | 79 + src/Ikar.AndroidKotlin/README.md | 39 + src/Ikar.AndroidKotlin/app/build.gradle.kts | 122 + src/Ikar.AndroidKotlin/app/proguard-rules.pro | 1 + .../app/src/main/AndroidManifest.xml | 99 + .../app/src/main/assets/firebase.android.json | 6 + .../com/seven/ikar/kotlin/MainActivity.kt | 307 ++ .../com/seven/ikar/kotlin/app/AppContainer.kt | 183 + .../java/com/seven/ikar/kotlin/app/IkarApp.kt | 1162 +++++ .../seven/ikar/kotlin/app/IkarNativeApp.kt | 51 + .../AndroidContactDiscoveryService.kt | 45 + .../core/contacts/PhoneNumberNormalizer.kt | 16 + .../contacts/ResolvedContactsRepository.kt | 95 + .../kotlin/core/local/CachedChatEntity.kt | 53 + .../kotlin/core/local/CachedChatMessageDao.kt | 58 + .../core/local/CachedChatMessageEntity.kt | 28 + .../ikar/kotlin/core/local/ChatListCache.kt | 38 + .../kotlin/core/local/ChatMessageCache.kt | 74 + .../kotlin/core/local/IkarLocalDatabase.kt | 94 + .../kotlin/core/local/TransferQueueEntity.kt | 73 + .../seven/ikar/kotlin/core/model/Models.kt | 793 ++++ .../ikar/kotlin/core/network/ApiClient.kt | 1390 ++++++ .../ikar/kotlin/core/network/ServerConfig.kt | 39 + .../core/push/AndroidActiveChatState.kt | 13 + .../core/push/AndroidAppVisibilityState.kt | 13 + .../core/push/AndroidFirebaseOptionsLoader.kt | 35 + .../push/AndroidMessageNotificationSound.kt | 62 + .../AndroidNotificationPermissionHelper.kt | 35 + .../core/push/AndroidPushBootstrapper.kt | 150 + .../kotlin/core/push/AndroidPushSettings.kt | 413 ++ .../kotlin/core/push/FirebaseTokenProvider.kt | 18 + .../core/push/IkarFirebaseMessagingService.kt | 48 + .../push/IncomingCallFullScreenSetupHelper.kt | 104 + .../core/push/IncomingCallInviteStore.kt | 100 + .../push/IncomingCallNotificationManager.kt | 111 + .../core/push/IncomingPushNavigationStore.kt | 38 + .../push/InitialCallPermissionPromptStore.kt | 18 + .../core/push/NotificationActionReceiver.kt | 95 + .../core/push/NotificationPreferences.kt | 83 + .../seven/ikar/kotlin/core/push/PushData.kt | 29 + .../push/PushNotificationDisplayService.kt | 333 ++ .../core/push/PushRegistrationManager.kt | 82 + .../ikar/kotlin/core/realtime/RealtimeDtos.kt | 332 ++ .../kotlin/core/realtime/RealtimeService.kt | 297 ++ .../core/session/AuthorizedSessionManager.kt | 40 + .../ikar/kotlin/core/session/SessionStore.kt | 30 + .../core/settings/AndroidAppSettings.kt | 140 + .../core/settings/AndroidChatSettings.kt | 177 + .../settings/AndroidPrivacyRuntimeSettings.kt | 56 + .../kotlin/core/settings/AppLocaleManager.kt | 28 + .../kotlin/core/update/ArgusAppUpdateCache.kt | 33 + .../core/update/ArgusAppUpdateClient.kt | 126 + .../core/update/ArgusAppUpdateInstaller.kt | 149 + .../ArgusAppUpdateInstallerStatusReceiver.kt | 70 + .../core/update/ArgusAppUpdateManager.kt | 101 + .../core/update/ArgusAppUpdateModels.kt | 84 + .../core/update/ArgusAppUpdatePreferences.kt | 57 + .../archive/AndroidArchiveFileService.kt | 569 +++ .../feature/archive/ArchiveExtractorScreen.kt | 464 ++ .../archive/ArchiveExtractorViewModel.kt | 172 + .../feature/archive/IncomingArchiveStore.kt | 40 + .../kotlin/feature/bots/BotEditorScreen.kt | 197 + .../kotlin/feature/bots/BotEditorViewModel.kt | 236 ++ .../ikar/kotlin/feature/bots/BotsScreen.kt | 137 + .../ikar/kotlin/feature/bots/BotsViewModel.kt | 40 + .../feature/call/AndroidCallTonePlayer.kt | 46 + .../feature/call/AndroidWebRtcCallService.kt | 587 +++ .../ikar/kotlin/feature/call/CallManager.kt | 359 ++ .../ikar/kotlin/feature/call/CallScreen.kt | 561 +++ .../feature/call/IncomingCallActivity.kt | 192 + .../chat/AndroidAttachmentFileService.kt | 301 ++ .../chat/AndroidVoiceNotePlayerService.kt | 150 + .../chat/AndroidVoiceNoteRecorderService.kt | 148 + .../ikar/kotlin/feature/chat/ChatScreen.kt | 3723 +++++++++++++++++ .../feature/chat/ChatScrollStateStore.kt | 43 + .../ikar/kotlin/feature/chat/ChatViewModel.kt | 2006 +++++++++ .../ikar/kotlin/feature/chat/EmojiCatalog.kt | 224 + .../kotlin/feature/chatinfo/ChatInfoScreen.kt | 261 ++ .../feature/chatinfo/ChatInfoViewModel.kt | 123 + .../ikar/kotlin/feature/chats/ChatsScreen.kt | 1007 +++++ .../kotlin/feature/chats/ChatsViewModel.kt | 588 +++ .../kotlin/feature/contacts/ContactsScreen.kt | 251 ++ .../feature/contacts/ContactsViewModel.kt | 71 + .../kotlin/feature/devices/DevicesScreen.kt | 99 + .../feature/devices/DevicesViewModel.kt | 58 + .../kotlin/feature/discover/DiscoverScreen.kt | 560 +++ .../feature/discover/DiscoverViewModel.kt | 261 ++ .../feature/folders/ChatFoldersScreen.kt | 179 + .../feature/folders/ChatFoldersViewModel.kt | 113 + .../kotlin/feature/forward/ForwardScreen.kt | 119 + .../feature/forward/ForwardViewModel.kt | 90 + .../ikar/kotlin/feature/login/LoginScreen.kt | 236 ++ .../kotlin/feature/login/LoginViewModel.kt | 135 + .../feature/mainmenu/MainMenuViewModel.kt | 108 + .../feature/members/ChatMembersScreen.kt | 443 ++ .../feature/members/ChatMembersViewModel.kt | 294 ++ .../feature/privacy/PrivacySecurityScreen.kt | 123 + .../privacy/PrivacySecurityViewModel.kt | 79 + .../feature/profile/AccountSettingsScreen.kt | 257 ++ .../feature/profile/PeerProfileScreen.kt | 260 ++ .../feature/profile/PeerProfileViewModel.kt | 54 + .../kotlin/feature/profile/ProfileScreen.kt | 271 ++ .../feature/profile/ProfileViewModel.kt | 146 + .../feature/search/GlobalSearchScreen.kt | 344 ++ .../feature/search/GlobalSearchViewModel.kt | 237 ++ .../feature/settings/AppSettingsViewModel.kt | 35 + .../ChatNotificationSettingsScreen.kt | 233 ++ .../feature/settings/ChatSettingsScreen.kt | 358 ++ .../feature/settings/ChatSettingsViewModel.kt | 35 + .../feature/settings/ChatWallpaperScreen.kt | 216 + .../settings/DataStorageSettingsScreen.kt | 145 + .../settings/NotificationSettingsScreen.kt | 196 + .../settings/NotificationSettingsViewModel.kt | 63 + .../settings/SettingsPlaceholdersScreen.kt | 360 ++ .../kotlin/feature/settings/SettingsScreen.kt | 464 ++ .../feature/settings/SettingsViewModel.kt | 14 + .../feature/share/IncomingShareStore.kt | 28 + .../kotlin/feature/share/ShareTargetScreen.kt | 273 ++ .../feature/share/ShareTargetViewModel.kt | 239 ++ .../kotlin/feature/stories/StoriesScreen.kt | 811 ++++ .../feature/stories/StoriesViewModel.kt | 335 ++ .../transfer/AttachmentDownloadWorker.kt | 123 + .../transfer/AttachmentUploadWorker.kt | 160 + .../TransferForegroundNotification.kt | 71 + .../transfer/TransferQueueRepository.kt | 204 + .../kotlin/feature/update/AppUpdateScreen.kt | 372 ++ .../feature/update/AppUpdateViewModel.kt | 226 + .../ikar/kotlin/ui/AuthenticatedAsyncImage.kt | 47 + .../com/seven/ikar/kotlin/ui/AvatarView.kt | 66 + .../seven/ikar/kotlin/ui/ChatWallpapers.kt | 292 ++ .../com/seven/ikar/kotlin/ui/IkarChrome.kt | 572 +++ .../seven/ikar/kotlin/ui/IkarFormatters.kt | 146 + .../ikar/kotlin/ui/SecureWindowEffect.kt | 60 + .../com/seven/ikar/kotlin/ui/SettingsRow.kt | 48 + .../com/seven/ikar/kotlin/ui/theme/Theme.kt | 135 + .../src/main/res/drawable-nodpi/appicon.png | Bin 0 -> 327346 bytes .../main/res/drawable-nodpi/dotnet_bot.png | Bin 0 -> 92532 bytes .../src/main/res/drawable-nodpi/ikar_logo.png | Bin 0 -> 197973 bytes .../res/drawable/ic_notification_transfer.xml | 9 + .../src/main/res/font/opensans_regular.ttf | Bin 0 -> 107280 bytes .../src/main/res/font/opensans_semibold.ttf | Bin 0 -> 111204 bytes .../app/src/main/res/values/firebase.xml | 8 + .../src/main/res/xml/file_provider_paths.xml | 6 + src/Ikar.AndroidKotlin/build.gradle.kts | 6 + src/Ikar.AndroidKotlin/gradle.properties | 5 + .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 46175 bytes .../gradle/wrapper/gradle-wrapper.properties | 7 + src/Ikar.AndroidKotlin/gradlew | 248 ++ src/Ikar.AndroidKotlin/gradlew.bat | 93 + .../scripts/new-argus-upload-keystore.ps1 | 89 + .../scripts/prepare-argus-publication.ps1 | 189 + .../scripts/publish-release.ps1 | 141 + src/Ikar.AndroidKotlin/settings.gradle.kts | 18 + src/Ikar.Server.Tests/BotsControllerTests.cs | 151 + .../ChannelDtoMapperTests.cs | 140 + .../ChannelMembersControllerTests.cs | 80 + .../ClientVersionRequestReaderTests.cs | 55 + .../ControllerTestFixture.cs | 145 + .../Ikar.Server.Tests.csproj | 25 + .../PrivacyAndStoriesControllerTests.cs | 182 + .../PushNotificationDispatcherTests.cs | 175 + .../SearchControllerTests.cs | 178 + .../Controllers/AdminController.cs | 261 ++ .../Controllers/AppUpdatesController.cs | 83 + src/Ikar.Server/Controllers/AuthController.cs | 275 ++ .../Controllers/BotApiController.cs | 289 ++ src/Ikar.Server/Controllers/BotsController.cs | 307 ++ .../Controllers/ChatsController.cs | 3273 +++++++++++++++ src/Ikar.Server/Controllers/PushController.cs | 113 + .../Controllers/StoriesController.cs | 335 ++ .../Controllers/UploadAttachmentRequest.cs | 46 + .../Controllers/UsersController.cs | 544 +++ src/Ikar.Server/Data/Entities/Entities.cs | 338 ++ src/Ikar.Server/Data/IkarDbContext.cs | 495 +++ src/Ikar.Server/Ikar.Server.csproj | 19 + src/Ikar.Server/Ikar.Server.http | 6 + .../Admin/AdminAuthConstants.cs | 7 + .../Infrastructure/Admin/AdminDtos.cs | 247 ++ .../Infrastructure/Admin/AdminOptions.cs | 14 + .../Infrastructure/Admin/AdminService.cs | 1090 +++++ .../Admin/ServerRuntimeState.cs | 3 + .../Infrastructure/ApiRateLimitMiddleware.cs | 103 + .../Infrastructure/Auth/BotTokenService.cs | 23 + .../Auth/ClientVersionRequestReader.cs | 133 + .../Infrastructure/Auth/JwtOptions.cs | 16 + .../Auth/PhoneAuthChallengeStore.cs | 64 + .../Infrastructure/Auth/TokenService.cs | 163 + .../Infrastructure/Bots/BotUpdateService.cs | 94 + .../Infrastructure/Calls/CallSessionStore.cs | 213 + .../Infrastructure/Calls/WebRtcOptions.cs | 34 + .../ClaimsPrincipalExtensions.cs | 22 + .../Infrastructure/DatabaseSeeder.cs | 119 + src/Ikar.Server/Infrastructure/DtoMapper.cs | 666 +++ .../Infrastructure/Hubs/MessengerHub.cs | 367 ++ .../Infrastructure/PresenceTracker.cs | 41 + .../Push/FirebasePushNotificationSender.cs | 492 +++ .../Push/IPushNotificationSender.cs | 36 + .../Push/PushDispatchBackgroundService.cs | 97 + .../Infrastructure/Push/PushDispatchQueue.cs | 47 + .../Push/PushNotificationDispatcher.cs | 83 + .../Infrastructure/Push/PushOptions.cs | 12 + .../Storage/AttachmentStorageService.cs | 128 + .../Storage/AvatarStorageService.cs | 59 + .../Storage/DatabaseSchemaBootstrapper.cs | 704 ++++ .../Updates/AndroidAppUpdateMonitorService.cs | 99 + .../Updates/AndroidAppUpdateService.cs | 347 ++ ...droidUpdateCompatibilityTrackingService.cs | 82 + src/Ikar.Server/Program.cs | 297 ++ .../Properties/launchSettings.json | 23 + src/Ikar.Server/appsettings.Development.json | 9 + src/Ikar.Server/appsettings.json | 38 + src/Ikar.Server/wwwroot/admin/admin.css | 704 ++++ src/Ikar.Server/wwwroot/admin/admin.js | 1027 +++++ src/Ikar.Server/wwwroot/admin/index.html | 406 ++ src/Ikar.Server/wwwroot/index.html | 59 + src/Ikar.Server/wwwroot/logo.png | Bin 0 -> 1097240 bytes src/Ikar.Server/wwwroot/logo_bg.png | Bin 0 -> 197973 bytes src/Ikar.Server/wwwroot/site.css | 236 ++ src/Ikar.Server/wwwroot/site.js | 46 + src/Ikar.Shared/AppUpdateContracts.cs | 10 + src/Ikar.Shared/AttachmentKind.cs | 7 + src/Ikar.Shared/AuthContracts.cs | 13 + src/Ikar.Shared/BotContracts.cs | 51 + src/Ikar.Shared/CallContracts.cs | 54 + src/Ikar.Shared/ChatContracts.cs | 218 + src/Ikar.Shared/ChatType.cs | 8 + src/Ikar.Shared/ClientVersionContracts.cs | 17 + src/Ikar.Shared/Ikar.Shared.csproj | 9 + src/Ikar.Shared/MessageContracts.cs | 69 + src/Ikar.Shared/ModerationContracts.cs | 23 + src/Ikar.Shared/PhoneAuthContracts.cs | 15 + src/Ikar.Shared/PhoneNumberNormalizer.cs | 22 + src/Ikar.Shared/PushContracts.cs | 53 + src/Ikar.Shared/StoryContracts.cs | 34 + src/Ikar.Shared/UserContracts.cs | 50 + 258 files changed, 51047 insertions(+) create mode 100644 .dockerignore create mode 100644 .env.example create mode 100644 .env.server.example create mode 100644 .gitignore create mode 100644 Dockerfile.server create mode 100644 Ikar.slnx create mode 100644 IkarClassic.sln create mode 100644 README.md create mode 100644 docker-compose.rpi5.yml create mode 100644 docs/raspberry-pi-5-docker.md create mode 100644 logo.png create mode 100644 logo1.png create mode 100644 logo_bg.png create mode 100644 scripts/admin-smoke-test.ps1 create mode 100644 scripts/phone-auth-smoke-test.ps1 create mode 100644 scripts/prepare-android-argus-package.ps1 create mode 100644 scripts/publish-android-apk.ps1 create mode 100644 scripts/publish-android-update.ps1 create mode 100644 scripts/publish-windows.ps1 create mode 100644 scripts/run-server.ps1 create mode 100644 scripts/smoke-test.ps1 create mode 100644 src/Ikar.AndroidKotlin/.gitignore create mode 100644 src/Ikar.AndroidKotlin/ARGUS_PUBLISHING_REQUIREMENTS.md create mode 100644 src/Ikar.AndroidKotlin/MIGRATION_STATUS.md create mode 100644 src/Ikar.AndroidKotlin/README.md create mode 100644 src/Ikar.AndroidKotlin/app/build.gradle.kts create mode 100644 src/Ikar.AndroidKotlin/app/proguard-rules.pro create mode 100644 src/Ikar.AndroidKotlin/app/src/main/AndroidManifest.xml create mode 100644 src/Ikar.AndroidKotlin/app/src/main/assets/firebase.android.json create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/MainActivity.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/app/AppContainer.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/app/IkarApp.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/app/IkarNativeApp.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/contacts/AndroidContactDiscoveryService.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/contacts/PhoneNumberNormalizer.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/contacts/ResolvedContactsRepository.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/local/CachedChatEntity.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/local/CachedChatMessageDao.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/local/CachedChatMessageEntity.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/local/ChatListCache.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/local/ChatMessageCache.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/local/IkarLocalDatabase.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/local/TransferQueueEntity.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/model/Models.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/network/ApiClient.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/network/ServerConfig.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/AndroidActiveChatState.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/AndroidAppVisibilityState.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/AndroidFirebaseOptionsLoader.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/AndroidMessageNotificationSound.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/AndroidNotificationPermissionHelper.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/AndroidPushBootstrapper.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/AndroidPushSettings.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/FirebaseTokenProvider.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/IkarFirebaseMessagingService.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/IncomingCallFullScreenSetupHelper.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/IncomingCallInviteStore.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/IncomingCallNotificationManager.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/IncomingPushNavigationStore.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/InitialCallPermissionPromptStore.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/NotificationActionReceiver.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/NotificationPreferences.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/PushData.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/PushNotificationDisplayService.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/PushRegistrationManager.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/realtime/RealtimeDtos.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/realtime/RealtimeService.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/session/AuthorizedSessionManager.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/session/SessionStore.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/settings/AndroidAppSettings.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/settings/AndroidChatSettings.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/settings/AndroidPrivacyRuntimeSettings.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/settings/AppLocaleManager.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/update/ArgusAppUpdateCache.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/update/ArgusAppUpdateClient.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/update/ArgusAppUpdateInstaller.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/update/ArgusAppUpdateInstallerStatusReceiver.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/update/ArgusAppUpdateManager.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/update/ArgusAppUpdateModels.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/update/ArgusAppUpdatePreferences.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/archive/AndroidArchiveFileService.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/archive/ArchiveExtractorScreen.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/archive/ArchiveExtractorViewModel.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/archive/IncomingArchiveStore.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/bots/BotEditorScreen.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/bots/BotEditorViewModel.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/bots/BotsScreen.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/bots/BotsViewModel.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/call/AndroidCallTonePlayer.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/call/AndroidWebRtcCallService.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/call/CallManager.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/call/CallScreen.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/call/IncomingCallActivity.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/chat/AndroidAttachmentFileService.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/chat/AndroidVoiceNotePlayerService.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/chat/AndroidVoiceNoteRecorderService.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/chat/ChatScreen.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/chat/ChatScrollStateStore.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/chat/ChatViewModel.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/chat/EmojiCatalog.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/chatinfo/ChatInfoScreen.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/chatinfo/ChatInfoViewModel.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/chats/ChatsScreen.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/chats/ChatsViewModel.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/contacts/ContactsScreen.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/contacts/ContactsViewModel.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/devices/DevicesScreen.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/devices/DevicesViewModel.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/discover/DiscoverScreen.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/discover/DiscoverViewModel.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/folders/ChatFoldersScreen.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/folders/ChatFoldersViewModel.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/forward/ForwardScreen.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/forward/ForwardViewModel.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/login/LoginScreen.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/login/LoginViewModel.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/mainmenu/MainMenuViewModel.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/members/ChatMembersScreen.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/members/ChatMembersViewModel.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/privacy/PrivacySecurityScreen.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/privacy/PrivacySecurityViewModel.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/profile/AccountSettingsScreen.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/profile/PeerProfileScreen.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/profile/PeerProfileViewModel.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/profile/ProfileScreen.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/profile/ProfileViewModel.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/search/GlobalSearchScreen.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/search/GlobalSearchViewModel.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/settings/AppSettingsViewModel.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/settings/ChatNotificationSettingsScreen.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/settings/ChatSettingsScreen.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/settings/ChatSettingsViewModel.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/settings/ChatWallpaperScreen.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/settings/DataStorageSettingsScreen.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/settings/NotificationSettingsScreen.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/settings/NotificationSettingsViewModel.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/settings/SettingsPlaceholdersScreen.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/settings/SettingsScreen.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/settings/SettingsViewModel.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/share/IncomingShareStore.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/share/ShareTargetScreen.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/share/ShareTargetViewModel.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/stories/StoriesScreen.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/stories/StoriesViewModel.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/transfer/AttachmentDownloadWorker.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/transfer/AttachmentUploadWorker.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/transfer/TransferForegroundNotification.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/transfer/TransferQueueRepository.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/update/AppUpdateScreen.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/update/AppUpdateViewModel.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/ui/AuthenticatedAsyncImage.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/ui/AvatarView.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/ui/ChatWallpapers.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/ui/IkarChrome.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/ui/IkarFormatters.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/ui/SecureWindowEffect.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/ui/SettingsRow.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/ui/theme/Theme.kt create mode 100644 src/Ikar.AndroidKotlin/app/src/main/res/drawable-nodpi/appicon.png create mode 100644 src/Ikar.AndroidKotlin/app/src/main/res/drawable-nodpi/dotnet_bot.png create mode 100644 src/Ikar.AndroidKotlin/app/src/main/res/drawable-nodpi/ikar_logo.png create mode 100644 src/Ikar.AndroidKotlin/app/src/main/res/drawable/ic_notification_transfer.xml create mode 100644 src/Ikar.AndroidKotlin/app/src/main/res/font/opensans_regular.ttf create mode 100644 src/Ikar.AndroidKotlin/app/src/main/res/font/opensans_semibold.ttf create mode 100644 src/Ikar.AndroidKotlin/app/src/main/res/values/firebase.xml create mode 100644 src/Ikar.AndroidKotlin/app/src/main/res/xml/file_provider_paths.xml create mode 100644 src/Ikar.AndroidKotlin/build.gradle.kts create mode 100644 src/Ikar.AndroidKotlin/gradle.properties create mode 100644 src/Ikar.AndroidKotlin/gradle/wrapper/gradle-wrapper.jar create mode 100644 src/Ikar.AndroidKotlin/gradle/wrapper/gradle-wrapper.properties create mode 100644 src/Ikar.AndroidKotlin/gradlew create mode 100644 src/Ikar.AndroidKotlin/gradlew.bat create mode 100644 src/Ikar.AndroidKotlin/scripts/new-argus-upload-keystore.ps1 create mode 100644 src/Ikar.AndroidKotlin/scripts/prepare-argus-publication.ps1 create mode 100644 src/Ikar.AndroidKotlin/scripts/publish-release.ps1 create mode 100644 src/Ikar.AndroidKotlin/settings.gradle.kts create mode 100644 src/Ikar.Server.Tests/BotsControllerTests.cs create mode 100644 src/Ikar.Server.Tests/ChannelDtoMapperTests.cs create mode 100644 src/Ikar.Server.Tests/ChannelMembersControllerTests.cs create mode 100644 src/Ikar.Server.Tests/ClientVersionRequestReaderTests.cs create mode 100644 src/Ikar.Server.Tests/ControllerTestFixture.cs create mode 100644 src/Ikar.Server.Tests/Ikar.Server.Tests.csproj create mode 100644 src/Ikar.Server.Tests/PrivacyAndStoriesControllerTests.cs create mode 100644 src/Ikar.Server.Tests/PushNotificationDispatcherTests.cs create mode 100644 src/Ikar.Server.Tests/SearchControllerTests.cs create mode 100644 src/Ikar.Server/Controllers/AdminController.cs create mode 100644 src/Ikar.Server/Controllers/AppUpdatesController.cs create mode 100644 src/Ikar.Server/Controllers/AuthController.cs create mode 100644 src/Ikar.Server/Controllers/BotApiController.cs create mode 100644 src/Ikar.Server/Controllers/BotsController.cs create mode 100644 src/Ikar.Server/Controllers/ChatsController.cs create mode 100644 src/Ikar.Server/Controllers/PushController.cs create mode 100644 src/Ikar.Server/Controllers/StoriesController.cs create mode 100644 src/Ikar.Server/Controllers/UploadAttachmentRequest.cs create mode 100644 src/Ikar.Server/Controllers/UsersController.cs create mode 100644 src/Ikar.Server/Data/Entities/Entities.cs create mode 100644 src/Ikar.Server/Data/IkarDbContext.cs create mode 100644 src/Ikar.Server/Ikar.Server.csproj create mode 100644 src/Ikar.Server/Ikar.Server.http create mode 100644 src/Ikar.Server/Infrastructure/Admin/AdminAuthConstants.cs create mode 100644 src/Ikar.Server/Infrastructure/Admin/AdminDtos.cs create mode 100644 src/Ikar.Server/Infrastructure/Admin/AdminOptions.cs create mode 100644 src/Ikar.Server/Infrastructure/Admin/AdminService.cs create mode 100644 src/Ikar.Server/Infrastructure/Admin/ServerRuntimeState.cs create mode 100644 src/Ikar.Server/Infrastructure/ApiRateLimitMiddleware.cs create mode 100644 src/Ikar.Server/Infrastructure/Auth/BotTokenService.cs create mode 100644 src/Ikar.Server/Infrastructure/Auth/ClientVersionRequestReader.cs create mode 100644 src/Ikar.Server/Infrastructure/Auth/JwtOptions.cs create mode 100644 src/Ikar.Server/Infrastructure/Auth/PhoneAuthChallengeStore.cs create mode 100644 src/Ikar.Server/Infrastructure/Auth/TokenService.cs create mode 100644 src/Ikar.Server/Infrastructure/Bots/BotUpdateService.cs create mode 100644 src/Ikar.Server/Infrastructure/Calls/CallSessionStore.cs create mode 100644 src/Ikar.Server/Infrastructure/Calls/WebRtcOptions.cs create mode 100644 src/Ikar.Server/Infrastructure/ClaimsPrincipalExtensions.cs create mode 100644 src/Ikar.Server/Infrastructure/DatabaseSeeder.cs create mode 100644 src/Ikar.Server/Infrastructure/DtoMapper.cs create mode 100644 src/Ikar.Server/Infrastructure/Hubs/MessengerHub.cs create mode 100644 src/Ikar.Server/Infrastructure/PresenceTracker.cs create mode 100644 src/Ikar.Server/Infrastructure/Push/FirebasePushNotificationSender.cs create mode 100644 src/Ikar.Server/Infrastructure/Push/IPushNotificationSender.cs create mode 100644 src/Ikar.Server/Infrastructure/Push/PushDispatchBackgroundService.cs create mode 100644 src/Ikar.Server/Infrastructure/Push/PushDispatchQueue.cs create mode 100644 src/Ikar.Server/Infrastructure/Push/PushNotificationDispatcher.cs create mode 100644 src/Ikar.Server/Infrastructure/Push/PushOptions.cs create mode 100644 src/Ikar.Server/Infrastructure/Storage/AttachmentStorageService.cs create mode 100644 src/Ikar.Server/Infrastructure/Storage/AvatarStorageService.cs create mode 100644 src/Ikar.Server/Infrastructure/Storage/DatabaseSchemaBootstrapper.cs create mode 100644 src/Ikar.Server/Infrastructure/Updates/AndroidAppUpdateMonitorService.cs create mode 100644 src/Ikar.Server/Infrastructure/Updates/AndroidAppUpdateService.cs create mode 100644 src/Ikar.Server/Infrastructure/Updates/AndroidUpdateCompatibilityTrackingService.cs create mode 100644 src/Ikar.Server/Program.cs create mode 100644 src/Ikar.Server/Properties/launchSettings.json create mode 100644 src/Ikar.Server/appsettings.Development.json create mode 100644 src/Ikar.Server/appsettings.json create mode 100644 src/Ikar.Server/wwwroot/admin/admin.css create mode 100644 src/Ikar.Server/wwwroot/admin/admin.js create mode 100644 src/Ikar.Server/wwwroot/admin/index.html create mode 100644 src/Ikar.Server/wwwroot/index.html create mode 100644 src/Ikar.Server/wwwroot/logo.png create mode 100644 src/Ikar.Server/wwwroot/logo_bg.png create mode 100644 src/Ikar.Server/wwwroot/site.css create mode 100644 src/Ikar.Server/wwwroot/site.js create mode 100644 src/Ikar.Shared/AppUpdateContracts.cs create mode 100644 src/Ikar.Shared/AttachmentKind.cs create mode 100644 src/Ikar.Shared/AuthContracts.cs create mode 100644 src/Ikar.Shared/BotContracts.cs create mode 100644 src/Ikar.Shared/CallContracts.cs create mode 100644 src/Ikar.Shared/ChatContracts.cs create mode 100644 src/Ikar.Shared/ChatType.cs create mode 100644 src/Ikar.Shared/ClientVersionContracts.cs create mode 100644 src/Ikar.Shared/Ikar.Shared.csproj create mode 100644 src/Ikar.Shared/MessageContracts.cs create mode 100644 src/Ikar.Shared/ModerationContracts.cs create mode 100644 src/Ikar.Shared/PhoneAuthContracts.cs create mode 100644 src/Ikar.Shared/PhoneNumberNormalizer.cs create mode 100644 src/Ikar.Shared/PushContracts.cs create mode 100644 src/Ikar.Shared/StoryContracts.cs create mode 100644 src/Ikar.Shared/UserContracts.cs diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..a275c424 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,14 @@ +.git +.vs +.codex-* +**/bin +**/obj +docker-data +src/Ikar.Server/Data/Attachments +src/Ikar.Server/Data/*.db +src/Ikar.Server/Data/*.db-shm +src/Ikar.Server/Data/*.db-wal +src/Ikar.Client/bin +src/Ikar.Client/obj +server.out.log +server.err.log diff --git a/.env.example b/.env.example new file mode 100644 index 00000000..c1a6ec3e --- /dev/null +++ b/.env.example @@ -0,0 +1 @@ +IKAR_DATA_PATH=/media/myDrive/ikar-data diff --git a/.env.server.example b/.env.server.example new file mode 100644 index 00000000..33988daa --- /dev/null +++ b/.env.server.example @@ -0,0 +1,13 @@ +# Docker Compose bind mount path is configured in `.env` via `IKAR_DATA_PATH`. +ASPNETCORE_ENVIRONMENT=Production +ConnectionStrings__IkarDb=Data Source=Data/ikar.db +Jwt__Issuer=Ikar.Server +Jwt__Audience=Ikar.Client +Jwt__SigningKey=Ikar-Replace-This-Development-Key-With-A-Long-Random-Secret-CHANGE_ME_USE_SECRET_STORE_VALUE_32_CHARS_MINIMUM +Jwt__AccessTokenLifetimeMinutes=15 +Jwt__RefreshTokenLifetimeDays=30 +Push__FirebaseProjectId= +Push__ServiceAccountJsonPath= +Push__ServiceAccountJson= +Admin__Username= +Admin__Password= diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..118efad3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +.vs/ +**/bin/ +**/obj/ +src/Ikar.Server/Data/** +!src/Ikar.Server/Data/**/ +!src/Ikar.Server/Data/**/*.cs +*.log +src/Ikar.CodexBridge/appsettings.Local.json diff --git a/Dockerfile.server b/Dockerfile.server new file mode 100644 index 00000000..c7b2a965 --- /dev/null +++ b/Dockerfile.server @@ -0,0 +1,27 @@ +FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build +WORKDIR /src + +COPY ["src/Ikar.Server/Ikar.Server.csproj", "src/Ikar.Server/"] +COPY ["src/Ikar.Shared/Ikar.Shared.csproj", "src/Ikar.Shared/"] +RUN dotnet restore "src/Ikar.Server/Ikar.Server.csproj" + +COPY . . +RUN dotnet publish "src/Ikar.Server/Ikar.Server.csproj" -c Release -o /app/publish /p:UseAppHost=false + +FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS runtime +RUN apt-get update \ + && apt-get install -y --no-install-recommends curl \ + && rm -rf /var/lib/apt/lists/* + +WORKDIR /app +ENV ASPNETCORE_ENVIRONMENT=Production +ENV ASPNETCORE_URLS=http://+:5099 + +COPY --from=build /app/publish . + +EXPOSE 5099 + +HEALTHCHECK --interval=30s --timeout=5s --start-period=20s --retries=3 \ + CMD curl --fail http://127.0.0.1:5099/health || exit 1 + +ENTRYPOINT ["dotnet", "Ikar.Server.dll"] diff --git a/Ikar.slnx b/Ikar.slnx new file mode 100644 index 00000000..22f6f389 --- /dev/null +++ b/Ikar.slnx @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/IkarClassic.sln b/IkarClassic.sln new file mode 100644 index 00000000..b98e9876 --- /dev/null +++ b/IkarClassic.sln @@ -0,0 +1,114 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31903.59 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{827E0CD3-B72D-47B6-A68D-7590B98EB39B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ikar.Shared", "src\Ikar.Shared\Ikar.Shared.csproj", "{2FBB67AD-D250-4C69-AEA9-D0F7A18D623B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ikar.Server", "src\Ikar.Server\Ikar.Server.csproj", "{631B782D-44B2-4680-BC8C-1A0A948A1945}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ikar.Client", "src\Ikar.Client\Ikar.Client.csproj", "{E5B4217E-FCA8-4944-99A6-12D07E7B5D60}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ikar.WinUI", "src\Ikar.WinUI\Ikar.WinUI.csproj", "{2900F762-FB89-44B7-AF69-D4908EEC50B2}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ikar.CodexBridge", "src\Ikar.CodexBridge\Ikar.CodexBridge.csproj", "{57EC4F75-199D-4FFB-A658-D455AF1F41CF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ikar.CodexBridge.Tests", "src\Ikar.CodexBridge.Tests\Ikar.CodexBridge.Tests.csproj", "{318E90D6-56ED-491E-8454-22CB84B6FDD3}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {2FBB67AD-D250-4C69-AEA9-D0F7A18D623B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2FBB67AD-D250-4C69-AEA9-D0F7A18D623B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2FBB67AD-D250-4C69-AEA9-D0F7A18D623B}.Debug|x64.ActiveCfg = Debug|Any CPU + {2FBB67AD-D250-4C69-AEA9-D0F7A18D623B}.Debug|x64.Build.0 = Debug|Any CPU + {2FBB67AD-D250-4C69-AEA9-D0F7A18D623B}.Debug|x86.ActiveCfg = Debug|Any CPU + {2FBB67AD-D250-4C69-AEA9-D0F7A18D623B}.Debug|x86.Build.0 = Debug|Any CPU + {2FBB67AD-D250-4C69-AEA9-D0F7A18D623B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2FBB67AD-D250-4C69-AEA9-D0F7A18D623B}.Release|Any CPU.Build.0 = Release|Any CPU + {2FBB67AD-D250-4C69-AEA9-D0F7A18D623B}.Release|x64.ActiveCfg = Release|Any CPU + {2FBB67AD-D250-4C69-AEA9-D0F7A18D623B}.Release|x64.Build.0 = Release|Any CPU + {2FBB67AD-D250-4C69-AEA9-D0F7A18D623B}.Release|x86.ActiveCfg = Release|Any CPU + {2FBB67AD-D250-4C69-AEA9-D0F7A18D623B}.Release|x86.Build.0 = Release|Any CPU + {631B782D-44B2-4680-BC8C-1A0A948A1945}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {631B782D-44B2-4680-BC8C-1A0A948A1945}.Debug|Any CPU.Build.0 = Debug|Any CPU + {631B782D-44B2-4680-BC8C-1A0A948A1945}.Debug|x64.ActiveCfg = Debug|Any CPU + {631B782D-44B2-4680-BC8C-1A0A948A1945}.Debug|x64.Build.0 = Debug|Any CPU + {631B782D-44B2-4680-BC8C-1A0A948A1945}.Debug|x86.ActiveCfg = Debug|Any CPU + {631B782D-44B2-4680-BC8C-1A0A948A1945}.Debug|x86.Build.0 = Debug|Any CPU + {631B782D-44B2-4680-BC8C-1A0A948A1945}.Release|Any CPU.ActiveCfg = Release|Any CPU + {631B782D-44B2-4680-BC8C-1A0A948A1945}.Release|Any CPU.Build.0 = Release|Any CPU + {631B782D-44B2-4680-BC8C-1A0A948A1945}.Release|x64.ActiveCfg = Release|Any CPU + {631B782D-44B2-4680-BC8C-1A0A948A1945}.Release|x64.Build.0 = Release|Any CPU + {631B782D-44B2-4680-BC8C-1A0A948A1945}.Release|x86.ActiveCfg = Release|Any CPU + {631B782D-44B2-4680-BC8C-1A0A948A1945}.Release|x86.Build.0 = Release|Any CPU + {E5B4217E-FCA8-4944-99A6-12D07E7B5D60}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E5B4217E-FCA8-4944-99A6-12D07E7B5D60}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E5B4217E-FCA8-4944-99A6-12D07E7B5D60}.Debug|x64.ActiveCfg = Debug|Any CPU + {E5B4217E-FCA8-4944-99A6-12D07E7B5D60}.Debug|x64.Build.0 = Debug|Any CPU + {E5B4217E-FCA8-4944-99A6-12D07E7B5D60}.Debug|x86.ActiveCfg = Debug|Any CPU + {E5B4217E-FCA8-4944-99A6-12D07E7B5D60}.Debug|x86.Build.0 = Debug|Any CPU + {E5B4217E-FCA8-4944-99A6-12D07E7B5D60}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E5B4217E-FCA8-4944-99A6-12D07E7B5D60}.Release|Any CPU.Build.0 = Release|Any CPU + {E5B4217E-FCA8-4944-99A6-12D07E7B5D60}.Release|x64.ActiveCfg = Release|Any CPU + {E5B4217E-FCA8-4944-99A6-12D07E7B5D60}.Release|x64.Build.0 = Release|Any CPU + {E5B4217E-FCA8-4944-99A6-12D07E7B5D60}.Release|x86.ActiveCfg = Release|Any CPU + {E5B4217E-FCA8-4944-99A6-12D07E7B5D60}.Release|x86.Build.0 = Release|Any CPU + {2900F762-FB89-44B7-AF69-D4908EEC50B2}.Debug|Any CPU.ActiveCfg = Debug|x86 + {2900F762-FB89-44B7-AF69-D4908EEC50B2}.Debug|Any CPU.Build.0 = Debug|x86 + {2900F762-FB89-44B7-AF69-D4908EEC50B2}.Debug|x64.ActiveCfg = Debug|x64 + {2900F762-FB89-44B7-AF69-D4908EEC50B2}.Debug|x64.Build.0 = Debug|x64 + {2900F762-FB89-44B7-AF69-D4908EEC50B2}.Debug|x86.ActiveCfg = Debug|x86 + {2900F762-FB89-44B7-AF69-D4908EEC50B2}.Debug|x86.Build.0 = Debug|x86 + {2900F762-FB89-44B7-AF69-D4908EEC50B2}.Release|Any CPU.ActiveCfg = Release|x86 + {2900F762-FB89-44B7-AF69-D4908EEC50B2}.Release|Any CPU.Build.0 = Release|x86 + {2900F762-FB89-44B7-AF69-D4908EEC50B2}.Release|x64.ActiveCfg = Release|x64 + {2900F762-FB89-44B7-AF69-D4908EEC50B2}.Release|x64.Build.0 = Release|x64 + {2900F762-FB89-44B7-AF69-D4908EEC50B2}.Release|x86.ActiveCfg = Release|x86 + {2900F762-FB89-44B7-AF69-D4908EEC50B2}.Release|x86.Build.0 = Release|x86 + {57EC4F75-199D-4FFB-A658-D455AF1F41CF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {57EC4F75-199D-4FFB-A658-D455AF1F41CF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {57EC4F75-199D-4FFB-A658-D455AF1F41CF}.Debug|x64.ActiveCfg = Debug|Any CPU + {57EC4F75-199D-4FFB-A658-D455AF1F41CF}.Debug|x64.Build.0 = Debug|Any CPU + {57EC4F75-199D-4FFB-A658-D455AF1F41CF}.Debug|x86.ActiveCfg = Debug|Any CPU + {57EC4F75-199D-4FFB-A658-D455AF1F41CF}.Debug|x86.Build.0 = Debug|Any CPU + {57EC4F75-199D-4FFB-A658-D455AF1F41CF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {57EC4F75-199D-4FFB-A658-D455AF1F41CF}.Release|Any CPU.Build.0 = Release|Any CPU + {57EC4F75-199D-4FFB-A658-D455AF1F41CF}.Release|x64.ActiveCfg = Release|Any CPU + {57EC4F75-199D-4FFB-A658-D455AF1F41CF}.Release|x64.Build.0 = Release|Any CPU + {57EC4F75-199D-4FFB-A658-D455AF1F41CF}.Release|x86.ActiveCfg = Release|Any CPU + {57EC4F75-199D-4FFB-A658-D455AF1F41CF}.Release|x86.Build.0 = Release|Any CPU + {318E90D6-56ED-491E-8454-22CB84B6FDD3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {318E90D6-56ED-491E-8454-22CB84B6FDD3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {318E90D6-56ED-491E-8454-22CB84B6FDD3}.Debug|x64.ActiveCfg = Debug|Any CPU + {318E90D6-56ED-491E-8454-22CB84B6FDD3}.Debug|x64.Build.0 = Debug|Any CPU + {318E90D6-56ED-491E-8454-22CB84B6FDD3}.Debug|x86.ActiveCfg = Debug|Any CPU + {318E90D6-56ED-491E-8454-22CB84B6FDD3}.Debug|x86.Build.0 = Debug|Any CPU + {318E90D6-56ED-491E-8454-22CB84B6FDD3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {318E90D6-56ED-491E-8454-22CB84B6FDD3}.Release|Any CPU.Build.0 = Release|Any CPU + {318E90D6-56ED-491E-8454-22CB84B6FDD3}.Release|x64.ActiveCfg = Release|Any CPU + {318E90D6-56ED-491E-8454-22CB84B6FDD3}.Release|x64.Build.0 = Release|Any CPU + {318E90D6-56ED-491E-8454-22CB84B6FDD3}.Release|x86.ActiveCfg = Release|Any CPU + {318E90D6-56ED-491E-8454-22CB84B6FDD3}.Release|x86.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {2FBB67AD-D250-4C69-AEA9-D0F7A18D623B} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B} + {631B782D-44B2-4680-BC8C-1A0A948A1945} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B} + {E5B4217E-FCA8-4944-99A6-12D07E7B5D60} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B} + {2900F762-FB89-44B7-AF69-D4908EEC50B2} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B} + {57EC4F75-199D-4FFB-A658-D455AF1F41CF} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B} + {318E90D6-56ED-491E-8454-22CB84B6FDD3} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B} + EndGlobalSection +EndGlobal diff --git a/README.md b/README.md new file mode 100644 index 00000000..5bb39cd7 --- /dev/null +++ b/README.md @@ -0,0 +1,204 @@ +# Ikar + +Ikar is a working Telegram-like messenger MVP built in this folder with an ASP.NET Core backend, an Android MAUI client, and a dedicated WinUI 3 desktop client for Windows. + +## Stack + +- `src/Ikar.Server`: ASP.NET Core 10 Web API + SignalR + SQLite. +- `src/Ikar.Shared`: shared DTO/contracts used by server and client. +- `src/Ikar.Client`: .NET MAUI client targeting `net10.0-android`. +- `src/Ikar.WinUI`: WinUI 3 desktop client targeting `net10.0-windows10.0.19041.0`. + +## Implemented + +- phone-based sign-in with one-time test codes +- JWT access tokens with rotating refresh tokens +- secure client-side session persistence +- seeded demo accounts and sample chats +- Android contact-book lookup against registered phone numbers +- direct chats +- group chats +- channels with owner-only publishing +- message history persisted in SQLite +- file attachments with metadata persisted in SQLite +- voice notes as audio-classified attachments +- inline voice note playback in Android chat +- message edit/delete with realtime updates +- authenticated attachment download +- real-time message delivery with SignalR +- Android direct-chat audio/video calls with SignalR-based signaling and WebRTC media transport +- dedicated Android call screen for incoming and outgoing audio calls +- Android call ring/ringback tones and proximity-based screen blanking during active calls +- Android push registration API and FCM-based push delivery pipeline +- web admin panel for users, chats, attachments, and system status +- public landing page at `/` with latest Android APK download +- publishable Windows `exe` +- publishable Android `apk` + +## Not Implemented + +This is not full Telegram parity. The following are not implemented in this MVP: + +- microphone recording UI for voice notes +- stickers and inline media previews +- end-to-end encryption +- advanced channel admin roles, granular moderation policies, multi-device sync edge cases +- Windows cloud push notifications + +## Demo Accounts + +- `alice`, phone `+10000000001` +- `bob`, phone `+10000000002` +- `carol`, phone `+10000000003` + +These are created automatically on first server start in `src/Ikar.Server/Data/ikar.db`. + +## Run + +1. Start the backend: + +```powershell +./scripts/run-server.ps1 +``` + +2. Run the Windows client from Visual Studio or CLI: + +```powershell +dotnet build .\src\Ikar.WinUI\Ikar.WinUI.csproj -f net10.0-windows10.0.19041.0 -p:Platform=x64 +.\src\Ikar.WinUI\bin\x64\Debug\net10.0-windows10.0.19041.0\win-x64\Ikar.WinUI.exe +``` + +3. Run the Android client from Visual Studio or install the generated APK: + +```powershell +dotnet build .\src\Ikar.Client\Ikar.Client.csproj -f net10.0-android +``` + +The Android client is hard-wired to the current production endpoint: + +- Android client default base URL: `https://ikar.kusoft.xyz` + +The Android login screen no longer exposes a server URL field. + +The production Docker deployment binds the backend to `127.0.0.1:5099` on the Raspberry Pi host. Public and LAN clients should use the reverse-proxied HTTPS endpoint instead of direct access to port `5099`: + +- public Android / browser / admin URL: `https://ikar.kusoft.xyz` + +## Run In Docker + +Docker assets for Raspberry Pi 5 are included in the repo: + +- `Dockerfile.server` +- `docker-compose.rpi5.yml` +- `.env.example` +- `.env.server` +- `docs/raspberry-pi-5-docker.md` + +Quick start: + +```bash +cp .env.example .env +docker compose -f docker-compose.rpi5.yml up -d --build +``` + +To place server data on an external disk, set `IKAR_DATA_PATH` before running Compose. The current production Pi uses `/media/myDrive/ikar-data`. + +Health check: + +```bash +curl http://127.0.0.1:5099/health +``` + +Admin panel: + +- `/admin` redirects to `/admin/index.html` +- configure admin login through `Admin__Username` and `Admin__Password` +- the admin surface uses its own cookie session and does not reuse messenger JWT tokens +- `/` serves a public landing page with a button for the latest Android APK +- `/api/app-updates/android/download/latest` returns the latest published Android APK +- `scripts/publish-android-update.ps1` keeps only the newest `3` Android APK files on the server by default; override with `-KeepLatestCount ` if needed + +## Publish + +Windows EXE: + +```powershell +./scripts/publish-windows.ps1 +``` + +Android APK: + +```powershell +./scripts/publish-android-apk.ps1 +``` + +Smoke test against the running backend: + +```powershell +./scripts/smoke-test.ps1 +``` + +## Published Artifacts + +- Windows EXE: `artifacts/winui-win64/Ikar.WinUI.exe` +- Android APK: `src/Ikar.Client/bin/Release/net10.0-android/publish/com.seven.ikar.apk` +- Signed Android APK: `src/Ikar.Client/bin/Release/net10.0-android/publish/com.seven.ikar-Signed.apk` + +## Solutions + +- XML solution: `Ikar.slnx` +- classic Visual Studio solution: `IkarClassic.sln` + +## Auth Notes + +- Android client auth is currently `phone-only`. +- The current verification flow returns a temporary test code from the server and shows it in the client UI. +- Real SMS delivery is not implemented yet; it can be connected later by adding an SMS provider. +- Access tokens are short-lived JWTs. +- Refresh tokens are rotated on refresh and stored as hashed server-side sessions. +- Logout revokes the active session immediately, and the revoked access token stops working because the server validates the session id (`sid`) on authenticated requests. +- Session `LastSeenAt` writes are throttled server-side to reduce unnecessary SQLite writes on every authenticated request. +- The JWT signing key in `src/Ikar.Server/appsettings.json` is a development default. Replace it with a strong secret via configuration before any real deployment. + +## Contacts Notes + +- Android contact discovery requests `READ_CONTACTS` and only shows people from the device phone book. +- Server-side contact resolution matches users by normalized phone number through `api/users/contacts/resolve`. +- Users without a registered phone number do not appear in the Android contacts screen. + +## Attachment Notes + +- Attachments are stored on the server under `src/Ikar.Server/Data/Attachments`. +- Metadata stored for each attachment: original file name, content type, file size, upload time, and owning message. +- Audio files are classified as `voice notes` by MIME type / file extension and use the same secure attachment pipeline. +- Attachment content is downloaded through an authenticated API route, not via a public static files directory. + +## Channel And Message Lifecycle Notes + +- Channels are broadcast rooms: the creator is the owner, selected users join as subscribers, and only owners can publish. +- Message edit/delete is synchronized through SignalR `MessageUpdated` events. +- Delete is implemented as a soft-delete on the message row with attachment cleanup on the server. + +## Call Notes + +- Calls are currently implemented only for Android and only in direct one-to-one chats. +- The current call architecture uses SignalR for call lifecycle/signaling and WebRTC for audio/video media transport. +- ICE servers are configured server-side through the `WebRtc` configuration section. +- WinUI does not support calls in the current build. + +## Push Setup Notes + +- Android push in this repo is implemented through Firebase Cloud Messaging HTTP v1 on the server and `FirebaseMessagingService` on the Android client. +- Server-side device registrations are stored in SQLite in the `PushDevices` table and managed through `api/push/devices`. +- Push dispatch is queued through a background worker so message sends do not wait on outbound Firebase network latency. +- To enable real Android delivery, set `Push:FirebaseProjectId` and either `Push:ServiceAccountJsonPath` or `Push:ServiceAccountJson` in `src/Ikar.Server/appsettings.json` or environment-specific configuration. +- Before building the Android APK, fill `src/Ikar.Client/Resources/Raw/firebase.android.json` with the Android Firebase values: `applicationId`, `projectId`, `apiKey`, `senderId`. +- If the Firebase configuration is left empty, the app still builds and the server still accepts device registrations, but actual FCM delivery is skipped. +- The current Windows WinUI desktop target is unpackaged (`WindowsPackageType=None`), so this pass does not implement Windows cloud push. + +## Server Runtime Notes + +- Chat list loading now fetches only the latest message per chat for summary rendering instead of loading full message history. +- The server exposes `/health` for container and deployment health checks. +- The server exposes `/admin/api/*` plus static admin assets under `/admin/*` when admin credentials are configured. +- Startup enables SQLite write-ahead logging and ensures an index on `ChatMembers.UserId` for chat list lookup. diff --git a/docker-compose.rpi5.yml b/docker-compose.rpi5.yml new file mode 100644 index 00000000..004fcd77 --- /dev/null +++ b/docker-compose.rpi5.yml @@ -0,0 +1,15 @@ +services: + ikar-server: + container_name: ikar-server + image: ikar-server:rpi5 + platform: linux/arm64 + build: + context: . + dockerfile: Dockerfile.server + restart: unless-stopped + env_file: + - .env.server + ports: + - "127.0.0.1:5099:5099" + volumes: + - ${IKAR_DATA_PATH:?IKAR_DATA_PATH must be set in .env}:/app/Data diff --git a/docs/raspberry-pi-5-docker.md b/docs/raspberry-pi-5-docker.md new file mode 100644 index 00000000..327b23ad --- /dev/null +++ b/docs/raspberry-pi-5-docker.md @@ -0,0 +1,102 @@ +# Raspberry Pi 5 Docker Run + +This repository now contains a Dockerized server path for Raspberry Pi 5. + +Files used for this deployment: + +- `Dockerfile.server` +- `docker-compose.rpi5.yml` +- `.env.example` +- `.env.server` + +## What This Runs + +- ASP.NET Core server from `src/Ikar.Server` +- SQLite database, attachments, update APKs, and secrets persisted under `/app/Data` +- host-side data path controlled by `IKAR_DATA_PATH` +- host-side backend port bound only to `127.0.0.1:5099`; external access should go through the reverse proxy and HTTPS domain + +## Prerequisites On Raspberry Pi 5 + +1. Install Docker Engine using the official Docker docs: `https://docs.docker.com/engine/install/debian/` +2. Install Docker Compose plugin using the official Docker docs: `https://docs.docker.com/compose/install/` +3. Clone this repository onto the Raspberry Pi 5. +4. Create `.env` from `.env.example` and set `IKAR_DATA_PATH` to the desired host path. +5. Edit `.env.server` and replace `Jwt__SigningKey` before exposing the server outside your LAN. + +## Start + +Run from the repository root: + +```bash +cp .env.example .env +docker compose -f docker-compose.rpi5.yml up -d --build +``` + +## Stop + +```bash +docker compose -f docker-compose.rpi5.yml down +``` + +## Logs + +```bash +docker compose -f docker-compose.rpi5.yml logs -f ikar-server +``` + +## Update After Pulling New Code + +```bash +docker compose -f docker-compose.rpi5.yml up -d --build +``` + +## Verify + +Health endpoint: + +```bash +curl http://127.0.0.1:5099/health +``` + +Expected response: + +```json +{"status":"ok"} +``` + +## Data Location + +Docker bind mount: + +- host: `${IKAR_DATA_PATH}` +- container: `/app/Data` + +On the current Raspberry Pi 5 deployment, `IKAR_DATA_PATH` is set to `/media/myDrive/ikar-data`, which places the SQLite database, attachments, uploaded APK updates, and secrets on the external 1 TB disk instead of the SD card. + +The following data stays persistent there: + +- `ikar.db` +- `ikar.db-wal` +- `ikar.db-shm` +- `Attachments/` +- `AppUpdates/Android/` +- `secrets/firebase-admin.json` + +## Client Access + +For the current production deployment, clients should use the reverse-proxied HTTPS endpoint instead of direct access to port `5099`: + +- Android / browser / admin: `https://ikar.kusoft.xyz` + +Direct host access to `http://:5099` is intentionally not exposed outside the Raspberry Pi loopback interface. + +## Optional Firebase Push + +If you want real Android FCM delivery: + +1. Put the Firebase service account JSON onto the Raspberry Pi 5. +2. Set either `Push__ServiceAccountJsonPath` or `Push__ServiceAccountJson` in `.env.server`. +3. Set `Push__FirebaseProjectId` in `.env.server`. + +If those values stay empty, device registration still works but actual FCM delivery is skipped by the server. diff --git a/logo.png b/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..c386a28795f413fb1ee0a1fd6ba67cc2ed17e891 GIT binary patch literal 1097240 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 z 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%0Dh|a`~k^76ca@% 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

d`5bqj` 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 mrOis?08!@HO;MxO%{)I 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


^yVPk!J>y8R6?ViP%#y%|Fb3n68l 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

X& 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

P1s)m_Fjl25H)gt{wDC7&Z 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 sgwT$=rZ5IpT|pdG8Ysma^}Z#C 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 NApF&NABC>T`hTV$t9<|f literal 0 HcmV?d00001 diff --git a/logo1.png b/logo1.png new file mode 100644 index 0000000000000000000000000000000000000000..c27464b7748bf376b8bf81e11c88c9545d3b3256 GIT binary patch literal 186821 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≤o0y`FwzTjD3~Wj$o!_{r1!=BK|vXs^;) zUB#=bM(VAP+m!wWgo%k6u)-G?!@eXkeYCaBU8jz5O#Sz9T?N(cO6%Ce@duZ;`3L{@ z_xR_}U*eZuxXkZd+~$Qr!PU@Wv~rknca3SgOPRNrN3$}KhFRT*446PE&KfzcGIzMP zBk$zot8Mb0>;?!9N(xF7)H)<`QboVBtGu@w(o0dej$NlEP5Q1dM%M4`2gx0uEd+#!T z;X9w=FMjMnj;R$XX6cIWixB5u=E$fOBUJml4Z6+h7TUKQmeK3@J!N9c>PySTv0L^# zg_H)~4kA`!gfF4EP*W&jnsqu{xo+Y-M$%Mi)}>Yxm8KwqcaW9ZY;P3&WOy6rDK8tW zgMO0?NNjs-WO^U!Y&X?Cqmx{f)XTSd|1xNHF1`N80S6&~QH0Ncwu3Ww9OKgEo9vB7 zxK>L8zYIlU?m&r`M6WJKzPPyKc8vO(E}Dp7!3v65N6=J!(|N(}ZlB%#F@-m@+c|mL z=r)o_CXtkVI)@;PCT5g!YN9vjadvnzC;s9E1g|v2gzY2?H1^m;?V{@9Vt?cQzj}<+ z2Wcg0-5X)b-Wp2lC~b?->Qc6P>`vyqarHXaclu=ARXS};2Hbt;5pM2#u54}*T+R$3 zX2NsDBp-qo;W757GUv%JY(^de!yA`**W-7wvS11XFgRyxi9GHLs>Y<2tVP%noDrs8 zGh`_pKL%69aV%%ba%b6J5d+gT7_S>8K&hWl>XRfVMg@)LCld8ciTr9e=gs{&FTQz+ z3D8;D&0i-YWCWd&GoriJabK^^29O&$0V{45^u{s-2JJ4t{Q2j( z-aEl|_YkAr2BXdjlf26`YctPV%rO*3)}41EaT-KG#b_X=mDHJ8p3&;IX?0rI%n&k* zw}H|IakZFue26?_OidGI=K)x!Yb(_I_pP;9A7}^9#$?DNHt@02M>(b2=px33&QHAO49E2y zEw2KkHa8_-@oT+mgS@a+h8J9onG!K^0zJAb^ZuDJ3}_NcW~_v1x_Ziwn3_Kd3I z2!RiJAVNThU{G^Nk0<4=%O zlJPrMl40mxa6+KvV7Rl*&Xo zSxNos1K>oXG}cwZ9tKG$V=Y*4nIl*OnI%|H=?h{0K^U>DFDt^N?kpi7X+8s>V`8l^ zWOVML_G~faA%*RSxx zE7!QXIb>1_)ib#yVX&DVD+!e*<&2fY0?G85+F}E-oy|E`|G81$S8S)(GqJ0>lKbiS z3eAfL1;lZZNNHmX!8i&6rLjzdVQMY&R*y+%mD$>HuFed<|CI}T=EY6M9)9>^k8q@y z!E{LG11=!`N@P!Ge0O|*^rLw%fopS{F>+mAytKnSlC0XoFMrdh@i zu{?8gkDKbl_Nb}Yh_fSClkB@6e-LJ~s=mU*%!}P8ZoP}|Hb!=ZSgVJZ=y~UbGP$yx zSLMY|8x5WknCJ_ogI)<_Dcik7krsiX2_}FkJ#Ic_rI>Lvcpg1046}_efS_9PF7T;W zZm?%F%Djio+6;E~@zb(Opb~UTq%{)#-wGwYa!lU8&N(~a@BZwM@u7Pv+npi9fuHV({`xz;`&~M zw5~`y;wSA#{2iaM3y4WrVE7TlW^Obwe%wH>#1}n}v(aeu1wKX=E7GR}7gVrJ8}!Ek zMn4BZ&`puttZ%N9> z_Q@w*@95QBgR$;Eew4fjbW8_^C3_cc5Jn{}o0DlCaN|Vai({1bGZ^rQP&jv%NvF%_ zuV3dv#grGY>2|)d1T2>}oQQkfwJ%=xQ*Q#F ze)&ykt%$2@8kp>ikh7jdyF=&5;>juLl_NU+D?GMd@b`cA2YB~!IHGQqjG*aHg`PL* zuTg8Hq*O>Q%U>UwPe@Cdssj;q_Wo`%6eYMy`h!muTMZ8b@QPH3v!b%9GGTyq3 z#LkE%Fa(+RxYIO+NPDQ-<_ST9G2~Ud772kF2&w8I+Wx_r0jHVB9c^f>DLg!vSsl1=q)U3u}H#)#v>$B6l?&CT5b^Vsev zu;@NSVK5Q*-vUuUiQm@-HLj#r4`#mAm^a8)gm_=zU}9X&rHZ936+F)zI)w8jwluU{ z2d0MptvK9UEI{#kX7(Nh6FHBf}N9JvOzy@#_%A$~K zLAD`ATn%MG<~=LroI|4#?>%#bb)^dy(ZEXG%Js?!-W*KuogU6*^tbv@fEATrhAIRy zJl#;xoegO1T;?6eTKr#r_Pcp_O&D@71|W)gPaNy`H-3-!-h_Dnn+44_{82&k zeQ|B4*G&@lkuqo#;}48%?TZk^Yq%f?F5puvmyBy1XPXkcv`{(`k>f9$yk!#>eWL1Z ztTpQRPc>+{_9q{Vewq;UQ$bSbRumS(Xf$FvYRnzrkb!&F;m>{N!`!=CGP!vXS4_$D zfZ_|A_~N2?9V4}!0cYxVRKlDU;zqrbc5g7{RuGUf>BB3+~dHM483r3J=(3&KT+ zOjqy=t-r<@(_rwiyzI+Hz9si-i0eE;HI@mazl}0Sr;K^M*Or4W9P%!c!!)pa;RbGQ z=#Y~eVa!!MR?NxZMWC@7%;yYa=h$Ca=3koy;lD<3aOV_5T+9ygj^~^2_o5>j$HsgMP>L zmO|`bq=C{N&0C;P2es^`U@$n1<1t1#v59;xRBKW`G4wO8)hH0fa#b6Ih^2!PCnlY& zO6zLa#v@e79?QoFHKd&PG3TJv(UcheG(mIXmVs47$#lW211Bx~!22KIJ@=nwwt0at z+Mz{3hDi149FQPV{OeVt1oVhCS+Fr-j4>L%pZ+$cI+2J{pHZ#K;BYo4SUJ%t>#P#; z6^1i-^V&Agef1*GzjBR>*M^Md;BrgWb`l`t9A#)Axo&@p?TMR@s*{Y8h3`Y5c$qNo zWYNe%lPwtwc(_0agaKFgqHo%1n~afG7+Iv5bWkHL!u6~`>r<5igT zUebyN12%6ln$4LP(vAqJFxp&af0z)*>{j^t*WST(E<$9E?aYzc+KQ9g9A`Q(F4?(! zla{yQV>ZGN1rMZbir>~rQjfXI7b&8B2Q4^s$e zAXL3ynmDJS6oyGWi+Pb2`XZVhMZk@1tK1ux+g=)z+fG=OVPSM>UxHjYAgfI^h+@fy5<{h8tQYdd`LtC#uW zS2ub2(ty2*n7D0A8J~3!WV=ZngCN8aUlK~m&Q%4XMS^DKSiDr=^Ipt$0y~4JA9;|xoRfKv3%P;jN=|ZN^#7%ezDNHGjCQ zsCrGdfWrnJK69LGHpK?jWR)&KjcajCs(taGM;%%bOmUi0Ghx=6Juj4{n5DfJ0WUHW zFQNZs8FbCc$01v3+M%R38FAnG3g?|@vk_N zT%}da=}z|PZok0~KY5cK?TOD;}vo?2DJ(4wPp94^^p*Nv&63ctqx7JY5ryzBI~vtiy(vp@*ooa z2Jpa9!=L@G$9VAg3iGXtWV1fGFO)$DQw?f?@TdlwjBCyOj7CVS2|1aAbOD4A#P6nR zZ1mAqh^pG4d@RQ4dA6>DZLbls4trD2mCXUqzVs$ve&I5&yt%{HuwWLzbu2iC%`6!8 zKO2?yjR+D|<}6LQ8nsagNRfMSF-K%B6D_-mm+^XfO~$S#Zm%h$^1jbr*8wx2+Y?H>0HL&uqgE}BR17{ zJ>f}U(d`AdBEG5S;np}5<1K~^-=8ts+NVuU7S!bsG%zZ`PZ9oQ%%|2c%{x4QbCa9O zlw(Vbelp#M`{*5KF!M1PVlj$BC)&1%V->z&b(cx4sd+s-!+S|>ixSf~p3y`dh2aFud!6Ah~v}jdwShQ=5RZR#F)keM6+Jx^zmTeb-qUNHcCh7bnC`uTo$CL$5&#`T56y|9QpLqH-pZK=>Seb58_HWX{ zOIpDYk}*d#m&zB{e6MIX6&TSVt?ri$)?hUH6-5xUa6Y!qnflv;m%}N%N`ewZmEp1u zChtPN#;C}-yglYCuU+E{U%kR}uWoZ`Yes(tJ_pxE5-}tJVfY{?L&b$qxmIe1Ypq02 zReP|TI9X|ndM_Sd7|X;|cgA253qlG(g@9rLkKA{Pt|XLYSV=?b3CvrL z*9If5s$aP|4l$7O{&UC3)Hke^2tFxZL%p83KUOBO~|J`v0$pfmbQB?q-hq&;Wsf=L*x z95kTYj(m_1wvcr(tsbVe%FO3%_ouvm=?2fd^d`@~aEVth?65Nklo$Xk-k#AD>VvTX)FH|$5FY7kOXPTOlQIjHGOzBqf)|XQ{79PCkJV6ij zh#GPIewlU|Z&Te%1miz?Xe_Z?*Jf;7qKPJP1|)dV#FGdq4yO<^cguJAG_{1F@g&BG zR_t&vgWYR8WZsaKBIrj3E?^-FXhx2~oMk!tF6Z*J-Wnw&R>-YW?ejzrj;wUCg$TW9 zf1==LLQpexv|ectq|q%-x?WOEzbrLUyNs~~Nx$?QbiA0bqrcggC6onO>B(ke+M_-n zy8m8I>RLB~LDjk2yTE_=%2ye5H<-B&!8qpQ0_FkdA)im_j<;DIT;Z?%;D`C&ee@oV zsxY6&`jTmiQ<%T6`$JB>mll5X1~xZQTjNG@@j0k=&rw;eJc%XhKAuZw3-A16dF?yq)(fj8~(A zTc2N);G(3Bj;+x&e*~}l4CREOJYmkKGWf(($N2I0JiJw}D&;^u&7zj~1`yl{o*UfJg2=8WMCY%XEjE|+L(A?ikC*C5B<&AptxT!cEX zjYuGZ#rtBRZvfWH?oa1rkF_Lokx5JO+FB$V5`l6y=Z-UnIkdWhFXj?uX~ZvWa1sUX z#P4a0sSjL8eaR_Qcp~~E(;fGoSZh;C1rGK|VdQDkaw1O;vv@ha#l@>H% zd+K;ufW%u{K~R&ejhZ*{2vGyN7u=Z~Ml(h`1KO^QQ9pf2dd9XyxMK~$8VX|>b-KK= zy~89qIZKk4)H@q`z#WGUVdpcfS^{FbqDfgUECziUFLNz;ELJ5OBp5Oj0iyzi31aaQ z#;kPF2OJI?BTBd+_3lYmT~FgiJuJh3UO&5h@3761?<-EZc^; zRJDeN-#Gn_cIuXfeTzXHgC>L^ew-)?`6NpSc5o^@vpU3_8B|NyxrmQexIQ-vw*A} zkYqJcsJ;8-aazR`m+V!pAjoNDD2@nGlwiPUL9z+{7-PsXwZv3e>GU+WDriT?SNA8! zsO&6wy7L)p{e8ac(FZxC?Xx;NA&I#DwP#;s+*xB{GD7AsCCmmR+Qpd8WQUc(b^h}| z_x*h0orgJ`oG7)ND%FtA|NkEjhKM6ZHQf{Bw zZQ$vI%EK|zS0%4lK9L$z5v}S-@_8H4E)`VI{D}kAe5$T2ZkdQ?{zxK&`sREPdDSOE zN;(Ik&53j$CI2<`HGlNJHU84aALFTGE$r?U^2sh8GpA((xfMogl#uySj<=I()a%Kx z*ZPeSUz(BN{-8t}s5I;p>@C}wGyqEP2POO!!4Gn_Y!MJ5Z-iMJ+ahbPK(<1EYPfJ? z#4|5l;`7g6UFLa5AfDZVa)Y7U|h zr9S&8^ab_Nx{$*xFx(!J8_BR`6Kg=-ZdpGCh9YaRUxbP&djR9Gf|ZJ&aQ^rq@?uKM z$|^HH5Xw+xy^C|_j961-9>vG(h=FIJTIRKBUH0IMFsF%gd;o9og}76^276^8VCQq% z<1r8S+C0%S9MWlwb3I2AqP#qVXEx=m=TZe0KbzuaV^(JSZ1gYibAR?b`R>PhRghR5 zsT7Bnp-H+<|FlBAL~4v}jzbE!-k0?$*2U!tC?m%&>t>Tfj=0$qPU2R<(HEt$1du4rM*F`cA9N;sPk z+q!_9js5IVvx&b$5JG5UWVNq@-sZtj8i%*FFM2}G=H7%CU%$eao_m!qzi^Q^F7C27 zEWu`wXPB&ob&|fnV!A3!7!`=pw#Gfh09lsFJry|8vr#Q_-33p}!^3x0u;z%UIro5&(Ad3#162fpFLoVoM$ZO{E8qb z&z6;NSXw9yjIr!t*uv`bhQ78Vk`hm?JuJfwDv~2$qPt6zxtO4dZxo6`qV288neGi? zDt^=GkBtNlyl$}*LCR;2se!F=v0%aus@+;;Sf>wVbixc%%p_7e5hP902k*Tk<*3%3 z;FB+9w?nNtFRs(ja0QX{IRtU%xw52N6s(PheBa{_b5hqbI)8EQc7fk`{vx}rHO4sR zx+Smd@6j1=)7ihw-~Ne@^WBfHawy5tbt_gK3E_tQ*75WwL3Xj`8F+;A{Y2R9lNe5Yw7`)C5i34y8#Dl$hjB7*|+` z#(kkYp;;CR|$57{@n7$ zl^wqP(nUW1l}o(z#tt`k=S;mJ%N;JuFgDY(pyM7<39cv!daiWT@Dxwg2WSao))LCH z(uAC`I2#D_87B_6IkM8h&1d9TvLOCMA>!g!jzoLOIuoc6OI0q#U$0uyK5$(Rvwz9U z$v`)hSeFOkx&{c(wcHKhO@02A0GD;Y>x7IMmQpjN1yg6sDy=*}Qigs7c%_7|l<=C? zxu0mGAw(oqAt+h^>ij?zgdp=E-v#d|C973T;$bwYhcg*W3r4&9w1XULs19i9s!`kk zu+o>(Shh!#DzjJh9@X!2;CK(#ttaz^WcJeFzVr|kyvJz}R|xTBui76NH0Ub|lu`4q z){`>pD6qwLp!n7D1-;RLCypQCp%u#!-AiqZh!Rs}$QMfZ+#6RI=Bvy?CjRMpfg9}5 z-MhqJ`Th^^{qH!M99$s~f~=fHx>e&@3X!gStq`A+^;0vTKYob)T-M)P`HVoboIvc` zQqb!uoex0}BvdnbPe~PKf;ki$JyPy&i?Ku4o@q0Sf_$e2v`^ALc_gPV-hJ)HAN$mg7>8yrm=}fk4ng)cyBuqBNjl*&=H4(E zP1xMtWovVn{&0>Dj=YtVwHzJ?*5XwYiRy6(Aqk?Aw#)oQ9F<7;V8nM$5W?xQ9M@Xm z+RaU{Ii=AkapZX$Jh>0_W<$Q~p);KA)Ts?`g}A57)BVFF^W3a2KEJQb^jDs{$p7>kpW#Ne}gPt)xfa*PUf zDg-LwD2-vL2OqrHhyUT%KgIv&cfQEKd*-Wr>cuyh(&qTd4O%g>R|D`WEHyf#LEIkR z1m+k4dwj=b`l#IUhKZVO@W7U|`_)zw#zG=`zc^l*qBBaeu$`L2y|zi^(AwK`l!J(d469 zA`0Bb$}>*$%36Z(>LB;Zvc!cTIj)Nd$A`Q8%=@0;ek;OsMv2vQnj;KXf&cYOukqXf zIdak%TnMZbQ)U-m=KCK$&tLiO$2hJ6dF?}v=JYtA5o$bJxSBB4CS7_vP|>chb6tNR3$|aZ|g%W)x()(NMka9Ljdn}jbx{{`fsk@*5`JewJ2Q(%^ zO|S*xi>n3(X^=;x1{WD}q=?2Y9e}rjxBJ9FF+6hT5zZbx!f0=k-R(^X0hhHTWoC%p z#X23T58?|;aWz!^73SrmUl0!%^|~PXftss5UNj>knTyhWyCKK{?^()gJMF=?KD9S)@HRtB$t^}aDOg1{G^}!*g?#_6Rk3V#lJGzl6%UCUfn(~cd zhG7?YZUn#Z&wqn2Pg`7Vt+U%Z!gb%}**7k8@x~ta-Fu4eLZq&oOf*x|@)h8}|MxHQ z&%XFNm+T5V-J@*V6)yCr{N8gfarERJoLzUU5Vy&dSYz?VFvqY3{QgbPfA!CPm9GpP zo9zwu^9{Cr&NFXb=IUmjC+?FrSRm5?PiLhqMo$dG%2Z91DZjis;rA}wVBA@wbP@y_ z@G2O}{7aNS5)BP$=ZxAf!}}e z64%Q%v-TQ=F?egRUNjtQjcDW*qmuo^)!J9Qic(~HyH?8>0)!K5dDuDmc4V?wYLig^*MzU z+2ePa+mF{`!x7AIB0O za)fm3-Y$HN#lNLMVmy|avELffactsRyjHFE^m@Ygs+bxT`a@+=Qv6ZejPurfj}aG% zNTE?{K^I%({wR{h;E08WEAm#q^+Rl&74vBG#RoxrKCS0=aJzCTVNX9_FWk1CU@EgO ziWosnd5fkAod|8WSQcWWGu3|XdWV^bMiNYQu2H+a zk!PO2%*CriieSidN1o>*hy;z*O~$eGb4(N#l+ycR4n@hSqw92XOF5TFY}p$w(83gB$>#dGS>y z?Nw%-9y8Zs?pn-UhVS&4bynCn882ViWvcI&lXxY1dEtoFbDt zMkZ&{?(vzIUSnU|95FHymk@#^d@;5e*u+RfV&F?=EKFzk zSxIJdLQsc;o?+}Yq8uv`{1fjRsWufiy{t0_taNfrDf`zY*vm;N74V#s==)$Kh%BD> zZH$bQV7$z;5MHqqSruwTEmqf6>9J*rna^1%W^4?$_@Q?^$|>F27`5Cuf4jgd6Zq_f zYm8Rbnc5tWn8WRO$b0WR#iQ$zI@2K!R+@XV_9I04()?Wor8Q7A)|1kiW!IL$H+uh@ z0Tm6X)?dB8STY_5L313N^+bp`9p9Jwn2lLfOs%y9ahOya6-^*H+~n5ru{0VJzc&lV zg_o9DMucLy%8C6)2+cPCQ9+y}k~TCatEml#5UNEUp*fZjZoQsnJ6Z&zZsO=~j+*lk z;9Ltn^3ZX9=DVNdhu-@H_if~4yO&|>GOh70y)dE8oOT9zX2~?-JG07=k)R%@enENP za?6P^25Xc3n?{2f66rA2XcnH=G@yW{x*Lmi-*LeBW8w`deHqXggE%b!ks%1Z?F}efEkf3%FqYC;f^!7dVs4E*Kb|sf9JrCY0$tXZy8h)7+#(3^5v`yO23rG81MfOv z`RVtZ2i*NAk3s<^jYQ`tkGQo2Iiq;Ue$IhQ4Bz<)gtKO5tLriUZ!PqQj9l}p4CeRu_*jVLfE>m zMt#WDb3tPw%2Lu`mL)5*DI2pfKlQ%HIHQL|SZ&WdaXozYX2G-DW2Wt%q^i~U1UDOT zdZokpRav(!9UEs%HGZk3@*rp`1Sy0>fr@nJb_!MOZ-j$r6-&x~t3x_gi#O^W0w7E} zofk=tBYx$8SX5Ge+MFMI(15038s@!&8W&RO@om)mClPLkNVmI}LL8&`cNqkz7}z%- zQUrk*px}TOfu5StjsWK}c>mpp`12oqn7{CSPw|mQ?&N%Xj@!9}-MU0JxJkPluwqMc z3e7YoW@e)rtBXuG@v}wZvH+7nY`-APsU{f_HYNPa@a2|(isV`J`RL253BE>(S3wpv z(i7x7N!MDzl6ILn6imA9If+sKM^vWqKe#RX~57SE9p>?%@`_Hbi5eio36FR=2GF+}Im1T=MJDO=Oj-)nI&EtwBw zZ*dfQe2{$XQDgCPRB8Wq?rK0i!ftMOnjuma}d{0jPkD6ZT&m;LFC3L z@YLsnOS=uO40MV)-TfVY=;_C})55XF7N%&nz6Si#=bxqDS!GH_sj(Xwo=!RCsk_g! zmLv#qCP0-UcG2!}5Usf#MBHBNb1i(l)wSEfvNip!25+~osXKv$2Qzmx7@kM4L#cRnGX zjcLthtW3uo>TmJAPd>tGMVw=BpQod71K;t;Sm=}EAjj1y3wt?tFgiwb+zX6kQ->2N}ZX3a8AxUfPL3=e`ukxrO@i~|q> zz}BfSqd*X9VbNj4Z4oqRG0`L?gIB%AY>*fP7og=mt^OYGI@0#M%--xN00fjp&WvL41oKM3f3&7m1PgUQDf8f90Yvrt%g0 zm`w}^u1%}6!7Svw^zvoC_}m5d26I}SwwxKQfk45kiM;R}KfI1LwO}HV#HCsaYEh|* zwp{WLCDg0HyYAfJ&wbz>9PM9aWA_S2_O5ey?+PbIH~8rfzLR&IY_V1m=bB-}Br+#} zzx~4>;?Z`=;jK40ymN`;dzU$~eUYbD;4gpA(;Q9r@hVuYa}D^!6DRqxcRax1ol6|q zz0CUV6*hJ+adLc2$f06T#^~=ATR)`A;%;*QA=?+-M*v&m8JTvT*lO~=to$F=!Bxfb6ePb@392$6stJU_9qg zyrBNSvJ`E|8>(E$b>z9L(q={iinGEPjUcTMt;Gm-2{4l&BNJ0^2HBe&LWwVD1V7{C zu?_Aze}de?yqIB)V;%}{4xeTG{+BPZH}sUokYULEob~-H{JkIfAn!j38$nYkHlU=E zJt|>rUlWL2n!uM{yTWdNz{ctdPuz8udspC461i&=-0%c~ZmZeX>|M`X>T}`x4NQQ0 z&Ya}QGpiid=S54daWt;uIi^bS`PvYkedQ86g8@g^*LmuJGn{UVz!r}NjG3`O853&Q z(EbdyEx+>eF8|m6@C<_^=a^YXsfjk^S&3XWNgPU43Os?rl$7nj;RjAK%>t#-Xn*5z z0Xjv&snLK(_qX^fPd&opz;P8ajNut&Hl_pCw=VJ5zvn}I_^6e1nnCiY2MZG;`K@0A z{@%ZPmKTehL3@pXGJJ>Zgg7?b=11>1%uhdg2WNHevLFI9ao1~H54T(L2@Q(#6%sn# zyq?mJ=I<14_uRKSq-!JozFq%fz-lDN)qH5oON98n)Z7rw`&BvbeK>G{y=*&>lEU31 zQ$}CjWXe)>NnPJWh~zbWuXziG`&MO|_nYO?zAY;gWOvg-*;qaWSyDnQUcSE1m!5x# zLx&D=-(BZ9d!$WU8FQ8rmjl||WU>dBi}2P=IfdAZXoij93?pUEV_@vz<`^z+7F@is z!`01QcKaiyrKdC*WH~m=z-9!S6EroVS3hJK0)vF#Qw zUD)TPH?Cl^E*8lBoQ?if{_daoAn!kI*a*-f%N(Hv& z49ncq$wY?A?5#4;m~ z1OMjLeg6J$f06#-v&?L+OgXM4-Phe<4t1MKX4#z8drlBmGZE&j!7EeF=QB=^20S&| z})i`sjIn^wHCtQD&-{G$}0X8A*NmOD|sMe|g~&`y0m@ z;Fzm`nBi%cGfob-`1$X6C+}M~907V>&EG-xcBc&Wt(Y=PXtMWWK8<+Ly#H3veC{B4 zyY>A^fv=^#)%YWpFcbH@Yo@oFo+v)YsP>qvBJxqK$3($2J`f?DoJs=FfEyDe(@iX6 z6NVfiBt*5@xp@6+1?jYY58_V?8t9P@V%qlfZ+b6wym`L~Y1`9x9Q@3!*PHzZAr@AN z+ubMEId|CeZ-=-Yy!F-HkjteC&lw?7+LfIhu`W&G;iqaCQy~u@1o6fm~tx`~%Q?1ps zqDJd5LC49-HmD$bu7l>v_CeA*mH~pvXtmdwmO0PAbcq*U*`(Ax*|+pL)Q;meocL^o z&-#fLuYjCJwu)%x$Mo+?#gqfq7ZAin5g7ztvSQV1M5>mq*8yEMZLkDAU_7)@t$-TGFWpwTtza8>YDyys)S?ouoP zHt4aD+CGe@RCBvEft66QGT7wlV?BQ4(bJquEE`Tj6PO!W+g~2RzkK$qjJj*gT$`Z5 ziXoJ^;AzjNoL*^j=em)oYY$fUTw7%Cv{-qX7;!7q>td01H5qbcX-Xi@SMxeaz02;U z5a0c$6{;~rg`=p%CijD`g=!uW7fD=;=^VJ9|M{Q)WIAc-AQ}y7ST^wKgfySI-9+5( z-dll5o^Sq5A-$Kjz1hy&{Y}9nl4W{r+28m*{oNc_lu%gU(2=9OabpkKYfQZ1>dhUt zc1Mu4X?N@631cseeios=+kDSbc*`P<#i@IrV`36#ggNIxZiHZWm6)#rYYvX};M}n; z51&86llPtC$%pRX(R=UU-ZN)8b7+;dJkTm9Fy6x8nKJmc*3r`J zcyy)Yl18jbYmk_+ za#)4+CF|1}cl(lWJ8`7i%PV6c70lHw@Ec!xl}lxtNo$SL7`&^uF`F?^u_kKwf|g8gRQXhw)2wX#tvZe9-*g?tA`a7MRv_Y|w_&t5W zGPvEn+kw$fgo?arJ7as(zY)@QrvsY)P1}A@T}_7Ed`E=lq%Hmy_F64?z&XfTt6aai zjcu zo-|hTc_2|a1Q$YF+2NXGS|X|lJ0ECM<2P9JJz734AsbM zWi0jZ3oubpRUfNdi^M)NdOmNEv6V5_T1<^cv0lM5c_3bw=;TEL0MX|qOeqBuq(MgK z*#@yX#P<_)%rqjNiohrmVDP$3VovT?wkG`E8`qh2*D271GD@?m_a>&j3cu7G=qd3o z&|U9Qnt(T|GKP}846KfaJlxKB>c|F1sstPLxQvx4|H>b{%neqU^VJFrN38<4fE%lt_%fLVV z(i{B2_L$My5oWeUiPh80JS_|><%DCC9e(274{>)UaS6GuHL*tM{26NLPRFqMNuf#m zqLPtbOaCr=F8v+4|IT2pQo zkUHxIq`%|eW}rZN@9jYI*{>C1d*k;AAqf~suSIC~V_6%T*V5-{JS)V#F4ugvhImgG zzs_NA#j!V<(H|95T)Do(Xcox29c-q)-H22P4m2g{gJ4;i+qb(h zR^E%1#;De6h56VZCPvApEn1>ejjv-Q;H773jd}%GHNvbJG}J;#|gyfX-ta2Z?`-S;!Er);fZ*T)%mPm6bKt)-xs(!?mqFoXg2VNq08j!w;V2 zj&)1Nh$SJ;vnb1rcS9AhC%dj|R%?`TOPOSDG*L}@;ECLib;orq-*16%P;gMqluUfT z1{KM5t+#5ojt^3w;G~G2a`I8il-CH@I_s9=ZxnV#1CK4BvRHUZf(!K4dK6YQXyXZm zCocmllQB>B+B|+pg4xpTT3&tQ*MVRD%!};ihnVI)Ndu~LyfCf-5x|0&%}e~PPkfYj_Qd2L-30+CF^u&DuHU&i=U;sBMFxkCF>dvkBMC|f zkXwuMp5A1@V=IpDe(($@fmK~YLily3fzDAAs`+Wq@zlzbEFbHoUny1BW<>e^v?s~s+1*~VE%<~{9M zpN~9zo;%kq?Vu)19atNOrhx|}j5r0sn*^tldAaojGPy1vnJ4j)F5*D-J6aJC)vH8L zk1|mKtKTgjVe(ezUd4ZTt5IL9YH=aal)t(&<@esaPSM+tr~qSdR?Objx{hl~N4zp? z6DUm}SWjo8N60LNkxk$(1hN2YlQHi;yv9Q-oyvb6dt2ZcV7NGgU;gY1OnXNd*_Bf?$SFp?3}T9kV-#fD z3?KnEt_4|#mtJ~*+k{B?-F{ zauT7&>smmM5PwG|T;WL&w*ku1Bv{l}31ng!$E|xhQM@5pt8rg@mB2p+$asl*wtmjh zm0q>~x^6L`Tdp<-Ff1)|HNV>+^+XNQMzf&?37YtB4HU#naG5OwWq-yaq%Yv;1@i4gIx328kG-_<%5LUi>kJ{#Af zF=9pxD)6T7i1!x)y{d<918LdjwXX$YBb&ctBTeFGYS!ND%+~@3J==VD3eilTLbINQ zXF@FndHEst?9+-u*ildLSCjI(U zv@~GUcUSw^Eiz12pRyRNZWFM^V9@-j&3pff7d;3#d-ex))(ZbW6 z_xa9;&U4p>t)ix7>ZPAcp|PgY(OnLnP;vd_xe9-yrAsYbaSmho7=5f9FwU&_-=m3G z$0Nk~)45KyG}YF$VP)>)^-60D48P{AN1Yek~#V=cOVjClNe z8>`TE6h`xNhl0E)I6N8gJ$Ihs&g4kM0J7E181{ibxH9GUzIusr?HDt1ypfD^!Voo0 zZ0w;ib#}fW>Odgo{PwJbf{kLr%Jyac+J~R!<7c{@XfWiULh%^53jD**y~dY@p26xd zMtPe8Ls5E&zG4$-hdHa$0Z$!W<$Lcw%BdJ=S51@9AZs(0LA9omzwvvMPF3@#I1|7B zX@zG0(`!w--h?<_5t?<$_%8CObnK0ZCT!iruOPHi*Nt9}ZCl8F9bed-r1+9prg{Gx zg=NTuGQ;$D^LvE1>O*`kzN2})`FmL(Z};wI*$B(pvP|nY$$ruYPjxwWs7E>6g)pZm zVkROvtJWLGoEGz}%e=LYUpdOObC}Ehl0SI$GQa($H~HP?uJYweecl|vP7rB*AK5!P zMouJ}0rMclLwP<$5Mmb8lovH+Nh6o~A!{p2)i+}nf{GUBQcv1hGMA}ErqZ-Ehp_PU z`hW;jb24!sx0kI%Z6E0Pz^ZOTIjq}xP6B6u2RrcLyL$Z0hwtY<|H=39b3gS_e&YR) z@!&di_AcVDze;OxgVwZn^zaxKxEQ9(!;=Hi@HclCF~P$$Iu`PYCwUT0UKA$g)j|+yjfwkOKNl|1UFS0*f1+6)7@#Z#j*ZKdk z_ulcEBv*a+x2pRIH_zOOJDZbsR|y5ARm4Id1TqK&GRc5!3*#4F!b=7Rz&5sV01UQq z2Fo^JFj)a*3FWZTO1qL)o73#%nVavEx~twl&Z+KtYWlhNPT1X1_|50e(_LL%U3Ds) zs#B-Vp-=}B-b>wD47OBPi(YJ3SDwDaPAs{xqIF)5m>Lb3A8ayp;vru5qG$6pSIlxi zCxaQ%KIJf%NUn|oe{s)oK6-4KwS|3b<{dd7?ZrS2s@Rv~X%|CgdTV^uEjNrEgA;^) z733MsXsT}-#?ctzot?J55GVb;l(ALWn`jg6Eo20=3RlML#CZ>~4IK8aV>UYp1 ziBXyssLpQ&goGqw*kh~r9=){vZ7U>xo>qEFgfuK5&P$qJh(9UaaGyR;-)nj&joXBY z&!WA!_!x`P0jLq)SK7+YyK#{P)5i=pX<1nvf-nN_YULw`5d-$Nh3(9c&F*2;*~Rg) z%bmyjy!*3N!{!ollqLOY|oX!+RLuN{*y7h4wHJG;}_^_3!4lV-i&xXhpD!N7OSlXnm25_THU#2oDP!^7) zaf$X;YnXVz3jeBa$@eR@G(8z0n%erl{)(klt=mlXkqzRnJC}WaqVb_{nrAJO{2JM_ z)>Mu2Sm$UB3-(RTGObL^f@+)#V=VOV(UYR9QF<@-ww>B4cjDp8AZM<}#uQ|7=!%k- z_e>W;hPd&=(U-%5Z>DpQLMMhavj6$J`T_=Heohh7$1APP1@NmfcLXqa(C=;0jUi6Hs$w%vI zTtk_G_tI6J!DA`P5{IY2F!F|hvyALCu04;R+D$RF$f}v+v5k^D9y-AX?s%B@eDYyF z^tof)`RE!CE;~*RV8y|*gEcQR{B_lw?WwX(y+rz+GP6t~V*5v3%;k~T93Hyzr z1SE|&S`|l=lR*EtuA30rz@+EIX(03xO39veH!_T|Um5hxGw?0XJ;+ag_pSWQcfOpL zT)&6uwMQ|h9whIbq2)Ho%7RvAmBZ+&%IcXyW5u$Q6OHe=PMf)Dsmlz=8`@`#&|ys_ zDyA|H5&Bu$K7G{L({>%xCOnsET^%>jFwirERli;sQkA~Ze%~+=j!PFl9oBOW7#0O4 z%Vk2T?I5J%!?{cqAy?X~I^jsmLX^+kL3cFd>V7@5D;%6a0j|a9(H!fHB-R_+jUTuXFz2}0>^@gkvQvZK7pBnAFa@DVsoekEaY(OQ?JHvoFa20-J1-ZQ^d<&k7|f%O07pP=N`rT zR1UU1MmTf}50^5+pvXJqQ2;A1vu|L#?{`& zv|EhjHU71(WO_K@y2ZJ~zPRLHCabVKfYYm+IMc#AQ(5OS-ePor#;Ed_btT4$RW0j0 zxi6Sz2_q=&+TEOJ52Wp2 zJA`;upVF~D&?FwqLwQWZplyRbQGB1~W6OITuS0(fB5tB;G_j&rocXheZK9dBk%RRy znh2GK#RX2|HepgjO4Dl!XTtj-EPj^W#|?YvF7cTGN=;425mecZSv8h*K+@ z96ou5M~^M@=<#KapXqUGdB~Y{$L1(w;H~UO+uBz15E!Zn!9oY7AUc#WNRHdc8dLtf z{)%K%l&hRxi>0MH?xeqvo{z4bem^`9BKZ>0hE4O}bw~{su%>meUF^WquHVZuZ@G?@ zrB#j}eXRD=Y%=LV#)xBkJa|W|7|`x7@!}gV=Y?0zSDt}nyJAwCm0z((1*f%0XVQs@RRyoME0``v%=A~7TRqDE_nKGm)mOAR5Gj;} z96MbhF9G)hzy8*b@mOn)&DlL{=3PoMFot3v`XT7MnS;)-$J}6z7hk!Lue)NN{o%;q z*uWot#}^tqMN{3MMf0Ri)B89qefP;iQyx>qc}~au80mc+wiR7sevv+_;)MDO{YP~# zD(Q2O&Va=OM+st%wI=P{nL$?jB zTuu??K>AXTeu+V_HQ1ipN(ARosUDUno;P2E2b2{`nui zo3({2S?|p09ljUO(`V_m*BQr7 z(u(tgPBgaqMvO_}=ZZ9)u{`Pwd>#1Y1IyffWQq2!0}Py{G&#lx%{>5DDff6)dXh7j zwX3jD>7mNw@&V%gXDlDd7J>7s+6yg0S;jNE3} zOdK%ed0x}o$QeE-zHs846(IA6I4KlAM`;4;<7 ztp@Lql{!~=FA7$nvyRuh4&FKl*L4)iHJK@U<&*MCU7w-;e7q`8`pDU+nL)tVH@&8z zN-gM7s14u|;Ge(kbA0qfkN(_VdRd3U>(Mj)uD8CTjxlmZIFvQeqc9~yJ7nRi{kXZD z!W6V!!TzOFyzYtvylVeEhk!Xexk~d&V_C)U81Rd~^DaKQ)?st*07Gv?7ec>RwJT&| z+rpCjlCBw$ub<+YY{buf&)4#dDRB}Kl)6G$OO+I@=nDDYyzP_R=h`gK?PaswW#}`! z$?!$Va5&T&HK5;_bp^ZEPVmwN_0GNi57}8`LOnSOv>AUsUXN+JNaLqS`_iO% zPZZKcOo}wWY*99nIN{w%Vd2^|=p_ZD@5Jwh=K)^(N7c`Xx?Qxj6;IB`m~vXs5SGr| zL-@I%i5T&-Nnw)^rxosL$a{=HxSdq^q~{lkN$H1thj60)*kChM`6)Q5(7i7wjMOV-L{rDuwT1!zBm7B-7iFiGZ;$z>4_Fo|t7T`ef+xd`F~7LnLUVf-Q*J__ZQ91YIlKQ>ZDNPlDaPVyuGZC6;v4T- z;lF<1vuy0Tj9#nD(8vLw(u)BM??ov~@~HKvE7mX=S`Vdl3{0PetM*aMA;Yw7QGcyZpv^7uMA2w z3@~YdnhKGIg>V`gQ5v2Ssp&ez8zVpinw~X+cW6_RtIB}U(IcZ1Jg?rTLY)~M*sO=4A2Dhd?7Ctv#dL;s zLv{^&Jlz)j^vzdsOQm!rb?6KfSdL=&v%5CF?kiiYEgWPmZ&O(D8E#8MF&g2^ zdXj96!8*sxXu$mDXAipuH~v;rUIWsw5O-1;E+*1%$6?;fksg^viJjjC124FFFIVjDQmmgMr>u<~ zc!P1mJjD=#0c`L}dltMpZZG3H(FS3>h^6IPJTO%wfqG$*vw3>0c@~ATuo|%x>Z`ac zJ*D%MvWQk*Z15PlHy`6-=T}|BoQl3hY^~pxEb9b8?@g_cyb5#jAdw`u$d^`8E`=pKAbU+5cl&?j{%{tg=?n*b?0jZx>58OJTV;x z{`~GWe*KMq#md|vdhHp8NZpo&2UjF*OcE6ZCIh7>*Ymi9zARdB0{hmcGy@rz-HE>z=$Nqd6CKt3w%+^e!25vv)ehkZor=Y z65ss%o7ffhk+sZW3_BY-PDkfpw?aA&PQp&c)yET)@|fl+ju+D@jTfHBza;O6>$siA zVR0SAzj6HdI!-G<`c!=strqP$N@RSs=$NhJg%K&H_x0>GQNK~n?se84;G<3Hi;c8^ zK@@i`m{d`h3gX6*<}>6yjuXUXUia%(fZOgq#Y3lhwC49R@)j|fQAL+Jv$E34f>=Zw zn+eut^xJ1sS5_;|oqe>-`%*MkjnlKIVJ%w6A(TVr3TKr!OaNsN6-XTUme?E#%tG?v z)HZP?hV~+w_C`dOBC6JM>fWSNE#I$uca0CAoS}~xJWpr~x*BV~( z%p3U1L$WVAtt(3^k6ob;1!kElI{IoAe;W87fAx9pKDEIp?=rL*h4X9-M=WjjSQ-o& zwPq=2W*N4o=-Zs36X}{!v#m1l)Z%MtGxhPP+-8(sj5%bP*u5V35zJ@oxqK1l2P|$Z z@$!!0dv3m(>wsOjXgX@y0L}n!{_GO}>@PmX=B_JotqvnS?gWm^J38Lc8g7y=ALXlV z*uxLK_C*}ZWnwi2WUeF+#!ieldKmyGfKP6~e|XFLIoVyLH@k~o-eq77#^zN&C4rySYyP9_lyuT~!|6giqdcjN3ndKMx#V z;!LlgM~hL`rL--)&G6QW$W@Az>m{af;6yUuuIAheYLph>Vj_3@QdHpxMkZ*kc zzi?j?N7SMIH7)0U&r zl?=6j13**{rKV|PXA(kE2NXA9V2}n&=eM9 zyXOJnduiNB;W5VRYrLKU&eEPo#`3U-TrGlC>C1TUJ-)0uP?ZrYZp+NrzOoqT58AIy zieEGkm84*4VJF=Oq?IyGh;as;Rz$due^WHQ7ceROVqvH0hkOS{RvH=nHa&d)u^x9k zcoe4hP`0|VujV1kBTZIot4-M~Awm6pc`iq)9M+3~B{Z5$6{^scbYQ}P`BsfAYLvzp zoF8W(0nW*)+gJNz;&+)$p2_37ZrqreysUCk?@dPO3*Glth8%1RXPJs1mEl%xB{X~4 z*G5;#6+;O3-pEsP^UZZz=_f*BEEhRKz+%1lFjMD55pF(cVuBU?Se zH$DF*zW?iPtQc7*IQ0k$b&_>SORaeYP2~c^qrflx$(`JGddP5UfqvEjYh~X$lZm42 z?|Yn)$-R_8(#*0%zyiY=;Py56iQo8B&dgsl|&MJK7{)J;Kd+3}7G2k!nUFH9L_;z}`_OaQWWneqFyiKWEN#Y1p-r+Mp3VTz1Qh<)M?}UG?Qs& zo6r596nH;qxv9S#@3+ zrA1i986yT9LV9(B(}tzzhJ!ddu5X~$z7Ef;dws5{S9KBjT$TuG%}JYK5N#^I$5nfe zwbX^EZG=^ASS^>zIAf+f))utP#;Af!S!g=)mH0fch>Eo%8WBf2Uy!>I!{y^V{ptg} z@Rmhpb)PnLKacKds|B%O_+<_F)Wbdg;2j_4v&YsMOfBN3=W+QoJ`=GjR>a#f7)LAl zh-S_S^AvF}I48TD9-+T;YExMy8J<#1O1gr4v`K5_D6hQbAV2t;=df4zFe{tU6=PO* z5c-oU(iN)2^^f0jFMsvuDudZY26-DyOOLOK;$6tE*Hv*07wW?rIoECsvT-ci9N}GK zjJQ-Zq6|}HBlcdi$U?_4cjg%1dCT>D(`?4oVN#*#mnw-k3jDVZ9peq}xt-DOE9l!C z?;WjjK&!t-cjGkQbn8?3uCKe9Lsl4a2R+lT?ZI2M_ikh|brSf!kKE5&?m0q#_W^qC zDF#^!XIpv>9IWL(I28ozrX=`i8_rm#5tT)v;yRa5-xv_&Gm4l88~VGs=irOePmGS=#Lv@&F4 z)CfgLFky^o24cv{V?2}b`@Wj}pPgR(PSbbebWOA$oBqaVdX}d9L?V3KRXYqCu75=N z%CrjGh$7F8`z$Z}iffrJR$#bFZbp?O3-7?G!ig|Ary^Y$;7dxp)q&L-GIbshAai%| zq$3JmXYYRz@@@3&r0epuC}YRN|69iMw;qgOgCCQEn`GM${G>Z`+^Q5%C!?b@A?D0a3uq zM#Isddk631QCtB5|H{vY8Azrt#cCJFj0$8wQDC9;&PLV5tzWlRRZEgrCuf(h_o)x zE$voLyT8e`zT{c6;;J!7C&CaHbS>6^w|(Re+{_+4Il1#pmjl|%k8xwR%&+{NZ{ml( z{${SRvdkbY~1fe~5@oyF0%D@)4$h;mqp zZjKj8Bf3g%l_NU+HLjY?dHGWhRK|7skNyAv*{MlHK~zYBiB*9WZ%|49k|8m!i?i$I zQb#;yrx z*D#nlz=oZoZ`y1YhEXYICd<-M6s4SHbq<;P=&CsQr}k2JLdTl%33)O^MZjwRQbrwU zYckpA&8P9ZujIDFOZ=1n{tg}($i!honVB;g&IGre(mq71y&nE&r>DS`*hmZ=>Mb6C z!lcPZ-j@tujrb4t&dF~jozQyI_rt`obOoJuix~r*%~k%|4Oeq@uzJNf<8rEF@xePz zae93~W?Qs|n@p{rqjqAEuW#WmxwYFLT zlM=(!gLpu^L{BpnuZWv6J&Ca4o7*9MHw+>~mDhyyy@2@rO93`Ix8`-PFy3D>`e%d7 zJGEvsYhX_fFMrnMJY{bew|M+BIbu{&OBz;bX{Lt6Du?+JL<@{xQW+mh2 z|I6FCdsW1osWg)1@^Uc+TzJD>W9bLmpByN<|;H4!nn96h0 z2JrA1xb1Tf;5)OJ_KXHQ))hS5dz4vNJMTa)y$V`bTHgUamE?b=C zhC}<=w@VnVS5fHl8r<{1VGizD;Hg*4sqfr)Xsq{+`zkhlxDWs8f4r63j}5SkS5W4& z41@6x6{8165_UGC-3R>^;AJBqcaD7h6bD)2 z$G_{Fc+O>NO437D-xEQ({6A9DnSXx&h~IeQ`xx%JjDBmH(ujpDW5h&jsg}9W{E4op z7v<1A!|IVChn(}a)J8CjF_=>5<0x?y_|}LUFW<%N=5fC3**Ed^UAQVRWiJiXYdxF+ z-uUU`{HH&DEB$PiZrk#muY4)5c+OrHqjSf`*Afozy)a`H<*$YP;}1Q++dlswyZ*!W60EMn@A zxPPYzHC}6mB)Aj?vBiTZe=sV-8)OgYTyhQadC06uot5te!$GqZrVEwI8Q zEMh%Ll%!-Zk%VM$2qMO2oXrZ1+L^}6fE1K_M9gX;ac5N5*2o|n6qTYQU7@{{VR=%$ zBnme!ahE=euW(db|vKS$#P z!x^W6&z^=~{+%~-+)cskK8B{vpfIxcJ63-xsZf!wadLiDR+3_|NxUcd>PU^wDRACk zvaCLj9&CWCziMMLsax;ylvtBjZ9}$dW#80#N6U?94_4`{9p^{>#w+-1H_fnDT_6V0 zu-8disZ9CZN8n%o-?y{AaEQ%p3TK17K=KmC1+r+*KOQrzu8fTy1974>>hM^T>m*TV z;LMPjxttqzwYb?W^Zn1eiKnR8S?WP14MD-{q=z5+XaAk0&4QQR`W#;S4bNkLTh3;8 z!-P!BCCBi@p+s@v|^q#OYipFF7})W8$QG9p{CiG-1Wu=p`zw%6z1Fb-smbdar4qj|rZ}KUbXH z2EQJPr812Hu;Jj|qkTUA=rMeI4%!`@ZQ-2^s$%3r8i{kR8U$>E zHoVl``1V8vWs**{N$Xmc^upO+8?^WlhEh5em529}&QbObXPIL7MAJq+|JT6en7 z9ai3<44E%5!*%9OpO=5-HSDqV02#N8Se!(|SmyNjO;1;7A9!%Uum9d#Se?3zVs;-x z?->=6-^^H?FR&E&qJXl%l_RW&PCIA1-DYO0%j|TQPCKXFZjrZT@Xt(MiG&MRG8z^P zijrQx&*q>{uQy;g8ZmSpti@z4Ox}XLrM9cY&8O2n;Lw+y6QiCj@96f|u%{p5Z-3)U zdCl_^<6MlGE+Kx5re|BF z_xNGwOgV;2$D6>EClx3z@OA}Fn9s&QSnlTaG(MezZ|BAC@ZrMOMWZ`4-3H1NQbGu>{H1WPD}v);i0SWj!sCJ^F5oY2JIQ~2%LgfTUqLaoTio>p>sy7xl_T7+k1hL5Wu85| zXF0TIHwX6bVb^SznU47IZK-tBsOa5C`W;5aw4o?rmwz~d%^@tW_c*zy_TV4< z*EeyZdyrmd9&9)gC5+d5nTQ!H^=Nd3>5WVbDmv=+hxJxO!O`{@IDFY>p;L0*u8bEP znBx0x+|M=2kj2+j4G$bSy~L4Ir@8T_8}MTq)$yvouDh^0KBGsy-tgYL`QZIW7%c2# z(4J+Ow<(;JI>^N*IXZrMJ##(k4;aM^Ilwr;)4|a#`phmr#!tTL1$@mlbL@#+dR96K zUbcB;P@cqm(?vyk|AmKY>`2D8rtq`+prUC!h!G~^Y54YdeCZqK)j5Z;c1*EX&M7B_ zidRQ|>>TUagi6EXRZg5n8aI7!t7qFG6lc;K+dY4>ajxZ^gqY41qJbz3MxTFdgL@u5 zfyrmcr)Ma9i&9rO)vR3-#Ke-5(uv44?I4lGnh@VtqUG`ZT~w zK8N3TE&bLUg_ol+el)-hdzjIPsdmPJy}P;Q(0&f>n`XAFjHQ&mZ=I~&tdaB7a^y^m zp;*L-hIhJOtNZ)17n@;ChO^*vuq|=uvC@M_kF9h6;bS~@YMGI-WZfCcJf|e5(9_|@ zh?cN5o|gA?N9&kV5AzMry@A)i>S^pXFt3VjUX`fsbMW*3`7e1S+skHW0jGP)SypR+ zd#@_VT0e51)oTcS=8P4l>^-(suRb$Bg0jc;d)i#(m-&BQ{tTW0?5$RqIiYY4zoV;PktJ>?bwhvyz_%R!ZgE$ee`UHA#&8r8L*Y)rIs|bvz%V9$DlVL_tO62 zvCZJft)V^YF|&S>mtM2TPkh}|xk4uuUCoi?wPwnaUls3bzH6jRBEA2@K|DsKV_rON zH9ed3-o?k`N8fl+8p@_|6DUSXkew1K&On^0^xdYgog(D;oZmjj z7tb;Jc_XGpN|*E=&6lX#ClerLgkB9n41kpaKL5Z;9$nhNc6Z@B)8cJO3+Ih!<2!;C zEvIK?>o(x4Go|WBw0bvLDQkY?6)_+yYbQ!(eynYUN!|Dnh_E6L;=F2=9L#^}J3*Pu zm5^Ckjpw6HI-@1N{?_YR3~uuDYdfjOFtD!!M}YtQ=bz@CpL>jK@oM^cm!UJ5!cq3u zm}0~gdl$IrnkzWCcZQj+EY!;pV*1m2aqNMS4R6(;7P>gdaxt($rdFN;laP9pLv2Do zXQ(9+7))-+a&S4EScW_AdzgC68LRqvsOvE$DV1=9m9(|t7*&aN zJr>%YE9?e8_>!mbf?bw_mDt)hihDia)cmMX?Q@}r^armJqmfRg9sz#u{rB=$_Z+6b zu#bLcmOV|Pcv?8R8)vxMo#7w9VU%elfoY_)cttWn^gh8(37NzT z`E^c=83jc@QS{Qr8*TMegJ;w4`C!t!JFTdlV5hV>3+apLeS&QsKjEk zqSJ`^;%&v$YXtM4^mRd?yDK(YEWY^V76tr@ybKobj?2Y%|oly6GXnybH+y8 zQI?r)4}{x4~||#;c!sE#GtVVzt7QRr1+`qqL9Ers{APG2@|5 zrdELuKeEa1zW?Jq=2{FE4zZbc7}}iDh|>?^_N^T~)39<>vbnw?d&?d&lY=Xy%pUM1 zE$`^K0aGiF@l${O#eDU((_*$*BHC{vmRu9$(BJ#9a?-gtm{HlVkREe2TQ$Rh4XZJxyWr^>tv&Z&%*)y)>yTA4; z_-jww$H5NRO-Ioy@S`Etl~^1tD~<{BOvIe6EGILvk~i^WMj3CQjrhuD6}!47=mtylA{FMSr5bxQKhRkFdLI$C6moMRq&%P{NWc3r`T9$Mm` z|E~}6U@5Lb2THG93v=KKC}o1=y%+z~RbExGPUBl+WP1Z$f;ul^bFnTCPV$_)l1@3K zySdCWrs35$FR~{(IwZ9qZ7hb2A7LXxApKPsa!)-weZGW$`S#E8Yw!9bkF@vF-*W|< zt!aw9D>l1z>qS=VfEv=VUQZzuCB3zE@@j>Q_=m1E=^Z)H^+URACwSRY4)Ky}r`cPb zYgdM>?M+tvlW`$qVme+W!`Zgs7X!`xdTZ>o%-ivdt)A@+X*)~r19Y6&0U^DY;}$`< zH~!3kwm*REmwxG&ekqWzntLZqxT%m~pq%vl$wghF7#Et$^!@byTo6xoQf&2XE5z?K z)s2b%0&~vwZ?0=ObYPz8?hNZ|%M5#)YQEBAGg%Rpt^^OxmD*Y&4Qr#~NJJ|s?vp{u zCo>sXix^Q9jazFnX>MUP6&W_EDJ+TEU=dE4SZLvKJ9W;JS=Ee+jH@u}@s$0$*fT9h zpsFv7(YemF)WNuJgabx7+;z%x@8J_nwc9-BX;0y$&%TDM7N=y16gXP9xgBL8Nv#olvcqXD8;YOa_ zvpF~2aFC+RIeGkqJa4t+B%D!0A=cnbj%{^0cIpgw-Sa5Vc;>YjD_YnOoapnZBg>SX z1)K?{0_(an)O8u!U~a^US2)Ur8cYB&Jdznt#|>%qS2*a__=#_R5!dCl8B8MtNa|`F z-pes7hqzemtKacsz#H#8%71$6$GE58VzB!lo84J@ro$-gb?d?9kmvAgjiHt0xWciy zwq7Z9d6i^XEoWJZm9vg3Y4y%bL< z7VpX3WNb&;^!@bye9+YBE*@Q-&a1RzCk;Dp_$E?#Y6H8bELR_xW3Jm_u(?jZw?W}b zi~(yz$;*VZr8dKrI$tzK=Kn@DZiBE<4fY!yyye@%Xbe=Y2;NSHBV_u3n< z*v1+Ns~RI2P_vD)k~C$Hs}`r&GcA^~#^=3(F-p3Un|e@`4kMo&0uLNp#~b+C7e9|H z_jbrj@WT@8)LNGbEl~A|y@N;+We}UmVs;WN;_)iC@_nJucn;-}FhN<}%09F(X*E@; zaYgop98p3TINnee;_LU?Lo@7K+{fWZ4>KxDOqPpRVjTt?;B7|Mp62ArCb!-30N31n z9i0vwS@qoZ;7Q7W5otzt&GFtidNPPosU(zl6Os}2bCtmY%o-uEk2ilb6%8-Q_ zhjvNDl*dQgs2;0+D)en?^XL;Ao~HMYH+DK^#p7ML9~+Y{xdq=if2m=l4MlfNm{h-Y zfQE$r9iLNfVhY>MR3+$BmA9w53`RAp33iZueV)~O zJ+`98M!cH%4EYX5y`=5{st>VL!l&V@!Q+Snms6iI0qdZpO(z{N)Gk;COF@@6J(@QD|O`F=XD+LTrCel^guX z-~I*$z_0$Fk5J6*tM-S5>$|Ev!RwclYg{iNzR&RFzGSBCldn9+>t6CqUh~|`xJ(ty ztaxwK{M7wZG+2>Ipzie-x^KJ&94X-s-g77Kd+-GP*?klbk;?F>miF2cWifXtLnbKIiQ2+7$*paA!@d2rskmnly zcw#%ETqx4?)BE$m#iY}Prd8LxK-f&poJYV$0gs*T^XT!@EDs$+(}lb%$6{w|g32DHuiBsv?8>mM56?>#OrzG8q|?O4I=m`M$*R?n4_CRe z>v_r3FB|j2yHkY0e-(Jsr%te8r?FWZuSaH#k!8I19;Zw?_;vtL z59h^IQ{9R6C{(*Q)NspYGTDeU+H2GkA!D+!v)WEY)FUT3u-%+B2XA`+ojkVM$8}~Y zGw}~>jL_2f5xFn%!%gy{&(+u8z&*#$Fv>e>x4c$d2?}Z_`THzC z_uVh$a)Q`eY|`u6x~4@a#Dp<7#dhP(g+9NSi0hwf0yTk|UEsL29cty z=!pnNYL55e9d{fS*MKhALl$MW;2zW0vyAF}?|tnj*Xl8|#Lc1cq9|9JK-P2Li9c$q zBL7Oda26zfIKmbr3(f@Bjz-)+;_;mhy&T^7o;x_a(kGkU#Sn2R8S2NX=DRIRHv2uY z=~*$V5x%c0ck2&?)-lOGkLcEtm5HuX+ZDbcNhT_v52>>_GPT zqjSjvJwdPxeEe{aKX~s)cz9qL?YfM9XO5xC#C4_mxt7&%O)ry$2~$1pSu%=Y$;Rpi zwp7D8(ZtGHOIem=R{T(R%Mq>3Gh9|K^DD1^1vhksAqPVz!4XF_#_9w{whW`ZY|#ME zZcXF3(B~HealKzENPEVG<*b$josF%Ta)qibR~=H?qp37a05IN{K4{FEFauP=Iy}~# zt{ov@#MC1_m|s zaC+5q^vp8Hm)F=BK+k9RybF1oENh9i8n2BH3zhSUSdm2=v!07Kx_@k(tOUn}e`2oF zdTLwUVI>(9WN>6g%ywpFfgi48hpS8vS9s~OpT^aDW@ts_-flqgk>Qn(-E*2p)}4rZ zOT<71WwmEob-1YgSK_HkydC!XWs)KNDeUYEjRe7{2IABqFb65T(zVWiCDvCMV}yRb ztkM>@gHFPYW#m1!(`I1d58wF-P7OT1JIBbj@M=q2zU#^KoU}7m_g;}zzYY2WlJBrW zHby2{6&*@PZXh#`sbZbh>4$mESKiF)Uj7vJ>Cvk$PRyZ(`tYKs5TrI?-*{cm9N)bR zzx(dn`P_*W*tN*0JI^rdGQ{Gn9P6vww@NUAbV1KY2Z=^zaz=w88>>BVhTI!$CiP$9 zX<0c9P^wdpRyky5u*}TqNB9Td`^~)MP;Evt^I%Fnxj?-__XgdQ2H2?3nd1VCJK11FzM5|XiiN}>AGUF*nLrhs> z%7Urfuy5BaSMOios>NJ<^TrB9ib(@WC~FUR;Edyw_dbf7S)?#+u^q1Y3H!S7{!l;& z3yU=8Rl{7FvJBL=+G8YQ=rJTr-?3hptcp~vwc@@pfmbPmLzKL{Gs2Rs!FvgJ-b1&; zii1CV+ecW>rtsZ43JlI>*gTvIS8;D-^0cZaoe>x{b`t6?cKmZ2 zC)4^!ajx`@y?%MGd&-0kuaSav9PgV~%1=DDCc+mo(#CtKBeanqNG`Q@ibP4Q1bRbQ zT`yVP?6JDG!RBzt#$ZTM8VdCbBYkjnFx#IuxYctsY#5*GSPZp2k$*ypc&T0d{`9>cqnHsZZzBvYXrimF>S|)3X`p4Y)>ixd6;n1&R>+ieyra`! zp}qVFfBWlS#H*iukiE*teJi5@4;^?Tvhl;gd{F&X#RD^CVe zqJME9u8?{_fAXn48B!0aI5{wAuQ9@JVAe6y9(m{wVK9Wj2nIt(;Yy0aF)BTyvS8%I zm7{k;7l-^=9W3+A&}y~lWEq`y&g@i1y9G09S9&Uw!7==0(XlTyKVdQv1iOLi;WtPE zhQR&D2Yl|4W4QKi%DhV{_AhiLrWVOmWSbj{3tH#N9&0Sh4a~t9)#8nw2ZJf%S*g}i z4{6nGTS`<~{a#?Y$~05gkEpHbSi~My_)fP8vV}GuxqF!pe&%k>{9cMImlZQcTtRAl zDMO|VPVY6@U`)h&VPMu5w97u-!78(xr})v=zJeEA-R7XWF-+?QrGJo6Y^s9YyFPb@ zKYIVid93W>cU{IP?@-vBQjg$SEBUiFtb&ui6r26jI>}AWU}KYwH8Gu;Ya6SOS#=m7 zb=)xp-Eu&8aX33>(ifY~0Xs{t9_9oNU9{;j zqL8XjzR>hu{F{aor4e#wpi*u?KY8zGd1P&bo8Co{WfW0%e59jb zj7T@ew?3rCG7DKbVv3U1>Txdj%lzbbzlx{t5pnf2V7=_EdS8MStKMa##C00D^ECYL zw|#`qpI9SXyo^!1OW)==+Y*NCJ;p|?U9(p+X6a+GF&OVX9ouGYWtHAWpLW)cbT8^{ z8)FQmnv!k%k|{rAdgC-#*){&v-~C#yvBHpp+14h+=^U`L^x|^3 z2It*GjI`-@JA`!N^h#8*Ng01Y#jM9Ps=YEaS*>q+II#im`_z35y`h~OrdpQic8kmy zMrA>7R5B>rWZhY@6HSKkx>p%A#3M$B_8+f`SzhDCS>E;8 zM;XlQ!OiTUXEK}>?Qn>s4Is*LstF#>O3U*qXIMnco{_P>vdU<4NS+Bx4U--STMNO& zYboM)H)6WC%%07o{PGWc6VIBH$wf=s+oXY{ahyp4p1MEz z@M?ZGY?;L2V|@oBE9LMo?$8%T(3D8q-3#gs?|`!hcN!XJ8lK|GY{Y@CF|!KcTriy{ zp_#rD(J(+nw`U=J?m>m064F$*FzAf`${ev$OY=^whE0MRzmQ8kQe+x_Bgj6Yh*?W7 zE3lITc-L+BGstGire?sGWXO4DUpn$!EH@dOQy``oy)js2M)9i9dog}uRAU^dUGZsV zeR6)6pkc0J>wuJQ*5;~p9l~WLSL(_(h@(X#SeR_whpndN!(>6f5yb1Fi7oKzC%EvA z637->yysI#x&6T-__h#0>;&*>NFS)A4?$`{dV!WQu z4^91RtNR$~_tX3HL1<3_P3bj#rzz}95+2ciu~vSwgbx_mE)E{#Oj(vbXj{h}`of5r zGKKB#1JV`37d}&daxjU$6Oa&SJ9>E#or7@xQp1flGT(64J^YSOP9&ez9(6<88;h^S z3g>{+_8PujMYNe1j4+nM!^psfhj)MKD91NEbm#E4Rk;ono6)Y$mugAJ`3Y_zy^3Aq zXQ6yvjiXcwT*<0Byc6d?g~SskY;91e5;_=lPiY88j)LW|@y;IZ!f~xJs_P^s&R5V% zF1&+Ihh^Xo-~LfHJ9CWM)8e?ndrT%Pc1wm+&1+)}7PZnrN*Yf&K(b zXlg^;>O^Ag%ra%apq+Or8hb;vcTA{DL}R>dN@mIpS|=XlhraQv_||9aVt+KbAgR|T z#Lw%~5zR>ZU+8buq&Im^sK2D|oGY5j&=fWa=Mwiz3ZcS6Ur)S5rS)6wDf{Rs6c<>z z7Yj{|Z>#VxU7RBm-UgHCTeU5{I%|95B4N_^rS*=Bdjxg)L;D3`_9en>!oYv;u>l{v z>oLsiUYyCniion6iT~)JNp0--%F~$I5?9#Ejn5?nJKOR1Md3*-SQ$Nfis`k~_P zaP~JSja93_;BQsUZle9OEai-_cVU&D)PEwrmaL6Wz5$#ss4TFlM)=5pna+9tosaU- zhfcukB1M+T>N*T6A^l8_LRk-8N~VfU%!vp1?ib$7_r2@}7FEMK(?9R)y@i2lR-Xjk zdQXqvd*_E)vQyakz4Y@geXmAROyzpIw(zEV@PstOu`JyJa;`qxotX?jELdGy#h2oC z(IOL;N=$9S3fY7BjUx92vwlc^>H)s@1vl}!m)*#oYCrs}@wE|?`pDxo)=v7~B*gJ2 zU4I$pj(8k97rIuxHmpX{4*P_{MI?3XCgh7el6cE7%kF@%^v7mDj!OhB1+~4ei9# zZWWh+M?L(;8$Zc^f9r=?nY)Z~_aWBv83tssFOQfoCD29HV4S*+lp>7NPCPdWt#WS} zZT49@c?L?z$<%R3pm~XN1=fjy6I?0faRt+5AA9OSzV@kC^1Uy+k$thoxRSf6-NhKI zmk4Lo*?A)Ef94#=@DM+=xwyUTB%L_Ur0Xw582uw@1K~Q*CvL~yd#s4t#(AMtQ*r@b z{~mY5r8xU`+wcoTOqlpLMcVMTYrH${c%hT-G=2@6tdeRG?D=34eM5NtT)tzBA2VNg z&hXUMxwiQJSYS*eD}y)c9Kq`tUNw5%uYBla$;!y$^R9|;v$1rHk$0`lt9@v1bj52B zk65MT)p$hI?Mu8XQ>yB)O>nc_L^t`vW&9W>jo8rdFUuZ2ZZp)cS6`T?AwZT&ihb&CPRR{K920dEF zk*V28lz~|%3SV94m@PJFoq3p__~w`L?a$fA9^G@zG>^u}Mz2$6Cntd0PQ%as_Ir8X z;U49_s~NWE>6;cKU8@plRfp{YV+Wc=iNnPe zXHQ1T_|Nlu4GpZRAqRST8G@_xy{S06de>V@1BHPV4{yEw7$-+Lw5D)gOfcqoPOc(d zTPa{kxxDw$eykWOu{bD(_+nIvm9xA}-tORREf&!bEKgpHD&FrYJ?ZtAbIpq*%O@ z)w%aUtx}eJVv~Ga{9k$pQ(f*l-s2q~`!sH5H$&U1_UbcZ$PDCu#LQ@&)|rR-@xSp( zzTqid7L_53bt~QX4%Xk)MCM=Kd5Zu2?vJuIe;K2hz4XW^Y;CJLhA{?LjAZ4HT22eA zXT-`_95=(#GM3flHTr8kT3L>byk&CPL#Cv7uhmJ#xOK+WF6l6$%h$D z?V>cfn)S35Q`Qvq^-|ezjU10H2e{q}2j@CmabS^|PR_7!965QK<13rE_B^zwDyAYU zJ1?s`3%U1DY|t64arwRl7H4NM#<0>GaP0I7%fk%cnZ~rb44rHs8)GnDn7cIwTMRIp zOYEKNa%k^v+O3SSvI|uV^PM`tK-N4iA+jlB4JeV&4>N@$n2-AkTWu4SUJ7IXmdy_ zlk?hPPd=2lYCERhp2)nXZHCy@W8Bc*_hMEvbfoh~N|f|I#dgmx z4tBznQ^KAr0fGaku{3x z1-u?}GA5&)4QhkauU#(Q!KvSPq|yWrMa4lrkH?cITjbMJh3okvct;=6OWtSb_4!1#hZGf)h% zgEgLU#a^yG&=L2BO8vf?0=@0?k1}k{_pcPVsX1LGd-Aeis#vA9beNz0-dFQA*R|NME99VpX4I+9kC5!7jOp`>TUfV+4TuNwV8Lsdwoj!vdc{0sO(_mS_8t}4> z&~gLp<|+2G!oU9EZ{sO*uuC<^YfWn>{*=8LQ}mkDk0ynmFXA!ge6ZE~X&-BfbLk-+ zf71JlhqUc9(J2k9M=M1#egz$sAQ`j91hpMiK&hfXk&so(&fy}$YpJ7>C%0$8Y|%mD z2DuZ&aYKcL$_Uq0oC;P#QOpoRI+qWl#(OhqbzQYAvQ5 zkrf+Uy?24@4|JGO=GRq*F$Y{b3(vj&a_nH8%$Hd8C2g!23<>lWyBnTd)Az>8x$Fk| zTMT&yiwpDBKCFas8asODigm2QXHShslnFmQxhp#`;khoVOTn zQp9DRgmg?fS4?_8&^g5UGR{Uymzb85!b1I5e`h_fuf6x!v{K`W3HM)WNQt}?#B>WZ zOPTIiMW|-%7b4D`I_HjLf&x~pom?xv#Cyud z3uEiHGOoL9nwiM)KpxrG?ix6>XqcaB;hpRimtOMjFpLHR_RLQ+my5Dc>>MLg20aa2 zf5m=GS%CKxg-jT{_uxy~zTo;RX6Xj;u=iw|PTNbquHJ2#@3zT&L1yan;_*OW^n7^; z50<&YiaOi}Eo%zcvoMb@MDeWUMzjYjja8Ep<(I%vfU)K|mC3A_5JXXc0eaYRDlhT!#TMPV4;W`FLY%dRK@@a&bx_ z?LwR17y_N*<354bDGg(~6HkWJ&h^>=hCajVc~lG4D$(M}R9iQEBc$QI(#4g`c006H zu?)K{9-^T z$N840>HUg$QCQP;{2LQKT*pZ7zhLkLXFG1ZOsLniu7c7Mn%&h6hqrCAEElnMbnZ7W zw)j|ArYo|z4r4HC6ZeSDESr3g;=D*!mGB zU9-_i_MkGLor##+ny1=gk~rmeI^!)}3WYE{D35w$-4fN53j1E}dY@t>dHBt+NN!!2_auiaYMc*l_!L!&jZrFvDG&MypCCu()?0` zNls+M_2r|*R~#1J3t{nZ{49NL!b*9&ihbhIyt1weTkRS)uh;@%Vj`rCF(yR%EJaE{ z)39QjM7v3}P4AyvjMIA(UBiQ&(2Q+p9N!zYQyj++zhQ8Q(+JmFrWuuBZL<$~Fz{G2 zV58z)aZD)ZZ>w-sG78LjV=!b?)~+ZWV60KMfx=8j29|px$ns?C!s5JPb-l+37@L|6i#wgdho{LY|iG$F{oB%sCm+8K+tDvy}tMs##2USBf(LYBfN3q zvLUo#<0%Q+*rM>|qWZu?J{r;;tiy@>`MK|UB`?1rW4DK{hujrdUt&y&v%XU5dSD3u zvaJ1y2@{P!|5X@8Ey<{WqBnLknM@u z_`e~eEQDIEEK|1|1s&_idrNdz9_H`A?$x~b`gWz%W%S&$uCwW@*7(1F(W^!`GT@{9ET+|X3+K)0BdG0jqh_8Q;E;pwxnI!Y5w?=KbjgbAhv z3kZW@DCk)YS&5G9+Hm7%;all9)3h#SY?oKRgIRQ1_Beh@o3T|gf6lU6tQ$jUAlKoU1&nu4l(fnX?CD4Nd$0a#Uh&M`>FhGpQWgMaykcXQm&;O6$SiDjgcgYdmEE!4MIn@*plb!tOG0qKVxFP!Ul(u_A1 zW~*=-h!Wza@5D5Tz&&)|+ z2aj-UL+nKlbnqW(I;S1ne)kc4K7}`#j`tQ2ZDy;AT(0t;92lMxr7+OrJ|gzEfOU?k z9M+CL#5do1J>T}i1I&9>Rx_vtHF2frOvajrqb2H8Y-M@u?VnlZci(dx!`)ZXw^Q_Oo6T&N(eA6beZ9p`{p1N+ZjA5_$$MWc z2<3~**>uk~76G6lk$5ZhzE;{g^GGre#KpcQ?cS(K6#XNJIlzlz+|$1jypv{f2T$}LS8Kf z?}p@Vh##zR-Try5IJk?Bg^`0Jr`CDk$VrCz0%fbq$XSe9^fE?|W*NwQLD^ek-?Zhr z%lET;Ui#X4AMStjILFr=UOiViEJlrg7{FR_A!ywOt#Utw zrIocS`q)gyuKGP+dw=p`mCaaBUY2wik@e0n+dIiW{{GkU+^ggqau={AVn_r_VTG}t z0Y32Hkbn7mZ>G2FO8T97%2rN+OfU?NcIN1g)@d&v;cK384X^v!r?O8ifXynMGTjIF z(SE*681(W<#^ce~YXpf!XfZ)C>THqlrH<|Bls-@IC&ByLz{nU=emn-uN!UqdC&if* z-h?=AJoq%dAL35>jm1Fe`%QUj3j0FE`LvCcelh)NNGtuuR`eUIR}gJvP2L!BC+UDQ zCA|4lhuO>*#Ed1j_68K{Go3kyJZQKF@PR27l*1mllH6vLWr?$vtUV?Ee#yitRY=Q= zHzQw+$gIJ-5ylO0qanGjo=QAfdkWv`P@-lg^+*t!7o*zNxhb)3h%HB$vLFk4{KjHi zUCOLQsn)ULJcM*0TD9pHB#%N5Z=4t%K^;02n@krgy!hGIve<%-mld+{PP|?rid`EX zP8j&}kDuVT-|-2|{;TQPHl@ug3t_>=uTBxh@-$Y@Cabm*j82}~S(}wp%WST1kn6EF z!lb2YV_Mc=OW4)dhJtAvcKrm4{p0+?-}`o+d$}BYY9r1vMBc3B(X-VbKMKG6Ki|mO z%zlRL1qNA5?1WqKGzAW09W6#o`4YQ!f*TerfA7^VGoirQZCmO^ z+n#C`?xY`tU#G54)9|ej-U&$C%Y`DO7jUuC-6`Vo#CZw%NS{xl+je1LJc-kd<4>Z4 zN5(IU@)+lwpOnbsjh%cij*}8ET*uFvuw9%q4^4Y8f!OIYlK0bmg|Lw4^xZE8G}TcP zQkrasxSr!M5;_Olu_jJeJrSL8@TS`yrQg|AF=f>MZ>4`wClA_5;_&!hgy52|&=y1~ zO0=vczJwX)@j9>?W8@4FGS&vx>=kKsKm@-7IS3bl!uQTfnWJwZ)C9h zD*Ekt%F0@i#TiGIW#R|g7`(1zt9&^}ZtNJnGK?IL@|M#l&M+Djv~xMvjFa=!&Z!-1 zD~3nBcX(yQ-g~T-RqB)-VpdPF*RAkR{@%CntOK%=?Lt+<9%(b-Z1pEkz(4!#KjTz) zAA{*dMp+wgGfZBW3-!UAWriF_2hrx7X&NJ>lco_rj}e{) z$yJ!7*;IZK2C63lJE`og8clk?6{-PPi5C6>;xuASyEtB2dGT*Rh@Uoq`1ex8PG}gA z#!c%XE^iYJ<7aUiaidOY7~-VxUX_4A*T(gv$pfQO*qDg3Rl`@kCymvSuiv-E$T`_0 z?*{Q4Rd`oG zU}3^V=^2!c0`WZ@Xy;`+yZ*zR3xB6qz0? zvsNY_8wO4m@Spzp?F{EHqv*`2mU^g9VW8rnO1@!n^`A!>vd1}nvna_iF!G#w>;z?R zMAu|w4oq37eR81&W9`afRnlOsrDdRNM%dL8T<%ZtFaO_f;W-Cng&Z7agvpPO+(~|J z8UDrpdJCsJ`zWV(Q{*k2kqJ|wHo1M6bQm%BIWm^MY15zC!}9E9{Kt2HlK=SLdwE3n znFo4qJ}_JF<&1o&j|%FcOwin4Vubo`ic_`S3H>SUvs+zXsz}QfW2}!ij5%po2v6_R zze({(#<;j{({EM%Feou zs_{IT*e+k`^OW{m)j|9$gvalMdhyk9mt=s7>Mn$*&*QN0U8lpDQ3g0F9r&8*2~$Z$ zsLh(m6->=o)5)tSZ|KS_6T>7%q@iTF#n_|`2C=FUv2K8b)z>M4p?Z&%v(Om4I&cWu z+EtvS9CGBSo}32b73eJ8D6`Cs!;bpwowD3=l~@o97Rbb?2v}?I76w)r&VT;n4|AgI zP)yA;B&#&tL)z6UKnI{y*(Lmng)NwBwHfwD96x*vMxK_jc;|3BnMwe`Kt8|Ql%QVq zw~V1hN!RtrSC4R2dxL-V|NRY~xu<5xx#lfC_OuGzy$t{CzyBF0%`BtYy$tg%(I|~fp6`R|2D;KLi&wM9cj7Zu%>4*{1)SX8XhA~Kc;y~`=&G|rSF@}Y^ISe1ZmpaA&&3V zv3y!^8X8yVAZgsVEaBQW4EiZ1Rc1=)^m&T(TNjhIJH>W+WC!J$M7t*Xl6*5xJN$*P zI6RG?z8fR`Zfy7ibimWUDxRj{)QCq}DKyFI5gWcUt}%XA{&b%+F!d}8!?DS{hHeMv(fFtv|QnP7WMmE<;UQ3@hz+EaP~$;_~@!w4$9Uv^s=s(35CO= zmam)|N5P5q@@Rk^ZSdTiuVlfD`w+H9Go{+a>%bd7af%N;bQ&|aheD5@N#5nCQq6p_ zdg2pF4loYq3n;;o(azdzu5Pk)>@+R%N@`I-&-aFjv9+u%~R$?j2tX=Rmou}lwsbz48QbW-^5YBn{sxMk+Brf-gOPB?>wv9sI?YvWIumo zb2hUMgWZ>LN59Q4{Ga#o;Zt(fc`Y27sy0ZZKGL?9B7GL_)4ZkeVpMG*iWkShCX_|g7NLswMA!}73WG5Lp7o2N)Y5cUX;W`eB z3l{%2y%z`*o~M-(;>7n&nDm{1G~K2+PXu;SmJ~aQo6;_>w>Uh#Pt#6m6w;j(C;koB zX_|nFf;Dfb&X5PZC^Cunr+7%#@8~Kz+^1!cFF84n8x$KNvndk(Ba)duAqn1S{9(k70B4_Q?3QH%>hzV1V*x)Y1 zo;vu_SGsxLd)d499^)L=IP!ADl;6akyq~A<&H2|q@vU6ft^FZ~35HkZIMfyLXHLOC z_;-KENk2z9w~vwOP#P;|+@r}&H2(vot;wRThb%DWHk)~e&AI)Yp4!j9d(*pl`~9n& zR1x_A#5)$!HsjTIict4)yGr{&)y9%|;W~ca^qXE^s)*ZAjQBpZ^?)XNr0)l$^dosc zMVe04P9pj?r5Pg}-}J%EX8h7tFVaxK>Gk;{C1A)?THt`Df~ILS{vhnKsxH=}p*{keYJKIu58o?odV}1`r>kG+=!|K^sVZ71o-HUd!QHxz+ z57FytRpKdEva+hqvRumNyf|D4G_skLEnMLD5y)$dBt1!$EcX8efq=!3lYiVnZ_V_(OW znXHhNdQ~}`PA-;#PaTJ!{mnmNse1)19AMxx3J=an+X-i>>oys+b;^pq631d~CiP0r z$h25*&$6~~1;6wDJNQ4hALCJ-2#hoz#?~IpLf;GR&_|Zc!d`S!|BMl*6Y{)We@fF# z?=KWpxy~cq^qom%*($tlhvU2>y^rfT{caP|t*n6b-H>KH!SXs*_(*emY)?6Uu?Zow zai*E@PWV88Pb}=jh=~(_BPP-$q~DI;3(wMgG^HDtsp)w@{C<3IB9Y}2jkJ7|o`pI| z^VoE65__)!p}cWjHa$<%4A0X0l%8>TdOxZC)G!2J!5{;g1zK%6x&+{TE%pudB@BIh zwcJFvfXQXtrv9rVE+sZPk`>a5zf-NAl@3m~bBqy2SGam_wJw{!qge=h%VjbM)Oip4 z$&SpIWNt`4+T?}LysA>{BB=|ftIG}G%^y3?T_-m&b9)##3r4Jng%zJSrV?3)as^Fk zulB@SSaO@uCg=2#6ZF@5w8$||l;nI6>3LC@t7sA?Cf?(nBliXEV!%|n$>`YU`I@I+ z!9V$-ujin;#%!q#?|@Pbe5?Q;d#K=N{`LRh*s#OusLNUpGCM_Xa&m95rLK;hCqwe> zOHojB&dCHP45-N%;H;&zmZH^Vy*;wGH`|jaU)$;CZe$F0ksHHwp9i;6s z4i5>!v)X>6(b46EWQsAy1+G z$8lmQi46)KX{07JWpJl3+F%3xgq7u_yo3TZUCYYn?DXO|Y2ITZZih5~aa!^HrGRtE zOQ2&DT}kR9Jd4X7ho$c}r5!&@8EhOsrRgL(r{4fsi3MZ;2Dh^$aDPgG0H(n3t2IOlpQzTwydY3)o3&#bC7#a zR*sk|HW(ebo7XcU3aE(df=Zf@`an}#|Zpv3cp!Ze? zX{2=!!nT5G7{3D2{Kaw7x(@MTrklnOVRfC3=gkN4b<@LhMN@%D!sEg<5ik9X3(!=c zfN)>U(38rEi4%VxZLnz`1Df&|(wbD>FC@ftjqlUvDb3P%(mG1xq;(dj8^;ew>nb3Q z6Yk^h0AmAySH`@!FpF`0jIBE^AYxlJXBbwwQnzQfjkt`V{wKAAv`kH9kHf=WDQC6+ z+QL=P-VO-Ijl%PQDnH8n>ic>H=UrIQ$pDbMg2C!3o_h6VT(#R)ex8Z*Yvd&OQ1?UM z@Wu}@m|kSqo?)c+z2sO`RM*B;ifnG+qln*CA7ZguW|#Kj74#Mrr!(S3hgwG7c;apoq(pWi-jbs&E{>> zNDT;ijPn_nGo+EyD85gh1*CaM<4t-urgxl18Yjkf&ur6!^gc#-mc~g7889h4MO^4m zz&JepUO*s3{C*Q+f)RZqh?|;-8RDhkX<8Q>Ta|Y^Z1-MM{e|zPtJi?0@&@|Fbrq1( zDj@!5pnaU5H1AFCrg@d{v&HP7;%g7PW;^&%4__8?l*c=qihrGv0aVVM$|_RQl4CA- zSs}`Hb*4v=YNe@hSp5soRj?6F-D<^M`O&T4mwo56+o92wdiocb*Z7|$%W{mUa^k$? zTYX?@`DFjP5{H*VhAXGIZr?n&Ts2oILJ`q3(7IHy^@koR_{c+NF!TE7Jy`^2HEn_g=lU0)t$!jQc4T~}21?-LP)6Tosfz2KFv%@uz*||V`6Vi|C%t!mn)mf|v zK6dlxN^)1QxpbVX_s;T_H}8)`y>&bET5n+wb_saHo8E)lb%?%cQ>Y1$fbse%g%O9< zu9yAePS#=h^fD`FR%m5ytXEnjbsSH8>avy?-T!Wt8<@4@WJ?e7_y6u|`IeVlQMq2s zl>{EZWMg~CzxU4j`PKjVCj6dj8FhCvG#y6H*IMJs(5;7-v2<)3GxV&UTIS5rQ@Gwp zMA}9~*dc%Eid0b7o3)|@=Z$4#JFI72)@K)aG@Ik!{>6v6Ybeeyf-{SW%|Xj1zvF!; z{*Bv96XJK9?k_gd{G|6y2yHNq8?NI%l|CaH??YRTClvirZ`Q1Tg7jJ zkHyz9CcTh;C`S6MDPB`pKvM^dujBhBA_p{8bRcNxG-;aWgS3)TZ1;Q;w#rjedLbC3kDJxj!szl9tJjcg64&kgZD$ccPu0l3QWuMZE z5Zgq1#DS^Rc?xMuc(unI=wn38?88SD&Nzx_fbylo7Xt=MM|k>G`?&R%{Y)pK-VoPl zdVSsd{Id@{#ABPDVrmydpHUj|+Z^_}y()0YidaopsZx}jTW)dc_$m5pJvv!O_m=g0 z>TEO6&KG6%t|)qmB`@PjI(~#%JH|e<%&-2$_wjX4pJCQ(8Faf9oz9eMsp}N*n}76a ze)A9COS$KI%FY5qFBBQGWuDEjhQ_>me2EV-~KT^<76dY?J?KYQBBSQJXFW%QiQ&h z_M0aY@fgr_KMCe8N$>1v><7m z^F`D5Q$nZDwtBu3q-9C(Q*8JAVj(V9QyH7WVl>ssq__d$TTSueXCdvT{G2PA-mAj& z$WV$*$I7;W8?Qcu8Ej(x2&=Pbug)MsJ`3-v)ueN-V!ROjMypb;FliZ+BwI+`RTvObFR)?tk+vsv z9c3*x^9~y`i#*IU|L)Bnd;eh6=R7O>T`#{-kTm$r%R zu0#B$apUpA#rl?I2eYY^AmKg@4~U<~m2UKyP5fSXo;KbTP2ZgK-lQ~A>?F>mgsmz) zrOQ^=>2IK6wK7Zwd?uvRbRE}kQ=3SyWBBkFwHt{WRtV#N9zaFU!3MFxh(@w*LAHR7 zimW73Ty-_)4`CY>n&@i=zS+Pg84yS9{*ocQtyTa|x~}p&T$;J;~lypRalL z_1tu@!?cI2B*?a_v;&-qQa6GB{f^JD+S$t>pQ2PtT~ZU4Qr%q|Q`_IRR>acnyn`z| zr;nY+4?VeU6O`M$I`kki%ZV2&Yp&Y+F0dG~azv*b;7>oyt=H`0-~G&Mxn&XNO*p;< z!30YgG2{~te&M&?!JmEjZtUJ08RS!pY)+|@s<^%TNTlh4_PWxcRJvv+qeF|_S(cBT z=JX>c$cBctX<^B5WjK8-aL!{YW?I)DKvBY=fDO}PV`dKzGtIw$`zQFkP9%gehf~?{ zA6m)HV?x}=s(MNKRS4f|T-oZ``5?_h9L5g57r&DtEn6Hf{HApszZZvHC@v%&Q+nrv zg2ja(C2D-1KAZGBzE6MCxRb7%5a(%9x?ku>%M!|%K5s%wzw|yu{5<{6P7ud;@o|k{ zYA#}O8mo#QW5Vu>49*@1(o-W$<>Ua~_3``YnQ83w0wp;v`i|@ox@wh)u8_RfqgL8a zQrdVUP7FPzNI)z4g#4X-ZZTNVa!zb=dn*b?VtYi=534R?422pV5s1q~BSozkzmEqc zugXw3Tv1T=*OH(u6Z+K6?l97nEV+L-R4gab9D`LSc3pZo1MGun4O!`2L= zELX)b8PtoSAk%ASoH%)Ko>tbT9F91Bav4f_o>h!QCU8a^cU2Mu6VAvRhjAs=J37Xb zkJc&9Jj$zXy^$aJt`~41gITpNEc;6<|#A7(3kj3CL3N(r9m`lkt)lp zf*UXOFjMrH>z(4MQ-&Y=+Glb#YOC9;0$$Z7qMN8srtPc=JB{~vprUv58|Npcdk72n z@$)!dQ(PbEu*68?#dJvH#%Q8f)AvJoQ~aI6c<;U2#>CsCkEG#~?k5o-C2&lzN$-W{ zP2q7ln$rDZKw6&d?qf7P3$&zxp4%ahWSVn-bS-inrW%d{Bw`YfMZ!FYqorkN53lAo%_Z{oiJF4R@5}1(BcmjuByReEjo)IOj`6(6;9l&=p zhJJ+4pfpZ=Fo#K z)7E2o+71II#lJX+`*qx}(*70VreSe-oK`@HAHN&oP5MrZG=JM+QhIfGpmRMbZ@yOq zshcKgoRib%JIVY`ak0_~NGoI~X#$-?;|9caa6WD2T;p$r zxE;u~GQ)@|2Z(4}*liHQ9$AM^-t!nIS9;ja3|VUmYh_PRM5+26Cn8jjI9V`0Sfd&j zL00t8rL7&a9R=Q(WLa(QGV@-{Y&x)kuSM;W!W@V8&2wNEOc@d5iwaV`>at#rW5wU`MzpP+Do4HZz5)N@f4-6I%BQiBPb*WC z<6_N6fuNP;4AwVUJ+mT?FT4d?PeOunS15O8jELinL1Z8f>m6NN!1^g#8^`$3@BDgR zb?bh18JJSv#8%xXqEnrbG4u_5^1da0>9_un`&SHh*Od(N8Jub1Y*wvWiL~skwdyt! z3D5Lgw5gBD$#vat!YJwyx0Bw$(3FgF!|u!WGP7rvfgj$&T0;2-LjI;4@d`(`|OOgV1f+vPLFixIyc?zckx%@B7h z8l~~Kin|p;`xb-=Uwtpw0aHGgOsAL>-h{0xW$PK+H6%X zG&I<)u#-4vBONTZr-$TO2B!GDuQ4Jv4We+YtY%QgJOYLu`W}ugmE3puC}-9-8I+#P zc7%x=FxHB2*W{F~X-wX!zLAQ>Ot5KPJ+B@qEiB;3Em-3)qdvaqV@3n=kXDfJM6@tY zITTsBt}rbF%E`&mEJ-gfu)JXGj=vh_}@{X`J-;3kAl9QePx&MS!iIZH1=F z+79RYt&4-5GTWWTYc5Yy*oER^HRN-9|J<3fpqYNviYx512IVasWxbJAb3ZWX5;g{+ zbW?`jkjp#En{da2XE5#AD*d!vfhmtYQ%hFPIdYp}T}jK7xWNWg*G*b;RO zD1TW7WvM(`^AfU@>At5ikmbT;bLAm{;bxVeU}4Bc*o$N-7Sa2&y&Yiy|B5Z|%;e;@#oF=;8_VmoGO^HAeJ`S$oFbBY6BLfT zSD(!VQw%6q9^>+L`rUaO|S;mMGXAJ{4 zB%5ioc;x}ibcZ1Yr3IIs6tK~v#0sO$C~5hUh0P^yu^asOtDeX82xD#m8B%{H@>*8Y zckBKWs(q)u^I{@x2O*54Up2+M7-&kjDJ(`){^Dm%;TM82@%8y2G^WQRb6+@UW)5d# z`*=-sYzmu%bBTMdcs$c?!cGT|G+#ly9KwP^m{TP#@BNsFwxlv4tX`l*j6DEO_29jC zoT6;cRrZseQOi?NhpnL#0u_B4Ah(XJ9AbLQT)B6a=iInRr{P?1dL2@ZzmUdB5n7hA z6h$;?2&+AnG=$j3$a(A1%7o<%aPJ2EyuXEX^ zD7+Q@0S|o($ClxJpSXv&zW)>4_2?3tOp(p*A)lJV*_N!egQqZKG1fA2UbO7hbCX4n zZE3knFZ;oz=0TXFwl&p9aDcNgqNHpa_FjD%cCI7h>`asoLk&7tR#J!XJ~*r?nJN10 z+Bn5`Jo`qz?W#Gh1lk^2Y8}n%B<0+&{W$bxoD0%LMZo#dcSkGbbkIw&ljlre{7uiA z!Y*y>w2?Q*+m3$cgQhfNx;81rr3iz!*gB!MXh?OcFztl8J~;SH3! z4?O@LUWWI4<_Lazv36>p(Sx>efUL&lYsSk#smzqvQ6B~?e8qK_bK_<0iouw)C7dOy zlL>-HCKT3K)hd^Gm10tqgxqU7V;b9`p40tqi7R{WmcknPh-Il?`_nsk$DNO2_FPRb z>xhd;=R{0vz#=Ql3`4usV(HWpgWix_SIEZc3Ro5K0>epZ2GGeeT9iz=4Mry(-~~7C z=NEtAWgN_4TF+5av$5*^c=&P{@K#o%8f&12L)J>T=P8mga&_W~^wi8)N7)VtTm7wZ$6$>>HlVQ;-QtMGr52rqlj8sZR@<$Dzj?Ax}+t zi|es&|7V8wr!@TE(3kT`kJ5ia-tAeYDRkXJ% zHOs3Ov2i6iC8M=7?48Yc(K9Y*p(PflWQ8++!n#`VZbR3Q->u?Ig0ur&y+y?iN482M zevejxBMyG{H{Qg3!&!=%{ghcI-iWIsQx;>r?3H`V>62$*B=>|#03NGiaj!-|LcR?d zR>iNGakSi!cCk)z;vru54KLvPzwriktJ_7H2I*(@cT(wvJhc|NNG>EV#uy4G+MCYxqta(t^TW<`xm-cbALfhk8h zku&I}9Jwkz_zXrAxQ=DtjaM?t9HsS?%9zKr1Ffu@OFX%SmK(9SagtZhG>?VqB(dW4_;o>%dz=j~;-fgv{|s#g^ohi`aaf{{H}lx|K}`$4o_ zcwx+8AARUya|90@8FKsQ?&Y(ezmIz!JH_c<#-^FZcXwgCv$$3Vulvz7FbA*7SJhs# z73DE+96d%%?O$O2vOV;CiL>CcFp&|MOccJrVU4F{JiGd5cowVtdgq9 zaq#3a;A=l0yMmjkeD3e}waNh~I z^Zqq%zvnRb96rg3)gGno((2BVwc3@&zSIrX$~n4;i#{XbbuIke5RjmFZtI8H$N&Q7kI zu-)?~4j0Ijz2KY+b3X5+m{f`JvoGWE!FKfB>iJgB1Y0+{8WJxEbE9sozs-#}9dy$C zR2^Q!w#q3 zH!x(i4Phh370T31$8oxa@`SkQs=B66!1(*=pcs^uycaECr!E;E9Kp~0`k!*#?4g|5 z%g9@t5k)8O#rkqPZ{drQ(;f~?ialgt6`ZHgCEnrhdc8KH}B2) zr$6#qu33Db^le69cHqXF{u^Iq_ zBd27sT<7xj$N0H#ehJSouzyUFko1paT&?@dcz+8xA6h?|2<7@>g>lk*wk%{iC~Sq8 zU^^vV+K9eXv6J$j4}BjmO#Xh#R3~9lyfl1kraTEdjTgfM9#0>`iih`p@)1rH(-f^) z9I{GA`+~ud8At9%xQ%5Nrz|gc<`pcq#iy@Tt5e>C)fJ+51wOnV(QdqtrSurb*>vBU zDW?!kYw#F)Y9!<&@K688`?>A#D*4{4*>JKBlWz&bZDl!SzhHG~natYSOlYOWFOq{S z)A!Wkm-OvYOm9-qE;lJpKf=qu;tKx$4}5iH6hrn%)3WUxp}xINLMl2LFWT#R#@g$V zIH7@hYl>FML6m=L4IVhW&gbucm`6{Z;rPlLOMTC}>oPDito5PqEJm4V5LbI;_zqv4 z;SPBzOi7Uy6dlXr^;c2kp3>?zf@-w~rfiHMv(WY>^Mf;7(?7w_e)EfYny!?am~v=G z0p^R4DSxqJTQi$YVPD1CL^(DyK479phN^*7S4ZA3uDEknADl#g_0Sc3 zJL4(_5hF07LPgdmf&cjDckq@^KSH+mDu%Qvf=Ns-`^cHeaf6bjQ>SU=xjN^NbG&uB z!L?+tMJ_WEuUf=8j(oU+Ir9+T`>Gf6{jYvH3&;ef6_w`f(PrzF;3R|z76?5-CP>c6 zkvNB8q=sbHolH*dJ`C^v$Q^w0t_L`Le2I;b!`n9GEqvC3tb@n+%GvG3-WhIjXZY#A{sOK8 z7L^*pXw!CZX=1zjx>%?uAyI(dM39O^P-pi`SM76(88 z5kn4&Qi0+5NbxarP`%{4cP{^Kj5bino+BZz0$)IH#D{@>g9;JwFjyRT-`b}76# zy$DRTowpcn^jKY5rpd}0&c_Wrwg$NO*NzN5>GS__!&E=*?{pXFd$ z;w8$;{(8`iCYW#y2F!!bg7!J@HI7OPzzS0~(9cSCUvnAEv?+|owe-!qIfd|gO|9Q)8 zyz?WUVRdB5x^tNB6xa?0nMy|Fcv8?-57L34?B@)%WI}1-(R_Giu9V^#3QK89jJ5Q$ zlErHe;X8R{ded65qiT%UP4(W;GL9+VXV=ORzVDVpy!NS=vj;J#vU3VuTA0*cpD4t< zVXLr!v1eOFoPcu~zr6RdQVs;FI`9P$?MY|MikNmOQFeMC@Z^=^(nLzH3&nQnZTI|Q zATSoAdvJZ=kxh8dryj!0>}6zH;<>08QEo1C#hz)t@)kM16HI1WWIwYu1`-@FsFf!z zi6~x)vq(A0Q?CT!Y^EGm?>i}f6C)0LrUNb4u>t()U){yqK5;LbQ;U={`{)~SY3RIY zl~c-!b+EC?>hc=xtX*ppBZ_8Dy;N1SBg6Ru>&44ej-%xU6iY|BW>>~9|JZAJ%3e8R zJEio>oTL|!jzv2`6H`v>v()l$0LM1rfBgA}dGq`3V5#hq&0hwcSqdkv8a-liQ)*1a z_u(7y*j8Emk`Gni4EyLoK@O{iLc9?dj;6$QEW59{jIw2MStNVNGqDSX@d zcl{{;^wlrs8Qow5T>8V4JWv4?Of@4uJJDhQf9UReD=8G_6LrV zP45zOh=UExV1=)^?lNvXG)-HXaeRa)cIz1L=Z-TC{ho?Dy@Aq?4_JX2H(UGKx_<`x zg_Yq3u&gV?zx>F(eCW=5S)+rQ+e6u&VQAYFSg`@^J$O&<4V&vddTZ;nYzyxtFUAYg z@hakm`rfLdlZdQGbQm%?`5@1~c8*{8;cw;Ow7MURj)>JFejWUbJP4DJowWbBy`=HI zGUN@F4!r5Z$N0~G_%=@TGurceD6=U>rcH^ZL>07LE%+9uJ5J{;tLv~r&<6mrV7bgV z@pD~SKoi%EW$wvmJIr3bmyz-KJUq8}V=xxo$M;ORKJ%NWc=5qme)L5*a%JTu>kAKQ z-8|8FGR76o%b_03ZUc!B##U}9RI{eCidkY`O*YsfQC+m*}~E9_o5 z!q30#+c9ivCin!gZ!;;cpk6+makwIm@%~ls!&dgoLx52@i6a2ST8s7 z6FfqBwWJnkk+yB`MT0(w>`SG^yFSz7-~9F;abncM&R-^?dM9Nsy{kpgQ92<{-l-OK zl;;rNIY*x76+Pm-0ium<4P~j%^Nb-5-_2M!w3o64BjX{{{bUTrKr0im^$Z2mONaU1 zue_dbzU3hMbuT$cWxkB_!?}(>+r{7Rd5ScC+MbPb&dcnqp|fA2gZdXEQd+0?mn72G zwL_feYmXb^{K%f7VZ+0lK6DqWy%A5p@oJuO^#b$p(VemS*_tU&gbw&t*s<=9eI z82E|u?DRTVp;`w%@j##7`^&%L^QU^0^9S(LiwuprDKz3kSQ4>#(IduMOUqc6&#W-o z9LljTEmnQ3%gaPUeg4)=xg^Jv`w{tY1-EpVANihd6woD4-Bf(a-jK@&tJ(()twT z*&t6q5k65=)PO(;sVb6GrTW|7)9k(Gcz=vB)*5^4IoIC%oOACz=T`mhckW(u&M~_& z$DCvKlQYnQWg{NJr9s1DIXgw#8DLh$tn0<3)7(uX$DG)v_Z_`mtimMI;F;w{uVW{! z0}ijDZ5X*BkSgT_!l)sP^8`ooCdOwU#ar&V4PXB1J8`QjBM{R3&B=5N{(EX_aeiQMNL7KOLSefQA(%1{g$ zz(xjs?SK3ZZh!Wjxb^tqZvEI4GFB|NzF~sPQFJ#YW3;k9ZRcIPEx^?82A;a(O&>c0 z{K(J#I{w?o9tIyfj&$r=Oh)UNq>8JWHUSgPSi9yJ)~`8&Nov7O(xXuFkjW?! z)_ICUc>{+|e;S|ng4^)k&$=5Y++EkUmQ29lZu6bMWONw}wOu|Oql3~8`P(mu?M*aC zEOL*i(c2Q%+%=o46wH1>Et55@O1~B0K}&pZ((R#~H4YtrmYl0j32l-+-&4*Q z*#@Mh-vKT!H6@&U@)Yt!c8;^YdX!kxp*M6T))8!G01V<5Bi_a#+D1P8Y1}m0#P@vT z`|#phW4+mtFvng{@MM$((VpucPiO{cbjtT$ZsyP!1%$|34*;W`iCSN``I z{FT4|(|B}xHPW@Wp&cE<6b&XCo}Yb?^yo~5Dh)|pzk}O4N6ALW5HsabH*yvln`XCb zN#zEyHp$uKwPQ!HcGV%YDFdShL;xj;?@$89c?+YB)3}x|;EO)%KD_M(*Wo5T%e^is zL8G-mcqbhNJCapHY-^%&8}0*GJ%Y#ZsIx%;FITpzy2e?gpYjUDXiW2Eb!s0Fiq>2 zFoX5|U)FGmWkVS!QEuy_bs!U-dg4h?7Uhgq(qkK*m>HQEDK$U~BoLB5z>)Fl z8o-bI^WVZh`d7aKTzxB=V>e+7BTP7TqgT)8tm*0$vi`!!5_d{kz%0))0zhsPQW9mI z^R%n?ne8Z?-YwoR4qbH^>ChV5Br=u~VU&QTonS;$q|K8!x_J_xbh3ZlEA=6@dj?pMLEQjWWtJD*nOYMc+D z=bx7aFC!6NDc4}K#rkMO2BCGAfBeRS6MWwf{xqJzHCVslc1%ZykVg$Ni_&VEF&F?t zF8i=G&dgIZX$)?GQ%^nxWWu;<06P*Dkn~KloUP6n6JwmWus%JD=~JJ?TV8f2KJ@<2 z!i^;Bo()8a#5Ho6J{R5WAAZ=@8Ek?)Z8_3SVcps9pcpgc8cI8Rd;!42XMpefKYs?l z{(Fz2x$!w@*RDZ}F{ZZJibbjU`aA8`ge6>3#SB+=%#22rb=xW*we#IHa#ReEbJ^U= z;}^`*YvV*1t&K4{+<+Rn*()^}4Yz3WHfZAlE5~^-dlKd=F+m7;DP0P<_KuN_S*J z%^Xp4pO4{6Llj~$_tV$ILLAKzi`*|BEZv53r(^l@j(nPz%@P)euScou+RbjnrsY5h zQ^$GoFF%R^>#8!PMCtQ4d5vNzy3hR zcmCafjPplsL%QY!rb%v!vbDu-7ck2ek$_AYHy|`kgFJ0<=HwYL6B?3DT|lptk#rdb zqyDTgWQ2D(ZDYLg6xPl?jBow&cjL{UaW$@;*#svu03JU7wpM?Zf&cly7QXXu{16^| zszr0?D3CXC!_hUo=B3ZWJ3i;Nc+qnY%k!5yau%fwOfs-dz^BguKk(zffS>!%zY83@ z8O^a9FoA65nnK>b?(;87+4ur&Y%?&k$qRre@nninlyc7K?&P)^72AE?a+WFmc8ax8 z14lA>9}#zoxH~pxYt<~Ti&bXk z>axEWwQy=-*6jB!xUX#PbH~_eJGQL9j;_1-+Tp-4{}LkdreyYDdu(6{q2E8)netge z`&=}Xd77nBg>1Tkn_e#cdc-oN!RhN+SXlGv5!Axz^Pmb@N0lw8y9nf?PXS;5SAPs= z)^0*`)d_5;Fev~|$j!_zer;O95Pa~<)N-3djCB9BR)n8)S-bTn6A!8le zpi>XyIG(`we*K@sXWrhA?DRPb2tp@L^OYHxkR03k?MHzR{Dr@R^P?LuI(8FUN&vT* zY@EY%<1EtTEMD@w+wn&~?~QofXI_V+BT-sY0H?QsfAjC}$4~yN|A5CfGLBw%3-b6V zwz@x(H|P_6utD@ls-@J&L=ppH^71G#2s4yL-Vrs6rYW)unM6l`@Lul)-4bwbW96 zVj0CSX3AFW7G*1j*(1(C)X?9BZLb=g0r1ci_=XSv1RmHrhUU6wVVc&^asy7%@gskZ znM5g*re~ZQOs5&=&YTCKL6cH{O=fpTx0-a_lvH6fJjEg2#N^3O;I3;E{^~cr8+Tn3 z&&_7X-+85MJLAp+c$|T+`i>vP|9-pyuDKOc8lla~XU<5-$de6B&OHU%Jc&DQIE0tp z`yAYU;sieR&?ESb-+2(9KD~|R>YFjT>Uv}rK4p^G0@icEDcjMpK-O#ax1#$XBo@NBNoVYG)K1xb6>^Je#R<%ycD38bxqk%+l5rhljr~~ z5R(0joe0ftg)TPEI|<`T#wz@X4MENCy!~wB7Tp(xcX^;2)Kn>N0eAwy_x;#^#lQLQ zAIJL5cVR27gVD%1NtH5Ku7^yzh6+w-h%jzOm~KyS_Uw7xsAR{Tr0FNU0+Lx@L}F3q z34}F>LY_W$KVEy+Rrt=Yemia+i$Y#>-J|C%bYs>j06+DskKucN@SkD*mV2;4>u5ok zwlYmiM6xjrEgGHzlMUqU3&`7BXtyUAkJr&0I)d@xW0)YJB|U>p{j-Y9GOIx>%Gl0j z6E)q7O+*aNI#a;H?~z`r(sxj@jD{Jq!7Vi)Owr_R<)sJ5qiIg8in1;p$4x86@|4 zg|)N;td!YJL+)iG>%(Ptn^0`jYmIx!-j1C--BIGrkbMa?TGnGQtMIuN)}=!~qTbSt zUBCF7C-LY1{?B53%L_0WAI7A6!ALIEAd=}?N_x=+iCP_{20WSK%$YMXLT;MwPVSUO zXxkR7%FyR|+$5ywCJyBdY(4t>_@l3XAwKlJm*cpO`1*6(y>f^=^K~MVT!{@iz|0ei zW@k?^GWWM`5s_T`*&Sz;Tgn<_jPe$^-2^r_z}x3>Yz?^cmg9KUOYg=jU;J!5|5o%* zQQG-zNiqmBNkGus%%FpGa_wsnwWyR$hP$*mS|#ZC?90ITVRnn$BO?8kf{US)7x6N} z*9~t5y30fM_GXyNiB$z@8G29SnMvV1XDOUoVb$pO71(#o77KAHuaRHNphUZ@U9^wo z6x~baON}DmR5hOk@DKwZ{H~wEqqq^%BR682WbKrKA|mynL%jjgnftt?Z+-TD43=YZR`g+9gvXnZ3|Xxp~G*o@>6jg)2|^dK*9x``_j zI;HQg>$C?YNOw9n1l_bX0dHRbZJfbqdI~okOL*yBx8rs9y%4W>(Ji>)=M*Xv#9S!DpT1WXT$!feG!D!+)D*ippPmFiJ;$kS-8kXfri7wh%dHDJQ zJWVeTiNfj4k#QFrmpZ)*wX{lafx?ZiE}KXl5+ zy2jp0e!CZ$?8Y&jcFuV^Gb3VUY&UR0N7`wu$Gli}IVY00pPRf5nw&@8x`1)s#EEOK z!Yf~V7hZSYy?DuU*Kqw<)`t&iOKD1YZl*E7D-Dx9W>;e7nd zhPB^uDV6fYKv&$#Z(?T73xsMOJKP9#5m6JMn!TYUyj;a>hEnP!i27Tqe)}olD?a>>F}dNnn2fK+7Rv(&0#!1je#A^fa`RQ2 zv2kug)>Z9kMc8dxN^7BHk^e-DF}9I5p2Fdc$M9WW^@Vuji;m(dyU2nemx8GOQUmYp zBoaAOdkAf31i7jRgv3$-2N(D~kOlbfcI z+VnNh-&Jkbb&iQZ?Kbk(259pnu4*pexi?>h*S++Gc+Gt;#65S6W_C*3sF(^<%r!*W z>-bV=UkuSt4JE!WLdj43J?N-Z$2~`hmqRd`sB^qh26Uus!{^~3J@%hcUIjG<)`Zh4 zk}rS=^Jm{E_`4FZs$hDQ{Kha!G|?^E*W7B2c**}tsI&r6N*2Xn^jQ`1lK{TwhyFc& z`QvB7*WZb48es~%yP5m*z}-eBxhiuqnc%{?4U8$ts8q*YA@Uue zU5~tqW^a$+*Op$A)$Q_;sDrI^cM31KC83N3Q=*Bexi9PgvVwcbcAsJ%5YouUNN8*1K^b9m9l^USy%yL%Q3g0HA5c zm~3rhvboij)yQ2uVd%_RMw66VtkX6oCqISfT$k{@-|!wh|2Vo=oXo1;0etv}eg*&XzkL#P!*j5K2GcY`2FU{pEF*bleMmC7wNV!3N~wQMY6jUZ zTan8>a+V`i%q^OfkeKD_m3D&Zh11}z)3|E1jeDMbBmU6KKLfA1?{3_FQ-5U1M#O%4 z8cy~*Ihv^t{Smejj6XByplyaAR;&TUa_o3CP!Bzgr}YZhqvrQYgmH6G?pEc2=N&>@ z;|B&_mi*p=D^4lb1h@2U^gi#)3ZsvwL>I$};VtsNFQ5$uv&^ZMQW^6#1W#M@SF?{O zg%!)z(?M3<2U5dzZb!O9U;Sf!6;qeD?-*c|RU-;U0;*KLST3lyfMBLpwZM(J+dD(rqdZssb zodNLge)9sp{crv#aKqiWFun%UB-e&AOQ!*<WueX;u=b3Zg=&M!1P)D&0U7O~A4YhjV!z%eR)a7nBE*EU*1}dKi*|0^(lPNYg zx8(?w<1OokCO{e=whdvrxoJE-i|r@w$D2O$x%k$vd^2v)%}ncnO!uPSfJH2mxZLgX zjxr(bLIz<1!g&A>oB{sycl;<$;(Fwx$FTvqqr0_BG8o;F%fvFZPSEqk%mB$~834%M zSGFe{p;Oevpq%9z(N+{OZ$5>iw1F2s=VrX&)i1$oUiJb!>qcOWfwd%~V4IfryQjIo zJEYoZ_x7{OINJ9z*Oy6@>Bz@O=gV@=&cX`eM64?FQO1VsOLmtVwQ|D}>8-i@@`>)T z>=4SzyLtZ|jrlQme@^*wE9Dv@BP@e8K`iAVhOrD{LDa%1xi9m5sc|{dv1~jg9+nWx z9@_aTO?P8JHcH`KPO#Rhb9$Ed&wS5M;}hH0qCI*GCL|+dJ8Ns}f6(da>2!+8))dhE zkgcs!)2*vAGdO2aaFj9T3C7d2*m(Q_eDRxJjt{=)l{lV&BV>0kw-|u{Rm$A$((aXV ziHA1QzX0H&P2g+3`$uvAxuf7?w_zJ&OsVOQFJ)1>76$8Xaz9Hg>%$DnI#rJhaEk^E zYFn()6qL8nZd}0h+$pT5jOX2P6W;i$7vqgDzYEX0Nk+tnw4>2&)MEJ{Z`MJJWyd#` z9=(09l$rYxPj7F~Y4ys{$z|+f-30*Ky=~<)6h_H?2uAPAc-1g27i#6UDm)KL`R>Xg z)PWL)%EG6YS+Ci&-Pd6Kb-O#Gr~QbS$(>-gVeHobrGl?yJHe&O=cS5grZABuKl$@mzvUimHAj&tq0KTXmh$UofO6YnI>|`gRiZ$vM}Qh_tnH5g zq}*amEokdW@RJYXE5GDhu;X(WO@9m;VDv{VvGse&2yMsI0bB-#qGzh!RzmP0p9eQm*V-i z6OJ{&VSQ0*1ie9vBtJG)o?z4P<|c&x^a%rds+7IFdHJ+5i*zQlR-V4>V>nTcqx{zp z(^UG77;?MZD5cHw0tMcgU5PH*)!=D|cvx!Rx;V_A(ooA;UsD|tzDwJqvrI+C#EeFF zRzdduBh#Xv2=fye9K$j!vh#io-W=Wb8*2GRMaWBTksoFs=_AjU#gN~j_{{!t^Pk-= zu$$ZI*bV#WOw8#mXV>G2_U)Ed(;q8o?w(WfeWXQ&pnEpk2ZMiOYXwk z-uNoK@U9~`)aWj02F9w8NhXYCBNzx7GPU362DrKDUj400!GiWL+q}0JOL?=nyppZS z<|0_yOMHy79NmXdN>2>$AfQyI&5m`WAUYYJZwq4nBM;4v!i|m*p3dCkH*};7?F0jm zHRUc4`uyU1VYnKJG|cvKzABOAN(POLOF3i3ib7 z$v%c(3&-q+=!~`$wx^A0znG};U|F!P!=484JEwrJ{Ei<)zTs|cjjz+uW&etiDdn6q zrqe0V$~BR2N+#zPXp*eKW&(Hu;uh<)h3%6M;ik1MeD62?Nxb-3z)=Q{B;5#>Nlf}2uRq*8nxi}F_b zsb<%93C+yWB$JcH_cYYoKW5i%76K^AN3@Ib8f82phF5~G6Y+Z){~kN>vtPkZDf^r0 zJdey=`i>YXAM@vby}Q9eFk8xOZ^fV}be94#(@{txYK(|X@Q8jQU1@q@uTYBnQlrL` z$cN~T0l+0fNpj-eyu z?(D3ErN`k2_5>opcC{q{X2O(!jRZV+2Kegl`VoBU!Wz=mH)Fdw1a1z=5iS5k2@_Sy zMDoZ4W#}L^qe*bn>raBuJ%;0lCwSAVUWhOF+|R;uPsm0sf3p?{4YWq zT=Kt&-t1!dHUCB*QF7lGO1XrX@u6=s8%m7y_U2Y&Wc)56D)AxuA-Da2$d`zi{u;f} z#Rj3q*V1?V^Fv64@P%{GQV;2JBH_IqIGscY^&7$cA z*GgsIaz>(gmF(pm zz>HF6?$@4|QOZ&`1j-cKpKg96Ww$ODfO--dXz2+Q!- z!_ybj8?V_c1y;($5SFDMqKgTyWjy*X*_ANEgi2T?L`IgrJ(i(4XjqhwMZB$=XS_;ayIYd{*Ir39t~P$QiR z$jF|V(WERdGO;M*>6ync-hK-A-E|Yb;o~mE=}~fzc8kmQb~?XxFw)o6k@zU*Fn;agvam);>)d)l#EAC-UT|V2ygPJ?hr;ec?>GK>M8%LveezRrBu6aQDIP9V?!TXJAsrjiProX>a+NOzny2vX4AY$Y!{=H0e zzvz3$fYd#EsNvx$@czH>lQ^|@0@Jl?v4xQw9n!dS?ysOUC2S+*K0Qg+opX!zG{JcL z47MNpef+7nzY<^mu9tQ1AScM^m}P@=2iB`N=lQ0c3ELS1>99;eIFE!!Ccp>&{6D}0 zXAc9%Zbgd`GL2=&x221LL@g4s?7`kRh4$R1@vLh{c;_E_75>PZUW!|;=`Z&%Wh~Rw z8fP(WtDzKzm7&SovheZ}!;P}!?W1f&ME6>_Tv=~6c)zvuEQ6Say~d*OqkGItboX|i zztL=VsOTDVkKr5N%`W=!DET+c#nU^8T|B33gdVlPOBkXxx2QNHJY!>cKC}Key2o!b zBPb0|H^fMUba@&dPRYC<;rW6>T4P=#A4}%Q6SIr-5v6!aVH!#_k=Dn@g$Ard-+FQOobLe8p?PXYKFKmMQaFMj=#7@v4PHgiIz5vHo(v%VvY*6Pcw zQkHMYd%_flQpR}mB&JV3h(G%!Z^nDxbSJLqrhnZC*cOHrtVgKk%gFA{mUoefWRyHb z!f60M@ymaJ@BiVS#i0{-W0MXeLym7j(?|@AC}Whj!P{rCeflxnar_v*_-(JpJKlIF zPOQs%v0ZnW05IC_?(WF%ON~WxHsn6f%O2)Fl*j1i!(7IHOsm0%vENWiZ^=HEK`E~# zGc@0&_TST(U5uxOQrUPrsQ);t($QNu_8X_KOH5e>kr_1%G1H?&14n0>_4b~TrSB3v zle}H@Q?gqYyYYK5P|7m~M!KH9=GT{Bt?W=KoA_&P2oX*7JqUdBU;SZ>ZoUUwqhpw|uEVlk0-_t2S}?%Lok{LNB)46y z(FCK7lNg`=6u$NSZ^!4o;->B$l_-U0Ja%;Yzn;Z+kPAm zo*#pbUXPXzb?2E0QzT}LnL*oUuyy)j+YObSzt5 zwHb{XVy=A*QRZU&CA)}aWDy1a*Ww*A*WBW7gdZ91H?W%l7|N^Jp~Ab`_mDsTYl!BE z5}zY|j0Y$$w`6^|gu$}Wt6ylIP4I3I6C3S4b0TeIjJI1vKZMBqMd?@;tNL4&{$ik( z2G5TYJl{%Tc%GVh87ztyA?_i%8kUKpgcx6!Kax?fx%*weEoYs=)e#^wm=&-%YTYE2>{hFpyjNxdH2vLCD3%?`qL^h(e3F3+4E(2$p2b&w-;bfW>G^2W8ggp% ztaFPoTF~?YwogBXtD6Zv|IM$&dq4j^+^nxp+0O5gp7ABiZ`fS67_<2p0<+stqo~E? zc@@jP<{s(1z4ucZEk#&3Lv*D$4+=`@_I7?IHPU+CN0ewIpS=G??lH_|{Fc%c2RT-n zJCI%GWCZM<+5Ni6`9DkPhjv^+`v zG6UHu3R7qRVN0j2f8t;NHh%A+GZ-Dc0oz&Rjzt^F-VXiEZ5-XmTfs@6R6LSe;LJm~ zZt@tu|C`>2&w1fGuJY@$nqBW#&g~W&`_%8^hURB>+CQUBz!m}j>3{r|D&w(q8uC;X z@&x(Z6Ua~8kI#GAZTP?c@>k*OzvMpLaRlASU2YH4%dNFjgJQXAIn2TA`zifpK;f?> zi#{!0-n|S*S@+>Y|DMiInZ~euJl>C`A;#%{J+kf#+OLQ_HN^aRHxJK?8jZn+xu|R+ zN@2$|8e&;SSRLxhP5;b|0T4tFXN0F4DKKqSnBU0worG6gciw4ut0KnZ^9IM@NcRj@ z!{y-Lq6#U>i$Q4m9lx$3nQwAuTl;4fMP{?3hh7pg0dR(a|M?K`jUWEMkgs_TaP$Uj zBk6G|xxD%+P6jgp7dYXm41D!p{Biux$3~!QZbfDW@fMoN1#F#u1kXQl6~6XQd?8-_ zf^}S@S9sbvV*&uqXmn0^68$$by*@E3fR${d(*orbq6VmxN1La)^tuiD>1g{8fg zhnoE=hX*OEYt2{^>tm^^+z?!5u{JKrV>+16-n z8EPIfvb6NgL)<-YX3IyWv7b5%eDaaUv9`7bo@`>2H^Ju~!`j&g@Kx`86@K``e;jXo z;X1AdaG3ii6J@TzPHPK@_2gpd?_}q_#`w_F1k11+qp)KcU?@()xYKU@esM)WA zS{R+I7TimA7_i?9?6!_Zl zDcqTK>MrEW8JRPtS(NTXcT{iaOG);3hJn)=IGJU0)c5_szr{x%IS)E^98BxrEd0!Q zDx15Qb&9zK^ic&krM=D*thZ;e{p169+3m;h*S_To@Z78V^Sze(5`SYpSdT|VI{TfI zV_lZrxG+WDI*+4i3+r1?VDk9y;YByEw1J{yl=32{)QOf{JcYs`{ z-NLmvZM{4W6g*;@O69c(ktg0R!tA5WFB?X5kLD7sr->MHi&&QKVxd+xK3$#{z5JKm zJzWV#WAVmt?9bxyvR8}OV_CZrYP|=;c@RN`OA(;{q95<(?Mk#I_lQVeqPg72kn65mm8+Z* zCaRRT^*0mHW*OT}GH`Me_^pp$z)$>(U&Q^7oI!K-Ey$xI0OZTLF=E(K(l%XH#5h3gCSC)6yqam_;ny^MKM(ufQJo@{1*Xv)1Z}=0h#c@^0 zGA*3r#Mcb6cDidkjeKYBcPm?CVUK5QX5i7&Eq?!@C-CfNpTO~}WG&lvRF4RNzoaD1 z%by2>F1b=JVMyjmZZo`6L>iA6hWQ)vvkFS#?^W2lMJ+9>^00&$c1f1ay<}H|PZJ91 z+N<)5s-JS6GW47u?I5B>^vh&^2t(nQm|b#v1_IB^z2whO866B%HWX={0CYH)WEb`n zj0+%~%D^xF_s8(V|K#WKsgs+SWI|dygr;f0)F7o1n$a3CZa|}TOtA(^YqC3A17-lk zX=am?l@CdE8 zkG*IdmZ4vUW`AK;DR;coI>9W;g2Bi{nCSb*|IaT!i0}X5pFw-otvGz$Z6F#U>+M%Q zJR+9!zPh{G6mqsk#w^^U62`stl+kRR#`eii;49zthw-8dez@bCiyb1F&GW%Hv&e~lx%FQ3^n>yP^ur%Eq*Tpt7AUwlAWh7*)M_*)6A>* zzfw?ZzasCkk9ig4+?yF;P1)Z_gk>t%5}93w1_N{@`&baqU@=NO8{*%P+oi^(NXtB5 zcuq;fZRq;=S>VgQ_3z{C+D%xy`X)@%7+^iZq`R}d`si-9WPM0jE1=aiKt{~aD=#T$ zBup{dK7+{|^q@(au>PG;T2#r^HFfT}(v2)-dFTP?n`I zqg{>PCHkFW5&yh=3bGrOErZ4Mc09+xEMvkJz!ret{{2s2bmS;<8iVz*h|yT5t5X7n zTYR9i(_&<_-M!5^?W^^Lc#6bRVDl966Zhj=zT(|@=j(3kuFWJ!CpxzifLr+si2PZ| zPo!>?Tq|E_+!DXMlZ=i&%N^Wv47dnd_FB+23N>@l)&>lrzTMf-XFT zeCi>5%Ll&%Z++FxxQc)y1dKV$Ip6M~i{-&sPS!3byd2lk8fCYHntKe}eogi*Z2OCK zVi97!csj!KG=g+bi@}#eNzX*Yu+40G#``Iiou?t{UvImV@M*NAANw^VxxJv@Sb`)8 zw^43nj%74v*zEkDXZk8wm42_m`d2eYM0e7^MJNeQ4W7<~JK9B|^qnGKmeHR#N8X!1 zqlxMD{-fWBS{OU!UytDt**q4}&yJ*HzRqm|Pn_NajmMa(f;1ixNi|OdG$16_d#Lqz z5HsW{Mr{rV5QU74HOj!oY4GV!;afiN1$gVLPT-nG&i;8rc%5X)>C{~Cfe4E{Gob1< zyd4$@zb}($j*V6fzZ70X^s@{){<#husUloGv>jkBqB!E~!2mw>=s9fj7&IEs@ZA0+ zIN9u#NphF7Jb`GpYcT_qGYA=pT43`O==3M>ZD08X_}rHt$F<3wL)QDSndN|U)>oc1 z;`!vSh$!#Tyclsr97oP^q&E-CpXZ}t8M%X#z4(hzK4vb#%ik&})t5Tv6MAE2 z&E3akiSw0f=~bZ+H4WAsN8C@v0uQt(d&VS9|f%) zLuy81&kP{|ZY5dh@28zln? z)VL*y5JwFqUSq)ia=>J7C{06dD9BH#9BLSndyiTgV%;&+=$}rAyxj>;O1y>HTYV^m zTk{9(r1Lop!mNTVfth80hyDY4C2caK<7vH3#E){7u-1S^3}wCsA8sr-FXY}_`r9ki z3aMrvv50Q3(n=Mtzf}Co&bNq~mGZ(XFg3M^myX&6|+>Qs9(!yOS z&clzM6I^BRm2_wXZ73=1XdXf>+$$Z%w-Wzq;IR3w#JiH+B9#1?EG!G7T{0^xg}tA^ zy7T&z4?T`%?FcB1z?vUs*~#V0v}qc-ECc}Q)st2=6HkyfPa&WA6h8D7Uxc^4`W9TJ zFDu!#l@00CoRvo+nF2SZx`QS)mhFBj3!j!n^&+~P*&6Yhdkx;b_I)X_N~x?udpQt! z7|muEWzjZ98GXqg_KOUclLmxzCw*_-*Iln`nHecVU#T%IPP04048RWIP$-BcTGnx#f3=n$-nn0Z8`9mvz-BoR{1{Y6?j^*i@W7fh%cH;h2E!&G5-5<>dTEW#suT7GiXnJ0w4O5@5b9-bBpYt@ZEIg~4Xn!N9Wr#)@_YJWwfZ#2N9z5HTO7FwVmZu(bBQq2 zIozA}Nl*%_WVZ-?eJP87&E63GFXB6?o+M}o-G$ER2WNKbDP_Gp-)GKib8DD(lKE#a zj8%DB6aHwwYPeTAB7Z!(3Q?h9Z63D)eEbREHy?Ny<0IEdLm6f}%uGb`e4}oF8#VGC z@_Kt7+mGLmulnM*;0r(dPF%(P8ggTojD!`T`J$X}oS(rkYGu3Mv7b}zc^car4z~$j z>6ojc1u)A<+29qk@z18RlZ*tUU!5Umlp~XCh>g;ff<--_McA$XMTmS~w!G@FHIvnP z_%&D$GMa0Di%_Fmmd``{u@2|VR2xYT)?oKt|J<+s4$ksb;N}RX%%CJkqR=%`se2*G zHmML84Nq_=U%>VwzlX1Q=Ns_HKlgdK4l-rkfIDSu3YiFC(r3<7pGGSuzn+!h&neHY zeJzW~$7qgNwfuI2y=q@-;neJRhehQuThEM-#&`Q$#OIoOEWa3Tbl(YRU;~!br)VF| zmm3TDu!z994e{SFw|?wK&}PSASyRq>IYHFei_kX~&tRumMNqr)aeS{;3`5QS8O$Sg zbeI{fKG*oz2Jj2N_7OD4Zp4H}$b}9mQKOf7NP|pZtkD#Quz}6T?#KJy_F8<|JMP7` z=r0E8--nsSvh}L$`^v$xd>F!Bgz*gK;oBn*b~8q?PDR8zbl|XT@(X!~%fHoQlB;>; zPThprXV_pP=guUsKx#)14kAeZYUYUDx|`4<2&z}Go@O^FRfIYg_3#bl5j8I5lOJFP@{EEysEHVO06*li=-liM^8bA(ZL? zS9StlF7)NuzuF}jmS4lHOw{e8`>H6Fm2bPeT^u}I4!CMGgBl+?`U=4!_h{|UCTE~i zz!HX<9Dlmq*GbP&GRvkf1kc9QuFbfp!{23S4m$kwG~9kI)3b1VVBM|K zy_S&@K*VUMA1~XcFFBd9T#s$PgY|E>SheBs0=+7RgnU)|dCZpUV*bpI#EhO6DI3MI zbP>z=^UAR|#~Fax{3ej>eAb=TBJtF%CI5f_`C)wOG-I@WH8`6x&NJ)KLoSn^NvT}TaFm7G?%W>b@-kGSnQ3%^S)vmC5az;K z0-iqljpqG~$nRJli?J&G-owf-D&0<*EGXaQ+M=E5mwEoqBFguw^bs}p7_R4sDQ1}i zk>RfCSyR)5EO!yiRPF*}iEM?rl#GLk8dFzA<~+i;y* zLpIDdQafvm_7WxD?KNUql;VtKQ=-8Es6$r@tek4);qSbkmFZ^?`DH6zQTDqTX|+qx z^O(Z;MmMWyL3G{(eiO@n0_$JRd?`>8NZ;W5-{`)3ENaxvJ^mSnd*YFw(M&o7o^MS=g(95Gvdk^hme(OjapS%SSP4-e0CUmm4$h<3j2M1|np_Y)!? zBfl5H{Ks(i0#PA&l2g`p@sIHrVX5 zFK6Rr*DdMad1Yj@y3NIH=+ezC0CcaaxL>SHt^x{*Bbw*1kl^B?B*?qNq8_HX$G>GU zyL)$4_KASbW7Tl#sE_=u;qW{cnH6`Lev?0w<*fHypV|aI^07~#Idl{`1E37b8E9Kw z_GR$21=<#4OhB8bfYT4-J3sgyyy!-`7^KT%@|^-f+`YX#hRZMVHJT%Ajm!QRkRHAA z?-{Iy62Irm-nXZ-^@AXN!%{dG3nu%u_Iya8MI{{bxfsLpyj%D-fT)-Cy@Z83qh#H( zuPA4$U#6^e44@-tR)wB`ULjMwM4@Z6>gMH`er2O3tOpe{xjA52tCfW`Dwx~YOgbaf zDde2N8E7-`u}^N}$#YYrW?d?dd#TI9BrqCk(M-={^YM@4Yv1?zc-7s9am*ckvJQj! zd%D#b=(K1XUtTqfjVYPOgD}N7PjKdu2k@nDc{$$s zSvTWwcQJ_NTSfx&4c5gSA=I#Hc`aMcHTVWSmS497P;fKEM&JJ(L_|JDeqSyaKgq4% z*UIGLAkKI#heiC0{Jz-e(i2{Bv-RXoX$P~tJ(0vsEaNDkghdtTO2tqEP-`H(kUxXH z#gP2Pqe>i(azt7p26Kzl2z@3X6Yz;oKMoon29l0>S=6kA!2q`y#{MLCT_X}?^!lxgy9h%cWwOIO3COzYDHwYDmnu_XWb3Y^JU1k1D6qXs{X z9oq%J?hF8lxo2|Ma6#6(Yy@q)#;gL#=wkIA&0ZpA+EBCiAZs)OtrsNwjnnlW)|k|= zNHB-oR>QJA%wam#zY=^}jjrQk)mI&*yhq-b;2V#gze!I9l*5>%?d{ASltGEX)bpmz zz*A?=p`{VPq~SYdf{Zn4F**GRo_7P`TR-q-T%GhyWQzlG35mtqok#3srdA#``_(bT zOOGKrww(7In8l2249L9kJer5%E@4&ry@ttu&AbT9@NpIF)ZY+FJdWi&gq@V@{LInb z)dMV$O+(3jkw0_mZz zra`NB!&@Cm1dMoseEta>o}R|HfA#xt(-Ghh%h4wQ$YC9MNKP&$A}@D~Qa&O-Db$OS z9}L((gVnHV8Shjktz1`)Z$F}zcgtIJUpCL?FRm-IcFv7|M%U>V*S2*UXC^UBAWq#e zj(Nl$&E*AmO={U(LQODZ15<+cQ=?f1R!Fd9~$o)g*Y&2h=fV{b z2FvojRJP`K*)Vp8a(lHZtbDBfz!K^A?xpqv3)&ZS^@O-x!rX^C{~1xjI;?65*3U*c!U&f5e0UXpUGsvNqXWrri7z%_3gKFuggJM=h)v#+8bi+#AfjRxTwNt+iE=|Nbw!d;ihj zqB6TQSS;6<8lKNJ9$D2kw{8FnsrOlwYS#|1+t|g_hi5ltcD2#YDtBgFkIthhTg!@U0*GVqDVzhZAFz84c#sl7gLEuGUkA!+Bj5v2Mov zF9V}5)d>!rbaHja+@gC4Mz`1bzuaK`+bxVQL;Q>7Y`^4YJAHZ8%Bogo@%QP75|4-A zdCBPapaA`gP^EB~X6s#o20$R0q9ai>T?9HDmwyRJ{k8fG?FH;3c)_z@&)kxGNhr;Y z-PEbKH(GCh<)S=t>jiMOF*3ff+Z+`^G&`f=dFss`wK9!}Zl&^-U&$9ygOo;KO2}$E zPQXi_e;baCw$bEGG&+c_nmm&ad~8dbRCG(e0t{cMBM$^4PP;>%b{Ez z9y8&F0`h$Hh~^R^O{tNo!TaUPl;A;zmuHWT-`ZYAKCBAw$MfHB)~(C@d>u1-E00Kb z@nIw6#d5t{@Iag7QL7_Gu*{^f%}}@wIg#uoArf7h(Z9+lzt%SN!HH6K37GkFgf>5( z$W3*H^HrA;C1yooHFHS_OQU8_&lSP;-=w`#AFt=1r!A%TprV$SnCB9IJe`NB|>wjap8N6GGCgv-aLp1v`HpDouM09-C_R{k`mVrmj z-j{Q0^4RQvYs zC3t`S+u|^PKJ0^zIo|X9{sT`F^B&CxUp_U&awwJ?&7Kcr`zt64*ysh2hb6#BoG}J) zbpk%{rSHHkM>Ed;!AEe{)f0Tv``;oLgpjNs+en+yUpnGZhON&!qyCT za!CNvY$HR)BWGt}c6?G^_B{=nS@IhyE3xnM5zDCNZ+BQc0@@8I{H+3_{vBO2`?8=| zr>u+$BfDre4DnPh$ytr>r8F5<31=~u8zI-yvMOqPFuPhjrMk?l9W98yG@h}(0tL(t zUTqgP1E9jdFr@^_*=bWEWX>~JgOLrnL9&ILl;@$v*ss`4e$DT0!tjXVC^|}BJS&dem5^BEyJa9FVM@R`20r>oi(megU&HHP`5Cz9 z&Z}^g^j>Sb1c3Uu5~Eu@Ca)MP72PnKZ<~e`yOnto7*OM@)$4f|flo03VB4r-`HPKH zAr9tNt}wkMuqn_od>NF|dQec~^&+g|Zxz}_*lk$Re>7iqxQf!|7O83aC1G_W^aEPI z9XE?-F5iA(hc%qzujQhM#?ck9zJ0fsn`5-upkOf9wp{@lmy1${lzp#TC+oe zc2z`1#<;w_htWj)gMd`V)@*W~hu zDUiDUE=)PA?zH$3(rvKxcv-24U6*a;oW0+k%v(!lu!!~p^o;vpRd~o9X`(53T4wI1q**s~q0p|y@X6Z6l*C`#wsKXGda{TqDBqa`g-9&mMW`_*BGPf8hZkw0 zoqc<|A%%bngNRaojPDUc z{D^+ZwG%mKG^y$8pAUUzI@_7ej=?fgW^D-lbTo56jb_t=q>U?*tVFTh1-xXV7c&^` zErT4UV@fn;U+d{CLM<& zv9o1ilz422N*P_e{mjNJ_C_iD^be(PC$KQ1lCAM2%13mI>8q7Pq%$lEZ&~cd?_Ob* zG(^5ew;}#}a|xv~@b-S0$o8-hg(+<4C^~edy&bV&hM)vXNQBu(#tmf-D=<1T!tAKf z5EvrU%zenbES4#}{f4158y`wEtMDlDKcW^Evzv`^&O_-~xIrma7-Fp?>cggob&sQ^ zJ+A55x220)Q9#)#M;XPce>7lbbxiFAtI!Ey z4I^p&W7%OVo2&HxdH^j?RZ+}#bkXJ0c6z6o-O_qELtfEx;bp6T7Kp;~X0L6faPf}# z&vQz)SL}_dH&ARTH1P9=-p$wOa5!{;l^LX zGU4nutipo`&ri<>L*$RQtHoF2Yt4^Oe_Z}$K$d(++qIe9*De5ZjY{nOd6W`XLM^co zKJhyV*E6eRzgyJ8-_NL})!Rp!SPnJ+Mq}m}M#-PYPWfqZqcU4!AR-;JC+UU3|tr zC6`V@ni(0JU7TSsdf{QC>1s7^sh_b*(y0-9K}xARk>SfQD^FsX#F6_vl&@X>)V8>Z zX?D%o_-XVtSU9V~;`OrO%_aCWmwr7Rx;)gw?f6@mo$xepVU^;mVOhG%jVKGtq`5@v z`B-xIh&s^wVK+M%`ETFeExP;ZA)UUS%B#tN$RCa3u#v_ZDVx?dcb}b^#Hn35yJcbU zb}@6&eJ^0)l^U%@ST-%bFlYF!7z(2nN6j7!+*ZX<8N}b3dkH?=jvpk`KO$eEAjJQ? z;ODHbFu_J*a3d)hnRO#wRVtKZ0yQbU!IopX+qQIM&CoRHNYqA(Y-`pbkNrq`*4-)} z+ZlO_SnbWf57+XTl594MJTy?j5@|&QFB=<{WOj0gH)aAp%S8gg@-|1mecT0GfDKN~mPmUipv$5(?EzgUH znp+>|yqm|6|Jk(9(+t7FTrE$B{8y z+_qDjsMnx#O4%Y|-95%EJIc%q%pXB9rJQxm%%hY@j~ZjTw1i(nt+yB%@9j#ku1;?E2|gKpJ#F8vm3MvW;B3k*(&b1FlB&rW+G?1WuG(9j<+DpyXpeju7>vfkF3}iD;h5df2+ilu+=me9BO=c(7kvI=p1r*{ z*D%DZSdQM!Bc>yk0i&!h`)*~FfAw!=>`o~FdQQ1B1sI`EWK@QhD4(K3LBY*HN$SC(_L~EcV+7pf-W3O7pvmqL}+xHHn$Re|_;bv{ zcMa2IO4E>hnQC}MG9wZBpLvP|ole)dY{tPx`clqL9@9ty*G?2n8C&=&TYe^msOgp$ z8Z8$lplw@>+&%vutnHLF!rkc=R~HOs7u}-S!}y9yo%D1ir9I@=yGMBUj;90kdx=Hy zmC_!0;q7C-?K|?p#~ah&!#6BLXYG)mJNAQGa;_B%&2RLIneiwwg|*TFebd2V zBTi@M5;cSvuYn6ndl@Eq`xtk$i{^+J*M5LclTUvwtuc>7X3ygoj=6XIwvkLAV{*Mj zr<9?JyKB^1sWdH5H7*^|HKHg?*=C(i?$%&+id%LnTVt*1*LYemkTu+H1C=ytwj-ML zIYk>uH|{bLiD&+sRNIcpopi9# zpp}al`ZP41a?-Lnd z=r*!xuf^8Ng)c1O=t!Gg`vRMWw>4{>u9h^<%B|O@%#1`Mot_75q%7s#bm?hG+Gc8?e1J=f*?WFO-Yny8G%-96AE$SZ=0zx_>tbT4W8pEB_Zs{lGKS4=Cc~pt z22_{@^!%Oy$?_ZNE^KCbGlDEmO@g_1a;9-o+qRs-@eI@0HVqbqfibIO&A!_ZV{_xZ za}gybAqc3!Gu4|o6YohAtrZd@3wdzRC?;bWcX2vuFBT6z2943k~cxHN=>~=4gcV_OEX-q+ScR)L$ z#?QbrwkgfrE6SO5Tvh5O<6XWKY$G~mBvT;DPty8}nKBg`d#N>RoTSt24Uz1L&KcC` zy6ntoUBX$dV-Q*gLji{{*8tt^X+u1w~>_>a@Co+_5+F7t0P#33c%m z>V~-)Vi-dx#kne?0=nE-B~OuuwX%rj8e%x!p2DctqwBO;{I2uvA9gagZqOP>%FMGP zU$ZkGYyv;I-UGJq7cj?#rkA>iscck-ah+!Qh#I)CV8+jj5 zqPH^f-;vhnBdzh>`}6LADCMjhf$~&F#^jZLB57>hMjycK<|P^Fc42ZWG@QEWT++=z ztV)@PKv^CM@M%XPv^Em6k-47Z&z3ih*2Cw`uN|AxCbH>M$9GkV8GR$o%s}qxtP_%R z?m7_JHcTlb5864;0sZl+VJ)Zc~;jzLMp!L)r8B=>sgvNHKTc^X8B6y0X8F#zK zt$k}!&nro1F9Q;O-!AwLl9h?MlgetBK36|Td1$`|Ph)BDb`d4|8cOaZyMqSbjxXYw zcaOhD&q3EjM873uH`5p4N5H0#yU{UZGc}RSDf>0(?(z_iuAwpu%Lq%Qw2YyvB>JsA z=8{t04~Xf;4tj(`1#~G;%EMm3=PL@Zr}40c%G^u{yBQM;j{sz?0FaT3kI!~1vo_}a zj_bZb&N+7@Uu%?YBT=s`RWT#!h-HkN<+zc!i%i>ytl#J*>B(91WQt86u$XFkyELmZ z?JmL4k*%#{X2?i7PxWY#7L(8ObUN)uqrU!mKBkl~old)v8Mn4}uJX#MTbK1<-R(T0 zQKz8b8VM#-V&>1vTjEIsB$p^Aa%pKjtQA>@=j5eH&#@F+kKxAeq-#!fhkdZa7 z05GDF@@%$olrobk@tk#2SxPcJZh57C#>5)UhDKW7#oFTWojfZK&(nScBVkz@EZ<${ zF~I1IwnTF=VEn;~ZG@N4i-j0RG#^A*o02fQjy!V?*(u%GR#adkWwO~RUx;Rob{*ri zaV6Iav|a$50DHu+E+;JAmZnt{GF(Nw6tHrLm8|3Yf^;l$FTqz5^KWS|dsD}qZb}JFC@YKKcoNH1(&a{=)|k#*CoAi^nPli>3dE3e z?xuw;&7K#4C@pL0&E4|hd1*Z9riOKN>dVwO-qvBXczr&Be%-XopLPsp?bm25P9irG<~B(Y^&N#6ugRG4H6`hI`EZqZmPhW% zLY_&3D$Fpm;1TVa<(4K(m!+u&&nqlJkC4}$!s3j1vUJxF>9K^LRT1Mbb15Eg=Vf6h z*r~ro@S%2V$YD^@xmg~HYPpxm%I<3uirLCEl(ER{DA3-{!tviFa|DORJf;)X6F8gQ$~x1653Y7 zvFYXRvJG8B*6C4;nSgF8**0UPu;h|+2J5tKC-1IGw2+Nbz+I?YxU zw2i1$K@w}6mS0U{vdcvrKZs=H*0yce)3(_vVmB)>YLKlMNY-#I3_lY0m>U`DZe~hi zCXCRw6A%$nBQpemjEEyrN`3xybZ+OYO|~ej!f8xdHoDnOrnhYk-^;m_lbTI|yQ6bL zrz6p@W}H-@EdM>7n2nDq$#F5bHp6!$%+AcVZtUp|DQv{EG}^DBUZ?ta4ACx{4-#r= zHyQEYB_2Wj*4h#{KE_|~ZeZ@u5c^r+NMm-)ZjIQ2bR$ujj25tUmJ@+zE|r~yO=p|G z8KvAOepo4c1{xwm4RaX^h+&)EBHBn(iZj|Ta`TA!xVRWr%6(dF6gfN68A@x+Z;5y2 zhET@V0gB=KM#rOVrExWS-{ZG%&E9vevTmgENhp zl(S5W!qTkMz(UgRAofbxc;t@|`HfisKsE~3a^VbgGs^|J?{_E5`YF40+qRXC2kYn! z6(tSyqg_)ZNU}~lBEOs3>TY za;sxrDGrA-PrqML%7^EFESm`L-_!PC$gj{zgBHs$`n86(Z8dBgsj{At)ip$~Jj}m@ zt>=wZso4n0+*vEX#qINH-}2X|jos)-humn}wo`V@j7$m4t%lv8QKf8^whLP~rb*Zm zhrGSqr-PFmK>|dP&E{{u96TRAFPUX1%p^)FBX?`=a`X!T7)?q@wy~_cRot zfJtsWi+nZyu+{CZ9te_dtP@&)PJ33iWa*ay-A&)obRY6%>&uBDJFZnL+fgdpecjqL z|4cbc9&JS1`b}hRD$&yAm4(@fY+DCdj%#_|C!Ip?kAPXHVz&G!v|Z5+1Lba5@$noICBvn6OsRc@R!8rxeHiW^YzmNjN^l&^u^*AbopwULv^t~N-z zE3tDcWH$Quag^u{i`=m!%{*3Bva8Zx9$2|X0bT|rK3c=oyY~gnx>3r*{9F8%2HVJ$ zl5FHL*|D3Qx|^CpI{Md|bTp{Svb+A$c3^A#=HFl=dCw0kLrY)N$jx*>U-^u_ZCj-A zs2geb4@d~5q+Ar@)Q;g~226Qt=aq;t<%~v;2-&o(<<+N|Y}!{Z2QfuuBVwcJ;n%Wz z`OMi(Y3ngBB3WOz^jSFUv?&qkr5>}q6nkw8bY`JfVDb)i<7NUpvhIu<(P(CgfmG3P zRFayW?mEs!-MhQM<;6NOg=RQ{2qqL_hgr-sN(f<l>y5g7gv>oFXxh#iw-M z-NNu;8M^!^EY0@q?Q+gYZZnrD*pw2wR!M0S zS<38CkEn)4X)9x1Deo+t{ee>2y%4G+aAU=0}beuJBp&XVYxvPvhi*l8W_jh9=bY4$705 zKB&U%U&T@$+bmlqJ>P756G&tsmT$K)ZMGqfJT!Q_8jTMF9p9ch>`(8jYJ>4DuvpQ+A<<2QHx1ct6{m~9l$c+i? zrmzj9Ykq*+P?97O&~u*V*XSdB<~&`gQCNh?sGVZ3!nvH-O&*5)`tnDmOr?RbX;GuM zvW%S|F~@M@Xw+cgb<;(5>4o#|<<^f5jh?7))NMDnDPuTUw~i${CG2mQf+`oAT8GvH zpjRTcDXk0NUNzEiZNzBt`d>>YfPU@W#clZkeER#&h7YH0wf@?B$K4HEIyG-=^lrME zA#1qC4{qhM1WA{*5#^;V^JCw(N5E)(y8-2whor^wEbI7y@L`58kzWqR;}Sn2N_O7w zGWH%uGfx}ke;#$e%V0Kq%QGr@JP6pSEnhvKl+27@@s7=FKK5SavMu@Q-tTWu`Wg*g;nD#e+b-TX% zSDVD1WYkXpa;r0AY33SFBHjJ&!s%YD>SiXae9P0uU0K+OSi_B-c^f$!Z>>=@dFnRi zIeLr3$LD$DzlRY0mEg;!MmyxzW3f^;l)@|7&0_iRFExDHOZ*(l+mM^VWB~*1*c>WK yxsPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D|D{PpK~#8N?EPu5 zc1xBXggqN=2+5XZqcDT8fC$WB97bR@ z*jP9SMObz?3DnRqG|#I!4+t98<(6CX?S{8II5}vZ%!?`e-?{5@L>zhS4^Pb;N z;c{Y_@mx;gX8!KOcc!5@7jG}lU7((ywgU;Rc(|R4*xMV?t1YrS^>b*P%0}~=`7$%0 zx?8TF=yAQB85rrE%GlE`c0j}GPQ4v4Z^tT73ebw@(`xg!G2~HKc>R<1t*L+1FQoi* zx9V-ChTY15&rV24pRFQ>9^L7<0C1NhT-qY zpg_=C!@-=dYThuFRH#e27!_3G20^AxrDDD-qlDZ$UzB~+p4M9LM9mDSt|(Lr#;c)} z1%?_DvC@E6P;FF}T8~&%$y#(0kp~}^sltzHYfZ{E{OC(Q?gHh}!!p0Sjr99Nmt*25 zr<>ou*PJvQ(b-LHV#AFkLTa2u&~Ndq6v6i114(T`>TuTq)dL zm?=!pXb6&xkY=L)^~y4Yv&XZdwbs>!aW!0y!!Z2Skx-4%tI{FA9%jhK%y2lkHO=@c zL%M5v{L_4Ce1x*s2@i}%ewuAZ|D|}EwbfppYYYBqEwJ$j|D`N0_m~AxUPh<8EfdX? zLiyGF(2Zao?gOQHA21ww+~(($R?gS^dEOgAGtIm5s9|PwW|-wCyQ>>gIHFDT3sz4$ zWQNsWMNV@M8h1wLoE+5c94~urW|hc30DyHJ?K|VL z4rzGhPx+#oKKtKxu$cK`xQy(^_w0^DGs}-|XGc%Zp@UN>or zK*=v;6vr?YBg#CDqCCxb_Kti^f9uSF4pPVmJM_*+jI3Ab1bTX1IlM9gKJo^}NVexS z3X&svD=N#?H_1?U*+rXV;YYH@=M z{ZRQL>CdbjG_1O-n?BzcnO9<#{`11R#(#W)OxO2#LC|prn-OLbW888j4Ps+#4f8!SeZq_TX{zhkQ zX1F+9Y-mCFV7sBDl`n=>G+h_wz}DJ3(XT4`;&?vVw6#7oA^ucwoF@0&G3=uwHf z46NdKJOUx`Zox%QSr$aajR8oD%}-nt0bJIRWL=|@QW&flOIY~a2$lvTkV*gyOE>3} z=y7Cm++DwNs=Momep69Aw^zk(#Gp z!i6&5i$}Cxm-2M{7??JxAK60Vv|B+mHc?im>7I5V8fLFNDPI$PIHi4RNAR6%rNk`m z9GT*MG2(6V*1X*qVfN^rrkl%gE?=+DMK&=KL$=y}WWPZ(mj&Au&5!be7;I-FWhn=& z(OLElpIp0Sd^kF1k@gz;Huln_8H{N22<~BF76*?beKUiVL(fZVZrPjZ%=?D*R;+s|vG{$|B3Q$t;1!Rb*La8VoaoyKgP#S!Xkg zPdEN*x;cDy&+m%Ndwypf`NhLF|1%y5l|hz=x?zWJhS4}#Hd?N|gG!xCmQi-&CMH68 zF==}|&8VwbP}!kQ2CAAjeQu$%rTONp-2Q1;?wCgKl<6>!n$LAzJO3&p&9lbipMw4h z4NHI0({>3GU)^SDY2I^sbZ5Rb?Mz?OLD1E9A^R)r`sR4D)(H`w3Z7x|bSoLvHCVd) z!)V|Ebc?UH?UX8?YxPmqScBefjUS-khmbse8sXgm8U&|X{u7vgGe8&SsT8qR(Wlf| zF*r5fJHi_4^4@`0?k>mTe%#>E3J@~&Xd#2xT}Vs1R`0AbHZl)vWO!doV$UMoa}RXO zd6R~3=m3C&`3U;7Tmu}5%V18y0n*NZb7KGOW0!|}pv(CVdGy9J@}e6}G;PhR^L4t3 z$}w`5`OoirXfcq~(+h1fU_6JDusd?No2M+d^Cf49&4%ih+N$iA-E;VP7{2GVz*PUu zCSmT6EXNryik@x{66L3I=g#rgfa=Ff8|zfJbZe|{FPj@Bo9x%yK!)u;@g8v*pY0D~Pg9Y-8N-NKeWuFbeA;B@j=YTHIx!d+ z8}bxY3_fh~v2Cf!%#y-h#cV}342W~Y)$oizXiGZ9Gn+>b#a_d(VL)(NHS<;glXI_8r!<-`Pnb}0oo-RrtRo3!uC;xnAt zU)wyklYD1bLgVboNqNc;itRa&!rjfWVW0C(h*1%6?YiLcZ-mqj( z!#PeY(H#o~lYIM2$dxlC@~&Yu?#wz-KWKazL2kfZ@9{d8M51!br8MaLt$o-32ZhQ! zm-Wo;zQ_$^##Hv$FE2f(ocVJ8`93OnF00)%13A2+q} z-v=tEoR`r-Y-sJAx6bltcWkh`D~~7XQf@N)HUs13vfb?Eh*>3H_uR^kdr-W69fOFz zw}thW6QR^;_6Ly$<&pEjQ!I3+K6H7DLDNc{!=6CtGQT;kj9Hv6E6zM}4^CLLwMIvo zHmqq`n2pOwjJx00FfdaQYns~jwctT7TRNAQZP%SDfHIh&;f7m0+c;xKe~vmBZ^c~L znqE#@!}d!qW+T2c$ig_y*$6XuAHpuB_>rX8T$AGfkPbQgMDdv2jR# zIltd1bcCOg`O*B%W+3!A%Y|-S_85N+rO;342eO+b>xFJaE}!n72H_bkEEMfnW^}Yn z?t@tw&ajoqsT_#xPM-9ae=Gx}dZBUm{)idRv#>es3{5}lMUI!tkk5sN1UuwtYq%GN z19YX^(ySMsd48BUE2r2e)HjOogdBKYcU&Vk&QG@1P!5q^#H%ejA6}!^ zQ*pFV9Nu`w-Rks1U&}}Zo-AK9A5egK=8Zq4jrEc`rpYS`3PO=<1FWDm__<2>;K9g$ zfN~;#;OvLUx$o{x?k$Gs)^{(GDiM`wvfG&N+tAF%ewZy-4@RZl$di~@xVvEkWn*28 zGpDuI&gU3;NBV5YxVtmf1Z(6)&u4cX)`sv7p3eDgK>d!Hu$)eR-GHEfQ@XSQEiwsxjbzYDXph}Poj&NjKRsKLdixaCH~o3ZfxP^5{<`oRff?Wh`AuNkO+-S%)$|L&%cVnI~551`c9;{ zjg2GL%@i=>mQwnr2=djcVTo(?bU?zmB`OfIXmOZRThR-t3xO>mWH`WX_Dfg_8j(ux4%R*(S z@|($9)7=YWV#&>T%lu?_KIeD-TC_LXA$RwP#~Cc;cSAGcmar1@%pTh%@2thDZsR0` z(yeWKm$mxmsqp+uSQ^0O{5S3xPez=k=QorMy>Jp?7`52w)!Q`Zb(7|CbjS`GTjOqw z42CuHQ$$nU7egiI8;BddvS$~Xj7ZH+@1o8a1;gFM7e3NBT=+ULuS*LhS&-IV0k~bW zt)#gSyWqn=XG_E17iOpD_|&g8x1?KJWf9x0Wb(vccF2Wy*>a6s3aqX`iF~%cjhK}z zkSsASrnj6&u^1481|Q&rgeKOiq7+x)yJ1~AInUW2J81y`Xz3xg4h>Vna%23#7cFRpk6g06W4AqO^V-2qagBkj+)ti) zWB%2GJCR44Vq^I%vQ`NI*37F&iP;%AziZr;OuGGib#q6{Cvh+t@ z&Xs}6AY)5+i*tUC)6Nw@A8ehEdy1T1&eI;f&8&dHC&lm!{p))+2FTksF6)KgN6xip zh9!->l-X(Ydnnwmd8RjMN6G)+f#XMFN9^H(`$%;F&NaMv$_PKm1nxny8F z>t$I6OpE@U>Q)~3j%cXO3?&pxrXp=O_#_#1HJ^J z)=n-HjgKVX89n+bjaisIS$rdy@p~WSIHWV9r~D4tS8!lQ%;L}Tnq{bRG1+@SIqF}r zVaU`LAODf5UM&ZLZnF*UAo^H3dx0{ia*>>j`-4x7dZ(z8VYKI5c7ET(X<1SSPRk+ZA-|u4@^c^F_Gs_MO{X3}`Skk8e4ZXn1%Sm$ zpEVhGOBA$53)i1pTemy4gIARy>9(wwd%R2i(|5w-ZwG&)589@wP=5GH$;&0y@X3?a zzMFjm&MfD4Ka5fK6Pm7>oz4Je#?-3Wj6Bi}Tm76Zce-)vBf>K*e_0@%ez?^!OS=gV zS)0m*a;~5hId3y$A<>OEk%L$#t?Bw}G&nMKOz^z3znpf|GboKydRt}8;F|S0DBpW9 z8C5fXdMBI@=ly<$nm9-IEUPsjS+jN*S}sA_d#<_ ziu3}f**X>KIZ#L}pbTSyVu{_aYd^1M=I5wud_UB~QMrN^X>x=~i?ten({DPP#cs$G zE1I&89e`;qkl#Z^9)U?2sS>a}nGD&|d#`ELC|^XkBz0_Oa-l;wHH4Ke38`*%$Q}lL zuQ7d^ciZdQB0_$M;m)=>AK-3BZ!kt90EtgaK)+AjnxFHmwRX#rBVMJU`Qj`Q2NTqX zX;}yl!!kadAt2P^K1J^Aw$tPpeI(yU_HOmCVeFQ2%v|+#?G;{^xu#8hP|IF!q$}{R z4b`5n;3r**!{_e*K@l@8j&oYE?Er|eM!a7R_XByzYvkKH&*zyxqRjKaL&2$ILYD$t zbc|W&nYO>^>`$~AvQ$C+_ftjN*-0<|GU^Uzu-F!u?1^ESa3(hGT~Hk`=|_l}46~oo z;Ip=KMQ`yUSa%~{J`F^07FWafG-~zhk%^5_R=mD&4L`MaY)?*7oMkp!Ieae5sh=*w zZ!!#^H80Q_Tg^3|3XekF@G>5!ov>n-Hr?|t!*U?e@-E2;yIASMW;ok);)Zo?A^0V# zi2o4`&o$``W;f?u(LX?*kn@|fpJ{G+A8rW6%CgE~XXrGoZZ`wUt#LEjXCWPQ&I2*a z3&C0B<$Ps7a`JeDJmKlF@dg^``_GFm-G0{8H zZ<84~_0P!ZzVmO^AuA6x(xhDT-~sUbdp^&vB`ZI6eS0ODreK+HDtN?Q z&B25=Kn`Z&wD6}8;cckwG?4xKp=3VXn`BC{$*B6Jf~d@Qa|^UAerpv+E+c-dK`c>u zXlcfXaE;xlYknRn5@P~yk2m=@jc z!X}(fy~~KW#n)H(6&1C_fEcQ(V&)Naz#4!OUyUlQf3-*lXnXux(WQNU*@|??R3+l-j7|p`X+-4Xw#=vWf)5iHPHdOA} zJ-hAc$IP8>ns39hX(zPYm{yhg0#<4AkxrYetpO;q=U`keRf>FfUE2P={3^er{fiEi zb%X6>#2LJdFYtN9JV+liBcA@Y+^z3x%LC%*uWH<7Q9P~QUszbh)KeL#R7(}gtLv`~7y;-))cJ0r`?Ea~uf)?sI8{F4!njM8&H^Hd5I#M2xfiy+9W zmDbN7)2+2}Sv#Sdi5S+Qh3r@`uA0ZIfY0@s z@8{^NUgvQ7o@o*4vEtm(`L`^M-`ec7g6WZS})M_n_yu&3cDU zepRMK_eI%LkV`;8<%s;Ec5Vad!#%4DiVW7{dFIedok-KpEp9V)Y}jhkw+ zW!HDV^{~7lC9M?%c(o@mc6PIHTUd6jaijw*rC?oev0V6WyDGPkwbo+YO)M#~dRxm4 zwgD~9=uMQZ=i7YkIu|&06k!AT3Jh$l?dlZpP>yw2a_Ou!*F2b3E)Tx@STN|eapM;U zXFLwTflS$%0Z~44`9sr>4P+J@*K`dN@EyaY_?NZTb;S}>tGvO;%h+c&YOOewarP2Y z;W9Em|8+x_8Q+=bJ-wkmD{}bvmG@X@>~SMW@fL( z%;IH!c^ZW?V9K9%(1%j`EKzTZoB2K0W&ro#kOtEwJ>jFZvFkhYs9SB=j<+;`00uqA zyi2a<(g7gfnLZ7xWyfD*J~%U&zEx1;%r*76wzzm|uT$<2tH*RCh4{dBE8|mxj1plv z)y$0K0wwZBBV+}YPG!@uv%*l|JJX;9d6{+$@aanPZKBRAJ;X{R+H87OrbEDjiw#+% z=lR(-dY!J&X>FWwYm&CgPvzN~Z?q^&Se=tjd3$)h_C|*3kIbRMfcZ>R9HjWI^U%OmQW0cXhQ_k(kKy)qrsPP*2*nFid0=}3)@b(HMrlqk=k@SAj5uGyb__VuRIvIWKr0?VWAOeGRtE>5e) zozSgq8|6L{x?{G-n;geV}Dn<4W@H%&(eO=iQ=>y1~`o4nhYIN>MuB`iTd>yXBq$t34L=Y1D3Gxb4Ww%xs6 zQzzQPoY9||`ySuhu%lC+(O~|EAM3gB6W8;WQgDnJ!ft6&Ch`?RGhb`nq!pdu=+rqV z+Ul8>iAmmC(uGodMlaX*M!8I8Il3QW*N^H5JLxgn*bV|1HrgS=O5FCB^(~CTQf2oT z1F#9Bu*}BSLl}0$T!dW_N1ei-e`GR0>+gm+fre8);bYHfI89^Y9$VpAnUx;XU)OPu zEZum`Bcfm+Le4xJl`c(bZ}Yi{GSJc&Mg-&~cQEvuL1n=^w6PPOv^75}M^!39*JmIKZn*% zFCv;D(^uM*O%6AcC*5W`PiTA3F#4M@OFx&*jF%Rd^&r)I4a@S;^4zo$X+Xn0I$Ew8 zf7Yp5^h;)jD&JGqaD3Ni{@G5MDCk#X$&Sw!I>&q!F>FgpS82tKUSqdu|2A-IvGL(_ z`hh~w?+eqt6Eze+|FhX!V=bIbv9!Ewdq|yEKnIpZlscNfAUdSlczp`T7 zP$X-RNcmFG(zJBI-t-l6%H1T!zYTkM@0_agB9pGU&lQ(_sUU2UXaK-}Pdm4>>HMbY^j8=_u%bSGfD4 zsRbl6D(kxTHR&U@E+*>tuYah_JJtOzsSAc~XSGg`HAu330x zoLOAwZJU-~(6SAqzxu2)*|_yhS0nDwwQbp3e3YOyzgU8K^|)hTM*6voDRa#WI~x6i z@T+A*_ngm6Q{9!G=7r%HHoFs~o#WmI8mFb%r=0G6=odNDdEfXdM-4+7S!Vi7nei{D zIRnGxvcFH<44a$>=bx4*Wnv9D^l#&y=8IvGJQ_pzF;Ch zE$dl+_vDh(RGIUa^jhe@Eq)dA3}%Md=oQ<3C(X zT3CE~vz6x6I*&e}DWXi<&V}*g2-4oh0)71w$B}AZtCndYrDJ`~+Ib)6 z3x#%yzbRAMoyg5rt;z0J*@y*f?^k9yZRiE)myz8xp3>>hDg6(EJzhR2X8F}MRmHG$ zw(c1-9$B`0z6(?N-GR(6Em8=L%old}MT$c@Wp)#jpe23NaD2|oUewcG7b6OJ>at@! zpC`THQ}g7{Yp>txPRwM`_sp<;-uV9FfO6oV*unbF{(*zP#8I-0H~H6nGTl-KfU!|{ zYGFPQLh@d7NR7w(_$_W5zQkG>wDCRGu1c_N?i*#xHhl;_1D2L2zhWek#Oa}CB><$@gdri1I#uRU~ zOQ!>e0p>wz655ZbjGfkYHYLkddG+UQpTuwsL;hA-S0)WUYZ|0$*EdJBV*Uk>)jz+* zBQk|I+{C%io-mIBvG8OR5u9!OIn}KL8mB+3(rP$42gZ?0ts#^MyX5n(dCPt`?MB91 z+kT~}H967*$Z?2m#To+BiWTYYS+X5em_e`0Oy3KwSkjBap+9GQWYbtF1(h=po!X#> zD5uuOZuR_r%D=_H!NX);Pr&j@mgniNSe8pz?!C~XY)+CGBXfPvyS&fx7GNH7UieNw zq>86uX3%gNCeyeNvSoZOUBz9N^EqBL4bA_|e+HXb-pMjmi*zREyV57l@j;MYYp3Uu ziJ2u|ERNSr^>*aJ>~yB(LHT7|e7tq&&rC(t= zsBC)KM7*AE^m&D+2U1+4!I(B1x3O8wUyjGMTebkYz&x_=3Z{USsn*6NAvxonmdr3{ zrt};dGeD3*K5IPgxK-pZ*)0oH)5_D~3g_c^LYsaHrMZV3hVL`?QF!quel6B#ay&)O zFW)oYW9=v8CF?-^W2I8Qa@u^?bXsbBbD6v!X!<94n1EsVoc)kwp}aCojz{eAl4Y*Q zJZFDm#+xFim*q|9z%~1+JL_%E4}WKJP+4g>_0vD~&(C}Bvvl_`OGA-6WJ0evn#qUp zG;cYark%^f{l;LL;d1>^n)-ZB2APlSre$nyt$Ag>?B-Uc zCyP%xAIe1}RDI)4+SaeTu}N6L_a>iv>pR)V6kq$7pfJ{IV?R z*x9#c@!7GYXu7+vjgfU;bG4IEP8u<)ASB;?Ey66OtGDS7dRtJ6Ey^PA-X?FlKEv-B zyS##K@RReS@DbU;!^QdTyt|zszqBMcviI<{%Vk_s$VTXN+U_neT@71f9jKQD)!|fx z0K~cpf70qQOwWp*SD7B0l~u+bz55{NM`h6SywO94T3VWZm5nnR*OFy7E8{Gmb72@x z%Z6#rz;evc{N^;jQOxp0Xj*2ze!Jm?Y{*x^ApD+K#y8dxwSd;6A6w}NWz;_v z5<(^HT_8g0DOjEYb~(Ql>Z(+I(zb? z`62WffGpB)*P#IHo<~+5r;tPR2bpy4T-+)0pk)y4ZD^D>J!b3@X1M1Dyx|Eh(daW(xVzHP2? zH5}hFZA^4i)8f1Gs_#m3mRFT^_CFWzF66kGMuA+(nq*C|oxvUSC=Zp1(xePVn5{*a zX=?kX$n^J+F^GQ%FbG#Y4Kg_ z5dAbSs;BJC$@{tX1R@valZH&K700?_jsA#yFud8wn;qANR*xs^9e$Nzd>y7zxq|T! z0@r{Ur}sj_U=~WJKPe1d>ujxIDL(qF@cDh+1!v|5*vt%T^HIjaj%ITCxANeqVi^XH zNw;Vbo{Z>r!3HgqQDzu6GLY|Sp7J%O(@%C+Q=WYdh8^oEHgsk5*hJ}aSy+o}4*?tw z1#9&$Wid=I&ny?A<6*exV2lW7ouAVDpdgK$m+XJ;9m1nF8t0(t?o{maSoS4!MNaKdl+ z^V{s*FxsBdDYm$gk=K|l)}T>bmOLGDY$#;`_%Re&hBPy9qOO;gq!ljy)AtIDdezsJ z11hUdA;Q$waBLM9n-3|EYc`w6xW>1b$)B0D=OO2kg|xW?HQm{8Ldu$-=qn{UWZ_%WQJx99&GMsVLprnY^v`+O%Ol;G&Wz?B zzYtlFt~Mxlf$?TxXX(xIpt8xl@6k}1&f;r2Stj?D3!(X&<&)4bN;m&zoTG^|@n#?` zjiWk#j#lO)zZ2S4?ZI-}A@^vj-;AFo?Hk{TS$Is!u{FOIIlB|tO?gtZ9o;?$w%rK2 zvo<;BN#8l^r~aFJ58^g2!s$n!ByuBN#?yA5@n%3dF3VtFqSjeP4>k*O1YYn>9pn+ zr>5hU=-StuZHcpsoVyPNIV?-RwF{`IVZrj^^u09~O-qH{*YIcoPS$EPyzbru#Iltc zfn7}2f%kB3?Rew^AvZt&T*E>$8|UzJO^lTRsC{il8#z`2zPA`axqQPdikVY5+cLaA zEWSRKEf+9cpv;A8|7x@7aj@nLk)UzNzEGXAV8tA|HHW`~or<4r?8^upkMF&!voG+?}{Q zlVKe>X&M9zwg1UcD`G=C3I=hlTQ8JQyh0IJ(X_C*xVVIn16LChnOQp*$$|cvkH3 zzUKy!)m@T$*4aM-Nf0AmeV z!=4ANlC2^!9&^K{rUJ0$H;a`rEUzw1*_C`BfR@Y-M~kW)nVD`o1|U z&Y7RAY03TAn*JtlvRsh)BQ*Smhjf!yJF~VN0VP)j=({?Ha_9GRATL=idzjJI=RF#l z#_TsEr_&}4dZsa>HOrgES2ulUnG$^7<3YnHFD3&bzAG)J)A{BMlfSu!ro1U%nDBlV z&V^?>nwLHQbAEf+i;GFVHaNNNce|Up)7!ByiM#kCGLOplET4QYn|tlUuQ~s-cnYRR zfBt57h<++Rd+m?+FQJR@SwObyOH6mObGFdYHBKkAHPW5TFm4bumdOkj{Q+QaPnA1) zURoQU!i*}TBv_nSFDzQ8;qdVhC z-POOfvG$zPn1!9WsqDH8Zf@mMh4E2pGxI3}S%dRTk{~;h5{vWmQB0FfTfi70`z~oe z1I>|*#}B1QYp@k77T$9j8LQ2|ja*9Ej2xZMtQ=Ifd1F4n4tc9E#Fn-y@O;DADIWn@ zORm-L7T**q*N9nQEX_>m?6cu;zm$8?|9?sFCJ_w(r$G9eI&I4=@`4(|_aYa5aJ>h$X{c=8?NyMa% zWPUyXsdw#+t4F|pi~ZjoK*8jl?_%cXAsnKS@7uJSl@o4vE_nI_$| zQ^~aQ?|rcso;+l_IXuH0-$gGsrP4}#l&)Gcq+V_QxBNn=LS zZjZ8V7Xo8V$t$1V z4;W8>iM!;O(^P)9m|IfkFyp1|SXvsE{yF|HHga0Id@|1Y-4}a#r2Lsi=@$Xz`cq;@ z>bAadcWPdK*wcp$&HG(p_pm3Q_d_%D{eCdhsr=!m1%+Bb_4IgME%oQzuN zCR@rg9U==TW0voX*~sf$9%fLv+y^>(#Uvk^CgqdMLy_IJ%x2JXo`Lz9@u6Y#Z^ru; zwO6prFL4)N*-z8VelrUp%YBBN?{m74-!o?U%)2aMSWVzH<`$sYEBL}s(6gdx>j~ssHP8ylV z88mL@dzRLHaaX$g{^KGZ&f>P_OQa>P%k0auqOX)?Yh$K3r*Tdm^vnGP-}mAn$(z{R zeNE3HP&T$)tK9nQv&9Hn-3m&aQA*>rlKFPnJlsj3DwpwWLR-&%7(050ZyHkS;eH&iF+tubGVBFEn1xUxxbUXO;DR za93KyUE$PUcl~1`lPs^9|IA(e@^8j0?p?TVocr)MN3Q?dxNK*1W0iKy6@J`tJ^ELa znvK?w@md=fG4b56b$&ek8tr4h$6<0_+0*4Qp3y&quY^?G9pp@ zkj&&h42wG+#I=}>^(;xhk^^K4|V?=BF!jzZ9aB+p92@(2&>*)K&YG#->^!G?BfRFU$d zys966IdJJ^B9kF?a*;iubbH)X#R=1^x3g)0oB0 zzesPY4%g(wMar6ew9oAjVW!)W(gXl#0M{eWNXcr;Y5y3 zTidab7LoHY;}LhbtDlxlmP39=k{@NzpW|yyn>5mFs#)Bm#Vew> z;ZsO*T#CZpWL)ys(preRtI+kG{*c{;8~$X?7H5RFiI1i8tznrie*quKnVp{XBh1W4 zyzz}vy(?Dv%-FL$^1CAEYlfOOKJ3%u;AtyoKI@wIMvk!-S)+_Aznh(8Gjjv=Xea-B zyl&D@?&`J|pYD79h%la?({jt{5HotSa2kIv4Pr)9-PM1OuXE5itu-tQ>)dG>n5=b< zYU}lyDt0b?rA7Ik3qJ$H=e)mPXu2Pi#`^)wSwa3)CYZE6+LmP+OIiA~IiYm;o@K=~ ziVI1xd0@m ze=a@J)%OhYp!8^6Z1Y$)1Gh|@Wx#y2)?lbnxsTv?#`3hc#>s9oe(6Sk{iA!%55Wd& z=BH3v8OrNkdGEQ?ZBx#Zd}@46i_q}1XQi13T<;eehaJZrFMD#O%+_ReTctHIbGizQNtn6;2JZQ8}Rt;36WTI zjLmA_QKs;bgnwfa02Yg{irDF#K4HeMRAICB%Ct9prOuMSZ0xrk@hGJHi`a3!Bsa#< zyPcJfI@waMg^_Rm8vJ>kJQ;LhFKS}A5csk?^%#l)W66q=V=c-1NT>o5H@{9PT@ zj0Qn{%XgILG%%r~VVJKRj`3%EA!ht!%<_C6?>t=Dxk5a0S|uygdzu5n-<{AAv8Jo1}oHi^A+&L?t| zJv?U8uO#$u0i33%8VKbOGO8>N4b@r~>T>tT%Y^^ew#cmCpd} z3dQ^$TTX`|rKj@M4mR_Yd1YDd@t1Mma5LnzXV5aua!2S>=7I0ooo+MzP_$`1+9LC% z@3S!ZZ&oJ!o$;;M^CvIaKfm9FEWga}2f>W5JuqjYDa+HY0l`)+%VCt9Ij1tUen@iE#0-frpDJL%imcWv@D}PY@zD~02a8FtPSz3VbIGuRH$G9AFMa13*7px?TBKWuGB(7{{RA~ zj!Cl%N*3@lw!-$2+i=SbyDJd|s6u6UjbB=U$tbG!FP#)r7>>1ewNoIyE}`3qb>`5LYs zfBCG_?G(+Xun9xa4EjIL*?Zl@G(t@<;ck zolguVsW)AJ>X`i@asxHPUjDLPdj0mV_^>>4UiZ?OrJ;E~2aTJI~NH^2U>Ft%5 z|GIp#%)8~f+ivZr%imi4=EMrW@1S=c#eiZs))i(AYrQ?8Z?Q~W1MJd& zvz4mwnXmKmW_g?ollz?U?tIMRTC}g$d{0x~*F-tNZ?s(NEe^{9|14BNu?4LjVW_C9 z-=(pXB44W7LV550y3Q>1wlwb_jpf55!zgGdeomPHZ9tO0k=B);s2Yjt^NG?VA)bz^ zMwmhOw6c4chP5512d!s9AT<41pl7Vo;BJzKlg$1u!mf}M9$xRpgK|tHXXB>xutx3imS(8{jJOG zyZdxDRg`xjggl`+=st$H%!aYzv3`yi;p!eEE%KIO97Hf)q@H zWn79MnPPn9MeB{qn7^Z~+wyW3NS{1pWcg&w;y~Q9JXJmYFv$>Sty^8#5)P6jW58+yb|c(O$gqzkV6dzUTP#Yrh<}{_g=VbMEl$ zG=Oj$JM@{(tP{?-%Rgf#t8;KY`e1SLU{-n6=RNvfjok9#Gxcfn*SxHHLr)7LhnvW1 z;~w;Bb?5NZml4M;nJlBz8J4@ju-)QI?lY(#d9|Gm;x6Pk`JGUiFpSEOI?GNHvbl(V z+7VdHWM(>MKI_IZ?cg_^F)ZFrH_CqeEhup&7qOIvI;`tXvK)Fli^K=Zc9w5qX26^W z+Y@i!87IfBEBbn`$7--PW@g#{^m@|EXBZ)^8mz=O6<9vy09e6NfL6m`l=gtq;Z{Y;4SE-ngc%B|_vGp*ZcM!? zjS<%UvU{daaC%_NU+o1#H%(8!aoHNsis1^tr{8t?s_ zec!|78dvXrt>F0VuK?Bslk=k)lodpdGrn2w)DMQyusN+P)B8eoDa(hL(VX#3oC~k{ zQMimpJ<>nQf^=2)^pA9uW}ZpWU*+Q*PqT2d@Y#)Nk$3tlk9(NOU+KLc?1i7@D?exX zg7pplJ=iRJ=96x9XCrCO6D?uJ&vI6JN@vEmy61YP`C&TBPnMPX@jWBQnc*Z%>_s_; zobJe%UlP(asDO6 zjr?``VYN2^*8o2IfPsm^ov*cXPyDydkZ+nRgVA6593>?DKGkL zv{qvT%aP(akVcl(hBnuR&R`aAzy~q3RC~GgycC%E9p$x8!>^kWDxa)S}5?=9`2aCh!O*bW*8t=7wdYxabh&p`FE=Dvi~sBq9na1gf1Uo}_yC-B|=pow@l`ElcGxzM5^K}=Zcv6L-3)$IRCEe)=K=uVS0hog zoK>G4EXPxZHD3e!;WH=)%7W>a*ceRuSq5g_{&S7FVfC*Ww$|5rd4blkdEH2l#zAksn(3q*qX| zSWImTa{l)6@^GkKEdSz4TW#!eZ!d@8VB;l<;(fAA7F7lvzlblLFatuMU> zy!b~9D@p;5>kTkTXZD_X%6wDSbj!R^f9S5^iJUG$dJNAUm9s_=L0dbaoED!;RCMjU ziA-}BlMm2m8ED${(}8hLD-ZCLf5v4TrJ+!|I`G)TIX?w?(Pxc2qm$*Ra?04qA?1sC z)o?Q!NdEdqw;WdGoBd7NpNtvZbG(t3g6Zo{VQv~Ti`~KzSL;xwwa5Dmd+tawbBs>k z)7x6R`_EzYBrCh^=p@rDrF84Jgxe|~{~>bUvL{y^xSH9vQ#SL3X_&7kbM4r=vK6$| ztz&1#L(wAc35a#971V6mY@}kw_0Pll2=s)v333?H;XD6w7@`!v>6K#1f-^I$0ImT0 z+&hn7e*Wn7M}O*5pa0O;fFF1Pyj~*?Ed~Hs+v;D7-YEp;lWX7SkZIfpd$QWcb|lL* z`$)fe*=NgrgsZ+z9LmjE5L#{4*Sji~5>wYNo?yLt`nwm@%d%D+?1=U1%>%C9`~l$R zWrLsF&K&?Y=@$P>m4|#IDn{Q-N8L7=iVOPQ@%j1{b*7h9D?pW9_N~U>)+(hw_l`8J zy^;s=TFhrfMj02MF)B;!6KycLCXxD5VL%M}NUOEeH8YEKu2KrtHtyu53^ab1$E4np zKk9gEv0Gc#u_#k>AOCros38Og;ur zgC9`0s;_VQJW^_}!k>FGSZ~%=z5Zy~rhLM+)#J&sf|*z%bn1y*=eIbX)fv0d5o)^Zicl??z;w0cIJ8 z^$PB7GN0*VzXxn@ujFiL15hWs&AY5xMTs?UKxX7xa|@fh&H%p~RL@hhP-~6PB?9>B+!huGveDrRyyS+|1k_P^VcwDhH8c*fM-DY>eJ^B*H=DlpSv;q zg}2*pdVr}@}(y9@7E77)5QO{Fz+JBKWzJ!snM)>!%L3anSSdHfb^ zz4=WCtOrBIf)z`BZZ~g#>Dy3W{6hvmjzIp(&L%Ws##@$kYi)duXVGc!(=&>6clmAe zrLr@#%{2S03}$Fi0dwb=!MzCJ{qqs5rHy;!m1w#@A*N0{PdZ=`P!5z8(m6^Wpw07` zpL5;Maq=KQdDn1zAWba`NcuB({Z&6g^O4=Z8JN+@`6usu*L=+Qt#O5|y79M7tT2U^ zfyxX3jz{j8i9xllkxH3r=TBOhSIu|M7oqX98^J}5khVZjn;HQWh;>sM}<`KZAunXm=nQc zQgB1a+||6Glta%*rlA?mGzg8i$OZ0-ib5+HUwseDvs?SfQ+t3XuYA=0lb`?Gcf1Sy ziW^{Aff(7g&0r)KcIH<{Tr*^4qMQCIavte6i?ekbBUgv7+bvarI;gVoja#o|E)UXZR=PF2w$aJ;w3gUWo8(Wck`^W#R5Q1ZYCfe9 z=)B7nunMN3^|XYgzOlHtrkiz#e36!{$+b52ewc3$#oFSuK!Z0@>~xu4al4S|GH(hq z&wqt38w|^HSuRHUy)JF_aKsxl{dcru^dEjsU;Q<|EDvHEZwr%M&E3tc^QrD#7x!pQ z+RirVO!QfrUN56ut_k!f-JWJx>L;?44N9EVIN`|vi_3u!ZDv8mMOmWW`!CxFcH+5Q z@-sI19pz=4&aiFeoc08%90{}S+Ob={&d;*=cbI#e&3-7h1yR?uOoLv5pL2E|eS z?`q9=Y4^)16OXl46gzl-sUu@$o@lM1w&SLQX|jI1S!WRCYR#`PV|co2*u8WazNHbj z`V$jy7{bGlfm7VZVMd(;wG=-a~xm1 z_pKL;9RQebs5`>yHI{m1$0u)m3+l7q4EUOIz6_+N32g3aSGf}8lQP?Lx7113=tx>L zel4s`g&E?$_^1;yMM;__wFoEC@)0jN&V-~^T8An z{aHHv(|0}-djkr(WlZIk4KIO))lPNr5_>3sK6vFvbug(9+p^e~Gu>wHGdZY^W%tZO zu4@2dr}a#ZG+2jU=S`0A=6K{=SbLeH zLjWj?;ZTlv`tFy%8^?G5KA3mpr8u2oNmdw|@0Ko;^OUk422pb6G3#1wZj*>0z;A&AbDnUAH2xZk2PStqluQp<%Kf6TQRZ4PDX!wpf4W;6kC{ zfVh)fX9^-Nf)75os0aMhnE~dt!NaVYCfA(9jdE&i&_ZwWpDi&P5};nqEMP6uu8(O? z3ga`Je+5r0D$ejoJEXEB-CQ0+UQRD}c1n-!mecZEv=~NVHuhr7cu==JZ1Xxgqg@o+ zd@U-6&t<_d-Fk-i6{DX}TE26+HtT2rA=o3J9yd1@8p{0pcj_& z2Cek(Dw8JLz7k)TY8%~)i>a*kn=)y^m*(e@d!A@v_n9VdW6H3G2J=}sqaeH!nF)jz zvp2+};xLmsirExw!VuJ{5|X$4M;;hgI}8Ood!$Ouc#RE3pu*RaUjX>x*WY>A%Ed2V zYr{1RFCIL^UwG%q@-r{+H#`P@+cki-k8tvU#G(9t5U6a5ak6klvZ&#RN(mDMSb$M??=1-jSa``fDqnctaa@j0VL0= z4-ma8X-#@-ZTc@en-(99=Tw$`aQ7IH5UPv%&N|LNo$Z|r`>f6w23P=3$3seJDv zM}o4d)CA?5;QlTB%VlY1C1!!abft>j){|Yi z8ulDi2AY=~SKnEYX9{p0l&g<8TUcP3Z_?q02*xXM$2Uq?p$h;UasA{i9B};3QtM%y zTXuab^%f893eVpC(huPH^zSwtf$EkFcdE9E*m3EdM2RzhUH1H7Nc_4rxovD}>~L)c zz`T2Jbu2D6G#F?JxQ_W6Hm6&CU7htqJABH6(i_^j2Vb)uZyX}~6aOLj8sUb!V$-3@ zK!doe-1ER-FArnp!oe^~f0kBRq7HCS5L2QAb(dwxHTrE`8gcTB(-?@M-?3lf-sT); z2BqC~Y7&P2Y(qx-vaN4kUtHf%ydB_76ieDnEYFlC>)l9iU&b?DiNW7^pFL-}XdlqQ zZ^O3+w765cM!Q#a=XO|)v2z*b^{myguR`UJp*&~)DR;`6ew+bi9MbRno?JGPwc7_& z#jLkW4Sqj^^1`)vjmx9JwN{U-{MYI<8CK3Y>!2moGcpTpek|+=;GJvW-K%wJSgbX}_4O_4;S$d; zU&bfidawNK)Asw`2LAdRUm4xd%6ur)Ps7f_;0_uJ&8tn$4(4!*yX1q3yV4$hV{p}) zS6s9esJFO!_V}fPt%uU8S#-31ziR<(#bsHszIf*XPv87bwC8_`nU6%ZA?4Z@aN3Ee z)k-wkRE3G$+z)+ZukQNXWs9vIZmhhtY3BXFZQIi_h3Luqg<8uWBtF4u)o&EJy!g&_ zNXlGq#q*g9Z?0Nc#IugIO*)>fUOKc+Fq}ST|BRfDx@&x=F*=Chb{Y>|4^Qb58khOX z^zIY?To|Nu-Vew>>F>!2lQJN(Th3!HPd+m(4bNW=$d#{5H)FiBJB( z7l2>=7TxV%iw3=MumoX#?F7r0wCgE6kza%QTo zJ`*$Q{5ay`f95ATu-#Jv)Yz+%EV0XK) z52?M>_a>WYDPs+rOW-;|~PX_)-0BTA*0^Pp*9BEyXAmgU6f znLD9;St#QOKm2@(`WCo(f%WFa?`U=X=*gxEGay#-FUl?I^_wr@=~sUZaQ$nn-NZCf z=$HPBccw*Rx;U zPD~G)?pobm@rQ|E(29SdgN16o!sX)Q!{zhwCpbeK=R=GprfZ;w^Os*=_uQ#Ri@6z>AQ`1a>Okb-d zSmaAV>V98jOXx1Br8k3?slj?>aUIj#ZE>;zwJa#hMVFTz)iX2L;TZo7uNsCf70s!Uh&8B)kCMlv;yOj*#aF@62@cb}H^ z;^Nz33t$EuSJVpFa=^`Uz_SN0?@9cTTyIJBuZUE}7(GXTd+tE(YCmVnk!k4K<2 zwBs?t-r}O%V!eL%(fZ^|e*=zBe;aU(h8WzW2E4^TNXN;1A@Qnm(J<5lMV3|eH#_Zo zGe37hWm|dKz4)oTw=%sS$cG8PIob4X6T!&Dn?p;u(l&t zou1mL*6I?6i2vjpL%U~9eD#KowS%aoR$4t@t6`;PxUF?8X zT?R)0@4k3pD-MTR3VaK3>0iQG&2W2IaP#u3_z!>flOO#o@Yg>9K31)G#~i$vc{ftw zqrlQT?Ng<;)M+RfNBeZ z#`VeO#)PD!xEsB;XSln<&(PRrNIgUFfLyi) ztj+Ig@R_vGuV{C-G8+RN?-+-CX2y)Bt#Lh%=53hVjje_QXM26dYNWN8;ULFoT@(DK zVD@ijhSEyE5t82r=O6WlJh$eWy^2N8-_iasW1Gvo9YYYqtqVOhY_uS9e7;k745NQc zr}dG^Tsf5X9yBiL668_SLlht{Jt#2+!mvjGk6&D)9u}+>eTBZ(DA3k$Y`}|)OMLda z;YYsm^dEQ^_|?yWWtDT79GwxG_RL+8vM+%Fu-)g+|MC~2Hsu)>-8@?9Pp~oyo|E0wF1W#SSt=zaIgZa z4OWkMRIc#k?a%!HZr=Utus;7-!)>=9gHsrMytJ|G?$V16@5Zv65cyNfnRF;O{mb#T zJ9kH2>SaBNpXv4~enGb6b9nvD^i|JD*P82O*Q5C3yIPPrJ(JzQ9kJWKTZT#Yj8~$A z#6~)aex$ojEa%=iOV|@DI$$v^$Yqa>4x4u-YTeP&Y|Ynpy}rQLr)xt!j@hBs{8OW@ z(_?m|>o(@Qq!n34D%0$D7buT&Py;3F*SYjmfA~kpczlyS4S?}|dEcATJEGWMG-O&( zYqU@6nC>od=A1LFYxA4(_MrK4z4oOq$GG=E`#GSX#;s(|^N@$e<+mF&jVzO9&Ld|= z*O(z-ys~)STep_|_^_)|bTHam&kAO^ZLK~CbGd*s1_Rr0=SEPN(A_9Q5`GR#bm1~? zggc0WqKmxwZC1!@#27|hfBO+m-vr9^~Udb1NaRu zfXh`x<@C4K(>ZHu&s}j&W)OMv`7WHuC_o)y1tH8#b``ptrrA+%f$Qfu-d_F6V)pum zmu6^d^IdffFqvUkY(>E>F4pJv^o>vdZD>z_qnTUTKG;hYZvsoB*85@>C&$nE)b}h) zmQ|)f&_C0J=r#ZLkkic2_~b?Nsbx!Kw{z*^j0|S+*wCG}C?OAcXFKyp_z`)=VwN5z z?ztmphYaDH@06Fem2}Ut*RsqqRLsh1)*kYG=B~fzp!v{_Ir|f;D>kV|S(Y0mwsuyo~etC%A> zH1A-!Ms)=6{06u=uCLLwZOw12X}5kXs#d?L=Lo~i;R4SezJmYcb6>sunTkLB9`Lav z3@dN7q8xZ0uB~WtXLrVZM!csobEuMOxtLjBLsdWe6WRUTfNe1Vb%mkAFYk)HHiXsC z;2Y$wVC(VwP}i3^+SPPgt+DpJtpFEG!-K<$+b3WCEeI~%%ZJ!@wM zdm5I%Y;`9UTHCIjs@zJf1$whM zzN1YTzaK5{nh)+zQDj~=@(3so45PmaEr;2&hRgb)P+iGx`kvi#I@BqGy6tY;<8`5ek==a9z4Xmk6y*U`=h_`OTG^LP0xUfH3kW}!Q}M$ zjQ{t8S^Pb@WX#GKXDS`##%KN!N@J6LTY>c!rQUwTTDxqm#XY(HvHJyvdVAd5H`kinGSr~|3WEtqY=2hd*(qj0G8J)}{F!mYjLDM9kO{Sey-UN3ns~?{; zPju_g#>RddkMAepll;`3zv`FMMrvbc{)(K=UC80@!_Um0`7}FSE>iy6y1gZ`$4NS) zxXXVJIUMPb*9`h8ayc1|hXCpL@<^;H>z@)_<9^`24iJLj?m4a<@m&-5M8e`upY+pT zeP%q1hQGwQ;K7rRJqpk}QKiQbYY}Uhblu$x+ixC|Z#;99j*5c;B{X6M@cjB{Yir-u z`K!JzjS8%{wU4T3onJ2pJbCyse*Wnd{_NME{n4)j-}?-Jf44gFDgw)p~_PcvVuN2_Sp&+UMEFbDh! zy0+bo-_y2!7TVLUcyOqw*YB0vcfRnCVtxE;ft#3V@DZ`OmN|`(4L6$kU-7?*#r4gC z%8pPy)OS8-OHcjjrtzq^xm@nbSJ(fE&gC@so*6giGry}_j<0zqHiN@t@w5Cg_S_Zh zjPpi3Mdv4GP)N7)A9Z()&0;9l&)2g2^r)5cpJm`>#v8}BI)P1_xt0HhpD1Ttvp*+? zCd(4knZ0tH;jS>*f5Ypflgc>puh!eBZe>QksXxBia~n?SnE5SvYZQc*Q}2)Ns4qDW zT|d&Pgcdi%XdKmx@2NU1iv@t;czuJ#4ls+WIhTSP z7+zdl;`z(3;XnAqCm((W_@|!$#k-Edx6|_J%?!%^{X);Us!aFFN#%ry50Sf;4JPHv za2ymUt&{XxLtT$AEv;Ulu2x{<_<;Gj!u8faJ^@?MYyp-66uGDbD;{1{Jbvr5zY14x z{jI1kzQr$}ndB`R*O?AcCOJRv2O3}Lu+|uFYe+y)8jj5mKa~dk;lEbeAax^ z?_B7P*(T+${(H#&N=N-vPrBS>CP>3(nuvDBjlgZYmh*_6!42PMyeYCj)602Lx0%2G zX1CV#D6wy1b3?SC_;-*aQd}v0j}Yn~Jz2bp-UkDCoZCXA}(26az1AZVSwQsaaU3OYt4mC}=lFEabr|Dhk?C zaBT~oJ$QsKUc7?;$IpKCcfJGs-kYEY@(t^2TX={B_o@V(Svf0MXbXazKV7S~-yghp*2HovSuIrBl5FY@%z}>_QjW!_}=S}w0SBQ%8K-Qx_9g$ zAS?||NqhD?D~}I?%)kEfxzU2>dH$5XQQyQLp;Od9*Dvp1l)jmtIp!{DOyn|~vCOik zoBFfewAd>!%PS_bqdxMx4?Y9EZ7a;oEoG0vj&obt&M|qC$v}>;xGOHC;$lZp2r4Br z#B0n59WCh}!FZ)_wRgW38-W4f`uf^RDc@U4bjGyY%z&FC+Uir@U9h$QhXpSV7kKjW z>-ckD`Fi=WcW?j5*MSE&!ZUH7N|mAVvmI-Y$gm*&Gd-^ooy_raci)@(t;gK~?TCtvx^Tz znKaR3OY7o$P+3uq8lL_$`4Thwq&1`Ye!#L(T69-`4WHfl%lIr;rJdtK%3qP`W?5*Q z%p2YGIs2c3hR?gO&tYxb_2yotJ7=F2>YwvUP!80`ECc=B(@8fJwsmVSJxt00J9SeB zNW_e8<_DrLdr-fboMtq!!%O~!bj*9{WVd!lJ|FiT;u`y*m z!z_|wmKiOu%n)&oZubi-sRI2&>j)dt|HdsXdaW8qs*8Mq#7DGAA>zBAEHG=HrrEIY zj>n@}X&+}{lv3g@;RQH0*l`?)2N0t#!*N;g;^Gp|Ui%3C?N9vN$3F%9dyivnxhJ4I zvP)c?Z}5&NibM;SIA;OC$BjL|t&LryNOEV{%>307YSD1@bmdDu0Kak+{4*>Jweg&? z%efxcj~+^S$Td1&j|Vu7Z&-XZR7-rRtM#=S0I=EsR4ll~OP8xXed{xS9j?Cq8-c6K z2LFucVg-JIb{wyeGH3a7ZAoW%vW(TO>&IjOG%FuS9blRnJx`JbF&nte25*FRq_`t5 zd)UhdQe1teT=ZR$Y2GOlab|uQc9XZh2V_e-&;0bbllr1`o5Y*RV2|Iv#vEnP!^zi! zYK?t4@*R5CH>GQ0De+yQvdq63q;(f)#Ax{Z%-_AVv^-~F_V`eDrJ?Bb($|>yJHBVm z{YROHahcJkABuiu#;@X>fA-7oz_=V_CLh0++S|6QpJgTtVwO-Ype!hY;j;T4a=4Z% z{PB3~@0$XR&P4fO!&&7{SNiF@VnZ{mw#H5w%j@nD1>45Qysw|%_{XY+-)2Cyg6qQt z9$!Ad7t2HY_dof@Z~8j$L(c)+_H-f+v;(#L_ z)Tj33t3UsL!SV4A8eSOM(PbJ%v{&w=r~0|47f8C1%VaOk9<)rdJMn&KD&PFovd;Na z>xl17bT_{<9RKv5;9SQ1_V}_^a;OPu;MS$IO$4p=?#gigR+$uv91ZXcFC+kil}! zAF=1IZhPtN#m%zgyZ%vT^w(cbx7+3fk%c?2*^G0mJcmqJ+GR#$Cim7rN4UGyKMTcd zd;r5*!^Ps~qb+U?<2|MRZA%I%=IL3Hg(OE*>;(L86bgAYR6njA@os%E@Q`t8SbbIs zP!G7h_D_$w6%Cj*RP#HrkEP)G@&NC={5t;3m%skt$DiR}dIR{_HTsg%NHgSoB3hu! zm&(ZesY0@VxBkuZ7`wH*av1u%nfXN=b%iZuGomLN8jdmI@BM4@wV;NE#ahsC`Xyx4 zbS=9X)^&a8Qw;DO+jZ<>CC{Z5tj8Om9)T5T)rI0#vZJ&Lvs*k^Zm>RomeDci-i=$!MuvPPWvu_R;cyjRok6(V>{_P+C>F@pw@CV-m za2p*rqJ#33PL+{=CDu^XKaZwIBQVOciL%o@%aX{}Z{w7p?3(RiNl%oOw3(*MdZWk} z02V)zws?c2=d@RkUylt~$!~mIg6N%Xh2aK|E{=HbYoGdcc=7cghP|-TZh>~YDaW4Q zi4O6PC^`+9^g*9z?|aylchd3u(o;~@jLS06@@6=F*SI-+e%JWwreSkVjHR%FlkZb0Z6SHqBo4hS_&rl;v0mcz-wQp2dbx@F#HAm2HCO!S3q zaQ@5T&Y=K^p1N!s(B?PO)Hs(l8$l2pDG;Zbj&scuIKy^wG>9}xDgBa-#r&d)wpJ__ zyK}4W`t|UBcQpkugUW^@l`ixaYn$a{oL*EZT~>j$;`ZtqOWYR5WSg^wwE#D^;K}7n z_*8lD@Zb8`FaHm|2K$+|%R$9GXzOjqf7gx5(JR{;0ddG50otVWEjlud74zVl?tQ_KtYq6Ih)|jmYPYEps z!TNib{27nX{4i`T_j8!(#5qjmm-af`g~K<72(K#4>~Oz~|Ba zg-+VG&FgVurZLZ8HG`L9k6%&cv&ITdpXty&_piNyybl;IhtDGvE%eUtB#kb_RA?=Y zTpRodQ;Q2gvZ7{Taipd1d*}sk#%0Xm2YGM2FypjvZ(iJB2?gjk{Y3oL3~OxqdiUj5 z?a#jP&d2}Eo6rBJUj|-(5nrKVz1%25fU>wtjwQC{x3nQbWWg2c(B~y`25WWS8sgk z-$H%w0dRz`FY`kI1DZF=h0j?gIm|3x_B)46Gs}I3y)a$2DL|Oa#TKcZ#qwboH zLV02NXgZ{+ylm18a_XkgeC|Oze+b`%@~9THTDPSxRqDm2G(Rk=w>UEeRaM3h=e~>R&nOazC7m{5eI}-_0&iY%!L7DL}00 zptf%5T$IH(d({Rki|?jx29!g{T^iT6VnM}A7q@u+<|kjqCC0PuezND{w zDbDBbJaWgb=~^_}7Im8KOP2Kpa^C>yDc{-BBGeL5n&hLeO$*H?OE-+uB3$7Yuq1(k z?cz2&=+?&OP1XnicN^<;yw7xHBQPwOk^&h*wPvar!6On1S_~ zm?eA;God2U*%XE-UHVNq&f9)55f8-tD;Vs}(s}tTWEL22cdqa0R z3fnY*u#?4t)|&5%mU31mK&PvF!HTG%tK-7=^m;`OU!cItQhh`I;g7kv?l22XYE) zK6v#yvhnKZ^+@zf2fT;@mCCF|ebA$xRX*yW;gsi`x2(^YggMERyl202$aEE(PD+r= z2a~d8UU6oS!T7lh^MF?6)tWEqX&m(@ANrodDAYeg^N`W=7T(3Ju>C@vx#@^>mJmlg zL|!vyH#_`yDsMkSy!g6zGaujZHWX{9@sSA?>K?K%`x?&~JUBdPKz-bru2;nfpS0G3 zJ}gQH$U;Y-}?pNcRlqzPT*X*#b+Wx zo`c8Q#_ej{vBz10KH6&ii?QJljYiB2Xt^k|+**r~Vr!_)&j62W)V-OqW_=ek;96zr z%TGg23(S^dYgVI)+ct8=8@1Me#TK**tT(r@hJe_H9sJZWP#Z(mhJ)SU(4JjB{mRe% zLDYADC+Z7W+%wBE>m8ElnZbaz{m4KIOUX77$e>2!l#W&lY1<#n( zyO};SA8s{RpOM+rmn4r9i!*p}8EpMq)Ke`-%@5@XFCtgsWbv}S$a&JTfUCA!hcPI$ z&>^C`^Dhk$3AKPA|=PW{}@gx7u&a()?#S=ibS~EDXyz`!OxLtN%G(_}pYhi|If*YU;H1NP0t; z(r5TSn<3@V`A^15rxSa&l$N6N72exn#5WOIsZ}87pu#tHA~Mp`0>}lDM})J&QnZ~N z#maX9aCxyb)b`a*hrIMVvV9ZU@#+?K1eW-$7XY_cTZ8v3Ky8NGrQqpuiT7T9-G1cF z_rB*(e&xyE_f_CGKLg-bae5cbj+p$oOtAT~>=kEUpLK=>BA3nVOo|8LC-chm)#}su8g?2tUA%E0sEqViG2`2> zlih|@Uezy$Q>b5-Q?0cRob${~lXgnoa$1Z_%;cl#&iFY8%7o9jN4)H>a=Q;$27K0E z($YV5=QH`%bkF5qpRcm-UwLM;TuQ3w<~V0ZgH>$CgmoMSX*FIMM^`H6FU;XEvX)d6@N`{A;aG4a*JSdjU8t z4*2?W&#PaBgQYd#_7*<8F`!Qoau8BH|5nlBhMc7w@#=%y<;feL{8f1R)qf7_lLOif zOe$hA?}%F5I_6f+nChcmc#5hU&Nt<)7K9?dpM&Zh8)Qg*=w-JNLytCN71B&mcdUrcL&v zbhor7&oI`)@@M$wy49N7%gvQ%(B#cjX{OOEbWm>D(#}~eupT}Q3~DS{bl%K*Js}^u z7CMuIKGQ!#!zes$uY&_)c9ZRgV_2p*LlY^#NPK7BbDn19X=1<)y_fb)W)d>J6F%c+ zuyZ(xGeHh>o}yr{kZ{JYP7)+k$W*9WYgg(XCQUQ3LAg_40_}+NbcUv-?}&|Fk1j7N zto}4))6(d-_)vgy!1dEBEUm;?XQW9b01VX(M;NZk0q;C`gtuS$$l;Iw*&qFVKLh+@ zZvwAg!@xVTnc^xNkXlUf@{bt#7;cJl^3l!_LCeh7$ucN6#pq17l?`x)*s(8{m+w~C zH5IwVprb`6=;ah0V)Lbd^@jJK4RE%=Y>Cd37mzd^u=k>x~Lse69U^4dezW!8yv=_~f$$)nC}=R9Wq2M@zd-!tf+ zc_7rk^Rp8^^OF5?r*`7MLsQ-Lea4H*WkwGZ-dh`$vd2%$2^pG>mWg&Kdwf|kGKg8c z{4IHcbQD_tdr;csdxpE{+yzUQov_2p{?6~CS&H#JkHW0X7Ofj zyWq!n&Lxs@7gHH|e54~jXyNm#A6QVi6G*~9&aH|C zz^gAkYKLZ@wt~1LJUXD-P-DPQTUdiHZqTk)AAvQX)dIA*iLCmLZ0^cl(Qws($Cr=r zxreV_{IUP?=l;i^1OC9dQ6P;+ zIih^}3`84ie>oc022r(<^b+U0mL1#*_*w&=V~Jhs2DI?>vJw5Viej-N`?&TF+YEjK z9n%k#R{R^=^$2UXxLj`VpuPL(@fUyczlHVP-vc~f%rDmV&bw9rGNkN$t?*uY=!sjx zZb-+!hJGGV&w;Bhv7Yq&PwGt8Me1wU?eL$C_BAa3G;XJt%AvxS^K%+GuGUj!)9jRQ zcOUt*9g7nw&&&fbEXo{Sp?Tc$x8-LR7m`N}pXH^$GnsaT?&gkD<*+0^0h#tsdpkI@ z)O9e;Bv^4pwNiX$$ABUq-{~_`fi5TV6MSssEi)5YhQ!GGXvsB?1lL(lTl}a$CoPbN z%ktTSrb%AaxYBSMma`kwHT_@_+q@ojXY=FC?VAPV7x0)HsSCy>?i!E6Q-LBWB5CM*4nK3(bPT`&z$*_+vsS-i%@^WN^B*#)2HZAW zKYNZP2F$jxaJRCkR&WF0#l->dK6({D{o?kc|Hdai`*(gG`0eii4}2QiFAd?v_Zyyz zZO-6k`YsRWW9Fa1218|_e5=)bmu&kp|J(t~;qq%M@cdZiBNGz8<@M#}gSF$$b#%ak z=8RA48(%8WZt$?&pkBT8-A}&s)BhNb@B9uRHh!fqq4m7Sujae+bB8V~ELov5Z zY5}RWY^)!XdXWEeInl}>vOno4T--x045QD4($3HMJ*PwW*&pDW@NyjGi{bKb4x4G5 zLyki^wb)Iqe%w9X<3@*IHfEgqJ`w7x$X+`c&6iqKe zt?z#B``0&r{(pt~_;mrIxww)pF^h6Shp>7Y9b4Q)?@dNc*8;q z_h}yHay|#;uUD#+2VHux7J9=DAa3?*@Y52ZEu)?U-F}h+p>x@yjGMoh774WGvs=D% zWSm(hZ(~5`vqH4IS>EJhPj^rFAe{u2f&(j@8A`bTjukJSyubwtP^+I+Zr*WhWE$z!X1KP3 z_sRk9y!K)HcYgZk{)!)Y_vWAeGVp`%0l0->jj1h9YYW!DNTP$!ZBqGi{<9x2M)fx7 zO!%DLv)iTtv=^{YzJV78*P zE4=#P#@_qdCx4*5`?pMRL_yPe3IT@U)CN$sL7$~wF33qR3aZT!7GSfPu?+VJ6 ze~=EBfArI@Iw@`b>R)!#v@~tNJC$Yei(I-}g33vs8D3>f|8uhd8c)lJ{`xmVmI2?D z|C9Vm=R1>4el}Xt`YYjjSS}f1Z1N(qyjwcMPg<<|lo#DqFEoAfN4kVQpOayhF~jVI z$36V=bCwms{AeB-R-YM0WiZRD%0&I{lc&3IS3LEf<+U(zGDM408N?)^4dECeAZ3hT z8am>AznRX$%L3ekhRX#)SOW_DkiP$UL%jgF1n~01i(@$++fpk~*En;UXjStsgjB=v z*$b4T-wc)uU?bCp_*zK8ZCUW_;t}3^?W6WD|L9NshCg?MKkydtT`yu9yT(q~R!z>y zHZzeR(YLwTpRjdg4 zmeb`4>M7$vcvT)a5E}kII0j{B1t{YZ6QaMTuQsXvZgeY^>xrIAxoBFoZ_M1zh-!M9 z22kn)!)4x?j)sAhPite(%v~VulX@c9luPet=Crfn)dS{8djyCqs0?Nnyx&+Vdlt;> zmw)Ht+~uZ!Teui}1Re z-Vq$_fSbbs&mTO(*I)h+{`iml_}~3=4S&bifDb)!`yI^yJB%V5Q`YU|a*8YqEx+y; zqjVjq@5^X_;rEo#q!L(*@Z|tpJVYy(k85jwiCKJI%i{70>RjgC8c=FOy}AndCo3RL z`EDB0+JNTwW4~0M+1sD{$=`=(U;Zah-y0qCj&7??&+@s4To<@OF*g)hm)ZE7Sb)hY zr2LhZ{sCULr0)YS3B!Lo@lAMRV|_w@l4gdcw{g$;OFF97Ad%nSFD&U-ivh!o_j7sF z@Y#Px3sFxX;WKzsUe_CukLnENlFO5EwC*Ufo4!*HYE`PN8wW|EFDgSM*=FbVS$!Z*zBD9 zF6+Ed|E+0P$5!j~>yD*w`teBvMfY2Y7x2YB@w zz|s6ptx;C~r)wYjr+GB<4@0Pt+GN8DLc**oHWbM5JTe2N3g@?XMys( zpYMzEw9TNR`QPf_(&oAE~VF=YR5V z$BVE2J*dyV1vtX2%1P*fA-|}oEH2qSJJKJ|+KBkyn28u=x7B&2QJY^Tu?KdlMCHv= zq$z`}a|kKNOo60lZL=4`*YXE?ob=vh5#d=rI*91`6w8gBW0zZOi_caS(PcQ9u~7ev zP5Lr3K}&C@yYVa93mTM2Ul)me_p<#)` zfrf&09WyFjr*z{ZEo!2+ICt)!P-Xj3WR`{UGS5(tTH>?}JFpDO=L9k%aSqg*J>-5v zk>hq4T(~bV*jmx9ultpoF6%gZ z7{5LLto06FZUSyi zo(rq;pS3A7n(BV;dBcb3Ir*7^1B@n(HRY+Gg{x@ENb2pS%xqa~CiD25HQO2sBR$b8 z4&K9-Fxd#D@tZ}*E%ls#+9~ekpP2d2+%nG5R(@yhGvqiqtd>oSHit_E7E|+;8+0X{ z$~(K=h0Fup%6$mzMV`HzD1$0vg-=!b2#q7K7#*LCJUOz{(VdP?d}PD)-Vaoukjk?O z!!JjnVFB>**Izka;P|rzN0e64j<-N-sP!0jN>~bTMFtk&w&LdLb3B0G5nY-Ayk61_ z%i-W@)MFo2a=rJ~4A&PIc=Foo_}T0B>c9MBpZ-Tb3H*U~0K0+T4Az=kzFt8pDm!PZ z{SbPqZn<}PH@EO=Wvz=SQSmtP?(SU6qk`(XkqoR(5hHMeto0NC7r4B5^b>V$@A0H{ zjUDNZ3am#T{WnjT`eW9xRN(eGr?4$XmaZ>mW4E}ksYiQ2xS@8RX$%u7pS_++Ld`&;Zz z^}(UbvD1ri#(%7nDLuU*F4HG;Adq3?k!?f@oAcl0C{~|O3rYQr84I=>8g~Y|&*W{? zvF6H>JM|OGhbG7&W%1EoQ%BS2p1MHA7#H z^Za^=SFZ5`(axTBESu-%ZOyj*4QqLF*ZLOTHjTegPwv93jPyDC6X*PhE_-#8c)dNA zGHtElVu>%|1@`hWayu~NN#*X(-mjfp9>Vv%1oxoA9*KmXB%$0DBI@T7W8>LU5wE{jsApAjSk+cUJaP!8T>c zvJEGeRhC^Yzuv$#1MC71UwQqjt+lIm^jl&U^YOp8xc&qE4k|x(5RGO#u2`SH=xh5q zy&23*h8q=Dukq61Xn66)cRl^WPyL@!-}`H}@;v7%d z(dilP69zl<^1H%Iw26-2jVw!j?rFvEtRv|9xl<16KI7eJMNZBE&%!ITY-ec$J_9uK zBkhwkWbewX1L3dIELKj=OY6y!#vR|b-5Hv{Pz6a-<*I0DPf+&X1H+x@& z9*g8P=F<_{Hb0}`B|UA3tpR8iH8y&E>@{4!vaJ7^RsT{Hzd8iOcYf=3vrucXwtQW2 z{oZpd#enALpvMh27;%dEtUzh7!vZXRbI);E@O*iQcV77j{>BrlQpUPfO*tPo$1nDr^eJ>-}mC`^IpS{ z!7yH`18x`VU~k-9Hrz&x9N&Csy17AVgXTBpp~gTgp~62J!cLNwA7!5Nruof&1Z6jS z9u}&nHCy}4)-xnsovKFY9i+2rHXrcz^x!i~+D5Vs?d2Jj%oAH(x7q z!+SGbcy1FBd1w7|dRxEy;#95$ST12NzuKBzynC!TwiY|p`h}sKnTXuJP#N2DeYX`0Jm3@e}_W)c3v@cxFYW zvNN6c3)SmA8PZ)lZgubcC!NnS?sEEoyq?1zy$_P!Mh(5|<*W zqe@HPRi2sGnXYJAFpg!bUCJ`k&Abrgmtho{U$b;#L&`hz!TzhrPHp<>ACdE_$b2z> zyPdK|7 z{2;DZp4b%C!ul%1GyV%E2%k+ijb zp1N1e*jebG={xOkMgyW2r&oK zv@=}KC;xd?B-yVnVf7j>UmorG+n@VwS6}{_|0mY>fc6Z)?WXBdy`*dve9!JPWI64{ zxo^1tUq;T+p042zd2~HW9e9T78!a9$PpaLBztNx6_GMmj*z8YtBp#6R>>ctpEk5t& zDWqsIoCU_fk?mQx++);mm$lb)r?pI1Yu<7m_xK}n{`c~vbaOe(&?ZNiG#|<@|MCEM z2IbSt+sP_-ZOl8@Z8|D9hM~?WAEa}#(TkpDVX?LChX`A1Xj&k(!D3C13D$ay_0ze) z?}A#}87kmC+FZ-m6tnfX~ zrh<7#M!Fko&E|Y}R%46}KkmP&elYX*m}dDwcYUS1*qC{LRn)(AAed@uzY7&ccqlVU4@dPb;`T z_#gKSs65WYc~F|f-Ese$gP|wy52}0l-D2>(sn2W#;q4aP8h~S6KrKw9i8(E~8q?30oC+WEMpylX@_9eyBr2^7#sWY5`VKX#8oUv)} z?+BEX2E#TP9IUP3c6GS{FOIY)ZJ}f%r@A}xoXAi9XDb(A3HrC9%W6tq67hx2j zU7$X_M!T&zVDVkuJEJtsJ7tOH*WA^z;HnfndGHe6dF4a+bC0jT<&Xd9r~be%0DsTd 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

_JdZw4)^7dRj`6&@U!MhP9 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�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 W4fy^uhR1jS0000$null + if ($LASTEXITCODE -eq 0 -and -not [string]::IsNullOrWhiteSpace($remote)) { + return $remote.Trim() + } + + return $null +} + +$repoRoot = Split-Path -Parent $PSScriptRoot +Set-Location $repoRoot + +$javaHome = if ($env:JAVA_HOME) { $env:JAVA_HOME } else { 'C:\Program Files\Android\openjdk\jdk-21.0.8' } +$androidHome = if ($env:ANDROID_HOME) { $env:ANDROID_HOME } else { 'C:\Users\seven\AppData\Local\Android\Sdk' } +$env:JAVA_HOME = $javaHome +$env:ANDROID_HOME = $androidHome + +$projectPath = Join-Path $repoRoot 'src\Ikar.Client\Ikar.Client.csproj' +$publishDir = Join-Path $repoRoot 'src\Ikar.Client\bin\Release\net10.0-android' +$releaseApkPath = Join-Path $publishDir 'com.seven.ikar-Signed.apk' +$aaptPath = Join-Path $androidHome 'build-tools\36.1.0\aapt.exe' +$apksignerPath = Join-Path $androidHome 'build-tools\36.1.0\apksigner.bat' + +Require-Tool $projectPath 'Ikar.Client project' +Require-Tool $aaptPath 'aapt' +Require-Tool $apksignerPath 'apksigner' + +if (-not $SkipBuild) { + dotnet publish $projectPath -f net10.0-android -c Release -p:AndroidPackageFormat=apk -v minimal --no-restore + if ($LASTEXITCODE -ne 0) { + throw "dotnet publish failed with exit code $LASTEXITCODE." + } +} + +if (-not (Test-Path $releaseApkPath)) { + throw "Release APK was not found: $releaseApkPath" +} + +$badging = & $aaptPath dump badging $releaseApkPath +if ($LASTEXITCODE -ne 0) { + throw "aapt badging failed with exit code $LASTEXITCODE." +} + +$badgingText = ($badging | Out-String) +$packageName = Get-ApkBadgingValue $badgingText "package: name='([^']+)'" +$versionCode = Get-ApkBadgingValue $badgingText "versionCode='([^']+)'" +$versionName = Get-ApkBadgingValue $badgingText "versionName='([^']+)'" +$targetSdk = Get-ApkBadgingValue $badgingText "targetSdkVersion:'([^']+)'" +$applicationLabel = Get-ApkBadgingValue $badgingText "application-label:'([^']+)'" +$nativeCodeLine = ($badging | Where-Object { $_ -like 'native-code:*' } | Select-Object -First 1) +$nativeCodes = if ($nativeCodeLine) { + [regex]::Matches($nativeCodeLine, "'([^']+)'") | ForEach-Object { $_.Groups[1].Value } +} else { + @() +} + +if (-not $packageName) { + throw 'Package name could not be extracted from APK.' +} + +if (-not $versionCode) { + throw 'Version code could not be extracted from APK.' +} + +if (-not $versionName) { + throw 'Version name could not be extracted from APK.' +} + +$signatureOutput = & $apksignerPath verify --print-certs $releaseApkPath +if ($LASTEXITCODE -ne 0) { + throw "apksigner verification failed with exit code $LASTEXITCODE." +} + +$signatureText = ($signatureOutput | Out-String) +$signerDn = Get-ApkBadgingValue $signatureText "Signer #1 certificate DN: (.+)" +$signerSha256 = Get-ApkBadgingValue $signatureText "Signer #1 certificate SHA-256 digest: ([A-Fa-f0-9]+)" +if ($signerDn) { + $signerDn = $signerDn.Trim() +} +if ($signerSha256) { + $signerSha256 = $signerSha256.Trim() +} +$isDebugSigned = $false +if ($signerDn -and $signerDn -like '*CN=Android Debug*') { + $isDebugSigned = $true +} + +$resolvedName = if ($Name) { $Name } elseif ($applicationLabel) { $applicationLabel } else { 'Ikar' } +$resolvedVersion = if ($Version) { $Version } else { '{0}+{1}' -f $versionName, $versionCode } +$resolvedRepositoryUrl = if ($RepositoryUrl) { $RepositoryUrl } else { Get-RepositoryUrl } +$resolvedPlatform = Resolve-ArgusPlatform $nativeCodes +$apkItem = Get-Item $releaseApkPath +$apkHash = (Get-FileHash -Path $releaseApkPath -Algorithm SHA256).Hash.ToLowerInvariant() + +$stageDirectory = Join-Path $repoRoot ("artifacts\argus\{0}\v{1}" -f $Slug, $versionCode) +if (-not (Test-Path $stageDirectory)) { + New-Item -ItemType Directory -Path $stageDirectory -Force | Out-Null +} + +$stagedApkName = "{0}-{1}.apk" -f $Slug, $versionCode +$stagedApkPath = Join-Path $stageDirectory $stagedApkName +Copy-Item $releaseApkPath $stagedApkPath -Force + +$metadata = [ordered]@{ + slug = $Slug + name = $resolvedName + summary = $Summary + description = $Description + version = $resolvedVersion + channel = $Channel + platform = $resolvedPlatform + packageKind = 'apk' + notes = if ($Notes) { $Notes } else { $null } + repositoryUrl = if ($resolvedRepositoryUrl) { $resolvedRepositoryUrl } else { $null } + homepageUrl = if ($HomepageUrl) { $HomepageUrl } else { $null } + androidPackageName = $packageName + androidVersionCode = [int]$versionCode + targetSdkVersion = if ($targetSdk) { [int]$targetSdk } else { $null } + isListed = (-not $Unlisted) + packagePath = $stagedApkPath + packageFileName = $stagedApkName + packageSizeBytes = $apkItem.Length + packageSha256 = $apkHash + preparedAt = [DateTimeOffset]::UtcNow.ToString('O') + verifiedFromApk = [ordered]@{ + sourceApk = $releaseApkPath + applicationLabel = if ($applicationLabel) { $applicationLabel } else { $null } + packageName = $packageName + versionCode = [int]$versionCode + versionName = $versionName + targetSdkVersion = if ($targetSdk) { [int]$targetSdk } else { $null } + nativeCodes = $nativeCodes + signerDn = if ($signerDn) { $signerDn } else { $null } + signerSha256 = if ($signerSha256) { $signerSha256.ToLowerInvariant() } else { $null } + isDebugSigned = $isDebugSigned + } +} + +$metadataPath = Join-Path $stageDirectory 'argus-package.json' +$metadata | ConvertTo-Json -Depth 6 | Set-Content -Path $metadataPath -Encoding UTF8 + +$summaryLines = @( + "slug=$Slug" + "name=$resolvedName" + "version=$resolvedVersion" + "channel=$Channel" + "platform=$resolvedPlatform" + "packageKind=apk" + "androidPackageName=$packageName" + "androidVersionCode=$versionCode" + "targetSdkVersion=$targetSdk" + "packagePath=$stagedApkPath" + "packageSizeBytes=$($apkItem.Length)" + "packageSha256=$apkHash" + "signerDn=$signerDn" + "signerSha256=$($signerSha256.ToLowerInvariant())" + "isDebugSigned=$isDebugSigned" +) +$summaryPath = Join-Path $stageDirectory 'argus-package-summary.txt' +$summaryLines | Set-Content -Path $summaryPath -Encoding UTF8 + +Write-Output "Prepared Argus package files." +Write-Output "APK: $stagedApkPath" +Write-Output "Metadata: $metadataPath" +Write-Output "Summary: $summaryPath" diff --git a/scripts/publish-android-apk.ps1 b/scripts/publish-android-apk.ps1 new file mode 100644 index 00000000..1c951b61 --- /dev/null +++ b/scripts/publish-android-apk.ps1 @@ -0,0 +1,10 @@ +$ErrorActionPreference = 'Stop' +Set-Location (Join-Path $PSScriptRoot '..') +$publishDir = '.\src\Ikar.Client\bin\Release\net10.0-android\publish' + +if (Test-Path $publishDir) { + Remove-Item $publishDir -Recurse -Force +} + +dotnet publish .\src\Ikar.Client\Ikar.Client.csproj -f net10.0-android -c Release -p:AndroidPackageFormat=apk +Get-ChildItem $publishDir | Where-Object { $_.Name -like 'com.seven.massenger*' } | Remove-Item -Force diff --git a/scripts/publish-android-update.ps1 b/scripts/publish-android-update.ps1 new file mode 100644 index 00000000..71f6eef3 --- /dev/null +++ b/scripts/publish-android-update.ps1 @@ -0,0 +1,298 @@ +param( + [string]$ServerHost = '192.168.0.185', + [string]$Username = 'sevenhill', + [Parameter(Mandatory = $true)] + [string]$Password, + [string]$ArgusBaseUrl = 'https://argus.kusoft.xyz', + [string]$ArgusInternalBaseUrl = 'http://127.0.0.1:5105', + [string]$ArgusEnvPath = '/home/sevenhill/argus-deploy/.env.server', + [string]$Slug = 'ikar-android', + [string]$Notes = 'Android client update for Ikar', + [string]$AppName = 'Ikar Android', + [string]$Summary = 'Android client build', + [string]$Description = 'Android release channel for the Ikar client.', + [string]$HomepageUrl = 'https://ikar.kusoft.xyz', + [string]$Platform = 'android', + [string]$PackageKind = 'apk', + [string]$Channel = 'stable' +) + +$ErrorActionPreference = 'Stop' + +Set-Location (Join-Path $PSScriptRoot '..') + +$repoRoot = (Get-Location).Path +$projectPath = '.\src\Ikar.Client\Ikar.Client.csproj' + +[xml]$projectXml = Get-Content $projectPath +$versionName = $projectXml.Project.PropertyGroup.ApplicationDisplayVersion | Select-Object -First 1 +$versionCode = [int]($projectXml.Project.PropertyGroup.ApplicationVersion | Select-Object -First 1) +$publishDir = Join-Path $repoRoot (".codex-temp\android-update-publish\v{0}" -f $versionCode) + +if (Test-Path $publishDir) { + Remove-Item $publishDir -Recurse -Force +} + +dotnet publish $projectPath -f net10.0-android -c Release -p:AndroidPackageFormat=apk -p:UseSharedCompilation=false -o $publishDir + +$sourceApk = Join-Path $publishDir 'com.seven.ikar-Signed.apk' +if (-not (Test-Path $sourceApk)) { + throw "Signed APK not found: $sourceApk" +} + +$remoteFileName = "ikar-android-$versionCode.apk" +$localCopy = Join-Path $publishDir $remoteFileName +Copy-Item $sourceApk $localCopy -Force + +$manifest = [ordered]@{ + versionCode = $versionCode + versionName = $versionName + packageFileName = $remoteFileName + publishedAt = [DateTimeOffset]::UtcNow.ToString('O') + notes = $Notes +} + +$manifestPath = Join-Path $publishDir 'latest.json' +$manifest | ConvertTo-Json -Depth 4 | Set-Content $manifestPath -Encoding UTF8 + +$argusPublishResult = @" +import json +import os +import paramiko +import posixpath + +host = os.environ['IKAR_UPDATE_HOST'] +username = os.environ['IKAR_UPDATE_USERNAME'] +password = os.environ['IKAR_UPDATE_PASSWORD'] +env_path = os.environ['IKAR_UPDATE_ARGUS_ENV_PATH'] +local_apk_path = os.environ['IKAR_UPDATE_APK_PATH'] +remote_apk_name = os.environ['IKAR_UPDATE_REMOTE_APK_NAME'] +argus_internal_base_url = os.environ['IKAR_UPDATE_ARGUS_INTERNAL_BASE_URL'] +slug = os.environ['IKAR_UPDATE_ARGUS_SLUG'] +app_name = os.environ['IKAR_UPDATE_ARGUS_NAME'] +summary = os.environ['IKAR_UPDATE_ARGUS_SUMMARY'] +description = os.environ['IKAR_UPDATE_ARGUS_DESCRIPTION'] +homepage_url = os.environ['IKAR_UPDATE_ARGUS_HOMEPAGE_URL'] +release_version = os.environ['IKAR_UPDATE_ARGUS_VERSION'] +channel = os.environ['IKAR_UPDATE_ARGUS_CHANNEL'] +platform = os.environ['IKAR_UPDATE_ARGUS_PLATFORM'] +package_kind = os.environ['IKAR_UPDATE_ARGUS_PACKAGE_KIND'] +notes = os.environ['IKAR_UPDATE_ARGUS_NOTES'] +temp_root = f"/home/{username}/.argus-upload" + +client = paramiko.SSHClient() +client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) +client.connect(host, username=username, password=password, timeout=10) +sftp = client.open_sftp() + +with sftp.open(env_path, 'r') as handle: + content = handle.read().decode('utf-8', errors='replace') + +values = {} +for raw_line in content.splitlines(): + line = raw_line.strip() + if not line or line.startswith('#') or '=' not in line: + continue + key, value = line.split('=', 1) + values[key.strip()] = value.strip() + +username = values.get('Admin__Username') +password = values.get('Admin__Password') +if not username or not password: + raise RuntimeError(f"Admin credentials were not found in {env_path}.") + +parts = temp_root.strip('/').split('/') +current = '/' +for part in parts: + current = posixpath.join(current, part) + try: + sftp.stat(current) + except FileNotFoundError: + sftp.mkdir(current) + +remote_apk_path = posixpath.join(temp_root, remote_apk_name) +sftp.put(local_apk_path, remote_apk_path) +sftp.close() + +def run_remote_python(script: str) -> str: + stdin, stdout, stderr = client.exec_command("python3 -", timeout=600) + stdin.write(script) + stdin.channel.shutdown_write() + out = stdout.read().decode('utf-8', errors='replace') + err = stderr.read().decode('utf-8', errors='replace') + exit_status = stdout.channel.recv_exit_status() + if exit_status != 0: + raise RuntimeError(f"Remote publish failed with exit status {exit_status}\\nSTDOUT:\\n{out}\\nSTDERR:\\n{err}") + return out + +remote_payload = json.dumps({ + 'base_url': argus_internal_base_url.rstrip('/'), + 'slug': slug, + 'package_path': remote_apk_path, + 'admin_username': username, + 'admin_password': password, + 'app_name': app_name, + 'summary': summary, + 'description': description, + 'homepage_url': homepage_url, + 'release_version': release_version, + 'release_channel': channel, + 'release_platform': platform, + 'release_package_kind': package_kind, + 'release_notes': notes, +}) + +remote_script = ''' +import json +import os +import urllib.request +import uuid + +payload = json.loads(%s) +base_url = payload['base_url'] +slug = payload['slug'] +package_path = payload['package_path'] +admin_username = payload['admin_username'] +admin_password = payload['admin_password'] +app_name = payload['app_name'] +summary = payload['summary'] +description = payload['description'] +homepage_url = payload['homepage_url'] +release_version = payload['release_version'] +release_channel = payload['release_channel'] +release_platform = payload['release_platform'] +release_package_kind = payload['release_package_kind'] +release_notes = payload['release_notes'] + +def read_response(response): + body = response.read().decode('utf-8', errors='replace') + return response.getcode(), body + +opener = urllib.request.build_opener() + +login_payload = json.dumps({ + 'username': admin_username, + 'password': admin_password, +}).encode('utf-8') +login_request = urllib.request.Request( + f"{base_url}/api/admin/session/login", + data=login_payload, + headers={'Content-Type': 'application/json'}, + method='POST') +login_response = opener.open(login_request, timeout=600) +login_status, login_body = read_response(login_response) +if login_status < 200 or login_status >= 300: + raise RuntimeError(f"Login failed with status {login_status}: {login_body}") + +cookie_header = login_response.headers.get('Set-Cookie', '') +auth_cookie = cookie_header.split(';', 1)[0].strip() +if not auth_cookie: + raise RuntimeError('Argus login did not return an auth cookie.') + +metadata_payload = json.dumps({ + 'name': app_name, + 'summary': summary, + 'description': description, + 'homepageUrl': homepage_url or None, + 'repositoryUrl': None, + 'isListed': True, +}).encode('utf-8') +metadata_request = urllib.request.Request( + f"{base_url}/api/admin/apps/{slug}", + data=metadata_payload, + headers={ + 'Content-Type': 'application/json', + 'Cookie': auth_cookie, + }, + method='PUT') +metadata_response = opener.open(metadata_request, timeout=600) +metadata_status, metadata_body = read_response(metadata_response) +if metadata_status < 200 or metadata_status >= 300: + raise RuntimeError(f"Metadata update failed with status {metadata_status}: {metadata_body}") + +with open(package_path, 'rb') as handle: + file_bytes = handle.read() + +boundary = f"----IkarArgusBoundary{uuid.uuid4().hex}" +parts: list[bytes] = [] + +def add_field(name: str, value: str): + parts.append(f"--{boundary}\\r\\n".encode('utf-8')) + parts.append(f'Content-Disposition: form-data; name="{name}"\\r\\n\\r\\n'.encode('utf-8')) + parts.append(value.encode('utf-8')) + parts.append(b"\\r\\n") + +for field_name, field_value in [ + ('Version', release_version), + ('Channel', release_channel), + ('Platform', release_platform), + ('PackageKind', release_package_kind), +]: + add_field(field_name, field_value) + +if release_notes: + add_field('Notes', release_notes) + +file_name = os.path.basename(package_path) +parts.append(f"--{boundary}\\r\\n".encode('utf-8')) +parts.append( + f'Content-Disposition: form-data; name="Package"; filename="{file_name}"\\r\\n'.encode('utf-8')) +parts.append(b"Content-Type: application/vnd.android.package-archive\\r\\n\\r\\n") +parts.append(file_bytes) +parts.append(b"\\r\\n") +parts.append(f"--{boundary}--\\r\\n".encode('utf-8')) + +release_request = urllib.request.Request( + f"{base_url}/api/admin/apps/{slug}/releases", + data=b''.join(parts), + headers={ + 'Content-Type': f'multipart/form-data; boundary={boundary}', + 'Cookie': auth_cookie, + }, + method='POST') +release_response = opener.open(release_request, timeout=600) +release_status, release_body = read_response(release_response) +if release_status < 200 or release_status >= 300: + raise RuntimeError(f"Release upload failed with status {release_status}: {release_body}") + +print(release_body) +''' % json.dumps(remote_payload) + +publish_output = run_remote_python(remote_script) + +try: + sftp = client.open_sftp() + sftp.remove(remote_apk_path) + sftp.close() +except Exception: + pass + +client.close() +print(json.dumps({'status': 'UPLOAD_OK', 'release': publish_output.strip()})) +"@ | ForEach-Object { + $env:IKAR_UPDATE_HOST = $ServerHost + $env:IKAR_UPDATE_USERNAME = $Username + $env:IKAR_UPDATE_PASSWORD = $Password + $env:IKAR_UPDATE_ARGUS_ENV_PATH = $ArgusEnvPath + $env:IKAR_UPDATE_APK_PATH = (Resolve-Path $localCopy) + $env:IKAR_UPDATE_REMOTE_APK_NAME = $remoteFileName + $env:IKAR_UPDATE_ARGUS_INTERNAL_BASE_URL = $ArgusInternalBaseUrl + $env:IKAR_UPDATE_ARGUS_SLUG = $Slug + $env:IKAR_UPDATE_ARGUS_NAME = $AppName + $env:IKAR_UPDATE_ARGUS_SUMMARY = $Summary + $env:IKAR_UPDATE_ARGUS_DESCRIPTION = $Description + $env:IKAR_UPDATE_ARGUS_HOMEPAGE_URL = $HomepageUrl + $env:IKAR_UPDATE_ARGUS_VERSION = "$versionName+$versionCode" + $env:IKAR_UPDATE_ARGUS_CHANNEL = $Channel + $env:IKAR_UPDATE_ARGUS_PLATFORM = $Platform + $env:IKAR_UPDATE_ARGUS_PACKAGE_KIND = $PackageKind + $env:IKAR_UPDATE_ARGUS_NOTES = $Notes + $_ +} | python - + +$publishResult = $argusPublishResult | ConvertFrom-Json +if ($publishResult.status -ne 'UPLOAD_OK') { + throw "Argus publish failed." +} + +Write-Output $publishResult.status diff --git a/scripts/publish-windows.ps1 b/scripts/publish-windows.ps1 new file mode 100644 index 00000000..ebfae336 --- /dev/null +++ b/scripts/publish-windows.ps1 @@ -0,0 +1,15 @@ +$ErrorActionPreference = 'Stop' +Set-Location (Join-Path $PSScriptRoot '..') +$project = '.\src\Ikar.WinUI\Ikar.WinUI.csproj' +$target = '.\artifacts\winui-win64' + +dotnet build $project -c Release -f net10.0-windows10.0.19041.0 -p:Platform=x64 + +if (Test-Path $target) { + Remove-Item $target -Recurse -Force +} + +New-Item -ItemType Directory -Path $target | Out-Null +Copy-Item '.\src\Ikar.WinUI\bin\x64\Release\net10.0-windows10.0.19041.0\win-x64\*' $target -Recurse -Force +Get-ChildItem $target -Recurse | Where-Object { $_.Name -like 'Massenger*' } | Remove-Item -Recurse -Force +Write-Host "Windows client prepared at $target\Ikar.WinUI.exe" diff --git a/scripts/run-server.ps1 b/scripts/run-server.ps1 new file mode 100644 index 00000000..eed59b38 --- /dev/null +++ b/scripts/run-server.ps1 @@ -0,0 +1,3 @@ +$ErrorActionPreference = 'Stop' +Set-Location (Join-Path $PSScriptRoot '..') +dotnet run --project .\src\Ikar.Server\Ikar.Server.csproj diff --git a/scripts/smoke-test.ps1 b/scripts/smoke-test.ps1 new file mode 100644 index 00000000..7f5e6263 --- /dev/null +++ b/scripts/smoke-test.ps1 @@ -0,0 +1,190 @@ +$ErrorActionPreference = 'Stop' +Add-Type -AssemblyName System.Net.Http + +$baseUrl = 'http://localhost:5099' +$stamp = Get-Date -Format 'yyyyMMddHHmmss' +$username = "smoke$stamp" +$password = 'Demo123!' +$phoneNumber = "+7900$stamp" + +$session = Invoke-RestMethod ` + -Uri "$baseUrl/api/auth/register" ` + -Method Post ` + -ContentType 'application/json' ` + -Body (@{ + username = $username + displayName = 'Smoke Test' + password = $password + phoneNumber = $phoneNumber + } | ConvertTo-Json) + +$refreshed = Invoke-RestMethod ` + -Uri "$baseUrl/api/auth/refresh" ` + -Method Post ` + -ContentType 'application/json' ` + -Body (@{ + refreshToken = $session.refreshToken + } | ConvertTo-Json) + +$headers = @{ + Authorization = "Bearer $($refreshed.accessToken)" +} + +$installationId = "push-$stamp" +$pushDevice = Invoke-RestMethod ` + -Uri "$baseUrl/api/push/devices" ` + -Headers $headers ` + -Method Post ` + -ContentType 'application/json' ` + -Body (@{ + platform = 1 + installationId = $installationId + deviceToken = "token-$stamp" + deviceName = "Smoke Android $stamp" + notificationsEnabled = $true + } | ConvertTo-Json) + +$pushDevicesAfterRegister = Invoke-RestMethod ` + -Uri "$baseUrl/api/push/devices" ` + -Headers $headers ` + -Method Get +if ($null -eq $pushDevicesAfterRegister) { + $pushDevicesAfterRegister = @() +} +else { + $pushDevicesAfterRegister = @($pushDevicesAfterRegister) +} + +$bob = Invoke-RestMethod -Uri "$baseUrl/api/users/search?q=bob" -Headers $headers -Method Get | Select-Object -First 1 +$channel = Invoke-RestMethod ` + -Uri "$baseUrl/api/chats/channel" ` + -Headers $headers ` + -Method Post ` + -ContentType 'application/json' ` + -Body (@{ + title = "Smoke Channel $stamp" + memberIds = @($bob.id) + } | ConvertTo-Json) + +$message = Invoke-RestMethod ` + -Uri "$baseUrl/api/chats/$($channel.id)/messages" ` + -Headers $headers ` + -Method Post ` + -ContentType 'application/json' ` + -Body (@{ text = 'channel smoke message' } | ConvertTo-Json) + +$edited = Invoke-RestMethod ` + -Uri "$baseUrl/api/chats/$($channel.id)/messages/$($message.id)" ` + -Headers $headers ` + -Method Put ` + -ContentType 'application/json' ` + -Body (@{ text = 'channel smoke message edited' } | ConvertTo-Json) + +$tempFile = Join-Path $env:TEMP "ikar-voice-$stamp.ogg" +"voice smoke test $stamp" | Set-Content -Path $tempFile -NoNewline + +$handler = New-Object System.Net.Http.HttpClientHandler +$client = New-Object System.Net.Http.HttpClient($handler) +$client.BaseAddress = [Uri]::new("$baseUrl/") +$client.DefaultRequestHeaders.Authorization = New-Object System.Net.Http.Headers.AuthenticationHeaderValue('Bearer', $refreshed.accessToken) +$form = New-Object System.Net.Http.MultipartFormDataContent +$form.Add((New-Object System.Net.Http.StringContent('voice caption')), 'text') +$fileStream = [System.IO.File]::OpenRead($tempFile) +$fileContent = New-Object System.Net.Http.StreamContent($fileStream) +$fileContent.Headers.ContentType = New-Object System.Net.Http.Headers.MediaTypeHeaderValue('audio/ogg') +$form.Add($fileContent, 'file', [System.IO.Path]::GetFileName($tempFile)) +$uploadResponse = $client.PostAsync("api/chats/$($channel.id)/attachments", $form).GetAwaiter().GetResult() +$uploadPayload = $uploadResponse.Content.ReadAsStringAsync().GetAwaiter().GetResult() +$fileStream.Dispose() +$form.Dispose() +$client.Dispose() +$handler.Dispose() + +if (-not $uploadResponse.IsSuccessStatusCode) { + throw $uploadPayload +} + +$voiceMessage = $uploadPayload | ConvertFrom-Json +$attachment = $voiceMessage.attachments[0] +$downloadHandler = New-Object System.Net.Http.HttpClientHandler +$downloadClient = New-Object System.Net.Http.HttpClient($downloadHandler) +$downloadClient.BaseAddress = [Uri]::new("$baseUrl/") +$downloadClient.DefaultRequestHeaders.Authorization = New-Object System.Net.Http.Headers.AuthenticationHeaderValue('Bearer', $refreshed.accessToken) +$downloadResponse = $downloadClient.GetAsync($attachment.downloadPath.TrimStart('/')).GetAwaiter().GetResult() +$downloadBytes = $downloadResponse.Content.ReadAsByteArrayAsync().GetAwaiter().GetResult() +$downloadClient.Dispose() +$downloadHandler.Dispose() + +$deleted = Invoke-RestMethod ` + -Uri "$baseUrl/api/chats/$($channel.id)/messages/$($message.id)" ` + -Headers $headers ` + -Method Delete + +$bobSession = Invoke-RestMethod ` + -Uri "$baseUrl/api/auth/login" ` + -Method Post ` + -ContentType 'application/json' ` + -Body (@{ + username = 'bob' + password = 'demo123' + } | ConvertTo-Json) + +$bobHeaders = @{ + Authorization = "Bearer $($bobSession.accessToken)" +} + +$subscriberBlocked = $false +try { + Invoke-RestMethod ` + -Uri "$baseUrl/api/chats/$($channel.id)/messages" ` + -Headers $bobHeaders ` + -Method Post ` + -ContentType 'application/json' ` + -Body (@{ text = 'subscriber should not publish' } | ConvertTo-Json) | Out-Null +} +catch { + $subscriberBlocked = $_.Exception.Response.StatusCode.value__ -eq 403 +} + +$channelForBob = Invoke-RestMethod -Uri "$baseUrl/api/chats/$($channel.id)" -Headers $bobHeaders -Method Get +$channelReload = Invoke-RestMethod -Uri "$baseUrl/api/chats/$($channel.id)" -Headers $headers -Method Get +Invoke-RestMethod -Uri "$baseUrl/api/push/devices/$installationId" -Headers $headers -Method Delete | Out-Null +$pushDevicesAfterDelete = Invoke-RestMethod ` + -Uri "$baseUrl/api/push/devices" ` + -Headers $headers ` + -Method Get +if ($null -eq $pushDevicesAfterDelete) { + $pushDevicesAfterDelete = @() +} +else { + $pushDevicesAfterDelete = @($pushDevicesAfterDelete) +} +Invoke-RestMethod -Uri "$baseUrl/api/auth/logout" -Headers $headers -Method Post | Out-Null + +$logoutBlocked = $false +try { + Invoke-RestMethod -Uri "$baseUrl/api/users/me" -Headers $headers -Method Get | Out-Null +} +catch { + $logoutBlocked = $_.Exception.Response.StatusCode.value__ -eq 401 +} + +[pscustomobject]@{ + Username = $username + ChannelId = $channel.id + EditedMessageId = $edited.id + EditedText = $edited.text + DeletedFlag = $null -ne $deleted.deletedAt + VoiceAttachmentId = $attachment.id + VoiceKind = $attachment.kind + VoiceKindOk = ($attachment.kind -eq 2) -or ($attachment.kind -eq 'VoiceNote') + DownloadOk = [int]$downloadResponse.StatusCode -eq 200 -and $downloadBytes.Length -eq $attachment.fileSizeBytes + PushRegistered = $pushDevice.installationId -eq $installationId + PushListed = $pushDevicesAfterRegister.Count -eq 1 -and $pushDevicesAfterRegister[0].installationId -eq $installationId + PushDeleted = $pushDevicesAfterDelete.Count -eq 0 + MessageCount = $channelReload.messages.Count + SubscriberBlocked = $subscriberBlocked + ChannelReadOnly = -not $channelForBob.canSendMessages + RefreshRotated = $session.refreshToken -ne $refreshed.refreshToken + LogoutBlocked = $logoutBlocked +} diff --git a/src/Ikar.AndroidKotlin/.gitignore b/src/Ikar.AndroidKotlin/.gitignore new file mode 100644 index 00000000..73fb1c8d --- /dev/null +++ b/src/Ikar.AndroidKotlin/.gitignore @@ -0,0 +1,6 @@ +.gradle/ +build/ +app/build/ +local.properties +argus-signing.local.properties +signing/ diff --git a/src/Ikar.AndroidKotlin/ARGUS_PUBLISHING_REQUIREMENTS.md b/src/Ikar.AndroidKotlin/ARGUS_PUBLISHING_REQUIREMENTS.md new file mode 100644 index 00000000..21d4b442 --- /dev/null +++ b/src/Ikar.AndroidKotlin/ARGUS_PUBLISHING_REQUIREMENTS.md @@ -0,0 +1,372 @@ +# Требования к публикации приложений в Argus + +Этот документ фиксирует текущие требования публикации на основе фактического кода `Argus` и Android-клиента `Argus Store` в этом репозитории. Он разделяет: + +1. жёсткие требования, которые реально проверяет сервер; +2. дополнительные требования, без которых приложение не будет нормально устанавливаться через `Argus Store`; +3. условия, при которых `Argus Store` сможет предлагать автообновления. + +Если цель публикации именно в Android-клиент `Argus Store`, нужно одновременно соблюдать и серверные требования, и Android-специфичные требования из этого документа. + +Источники: `scripts/publish-release.ps1:2-139`, `Program.cs:179-239`, `Program.cs:335-661`, `Contracts/ArgusDtos.cs:3-96`, `Infrastructure/SlugUtility.cs:7-39`, `Infrastructure/IdentifierUtility.cs:7-38`, `Infrastructure/SemanticVersionUtility.cs:5-240`, `Infrastructure/PackageStorageService.cs:8-97`, `android/app/src/main/java/xyz/kusoft/argusstore/StoreModels.kt:12-110`, `android/app/src/main/java/xyz/kusoft/argusstore/StoreCatalogLoader.kt:7-34`, `android/app/src/main/java/xyz/kusoft/argusstore/PackageInstallerManager.kt:15-128`, `android/app/src/main/java/xyz/kusoft/argusstore/PackageStateResolver.kt:11-252`, `README.md:13-18`, `README.md:74-113`. + +## 1. Что ИИ обязан подготовить перед публикацией + +Перед публикацией ИИ должен выдать: + +- путь к одному готовому release-файлу; +- `slug`; +- `name`; +- `summary`; +- `description`; +- `version`; +- `channel`; +- `platform`; +- `packageKind`; +- `notes` при наличии; +- `repositoryUrl` при наличии; +- `homepageUrl` при наличии; +- `androidPackageName` для Android-релизов; +- `androidVersionCode` для Android-релизов; +- решение, будет ли приложение публичным (`isListed=true`) или скрытым (`isListed=false`). + +Причина: именно эти поля использует текущий publish-скрипт и серверные DTO. +Источник: `scripts/publish-release.ps1:2-46`, `Contracts/ArgusDtos.cs:62-94`. + +## 2. Жёсткие серверные требования + +### 2.1. Требования к `slug` + +- `slug` обязателен. +- Разрешены только строчные латинские буквы, цифры и дефисы. +- Максимальная длина `slug` — `100` символов. +- Значение должно уже быть нормализовано; сервер не принимает произвольный mixed-case `slug`. + +Фактическое правило валидации: + +- `SlugUtility.Normalize(...)` переводит строку в lowercase, заменяет любые неалфавитно-цифровые символы на `-`, схлопывает повторные дефисы и обрезает дефисы по краям. +- `SlugUtility.IsValid(...)` принимает только строки, которые уже совпадают со своим нормализованным вариантом и имеют длину до `100`. + +Источник: `Infrastructure/SlugUtility.cs:7-39`, `Program.cs:341-345`, `Program.cs:393-397`. + +### 2.2. Обязательные поля метаданных приложения + +Сервер отклоняет публикацию метаданных, если отсутствует хотя бы одно из полей: + +- `name` +- `summary` +- `description` + +Пустые строки и строки из одних пробелов считаются отсутствующими. + +Источник: `Program.cs:372-379`, `Program.cs:582-607`. + +### 2.3. `androidPackageName` + +- Для не-Android публикаций поле опционально. +- Для Android-публикаций поле обязательно на уровне карточки приложения до загрузки релиза. +- Формат должен быть похож на Java package name. + +Фактические правила проверки: + +- минимум 2 сегмента, разделённых точками; +- строка не может начинаться или заканчиваться точкой; +- каждый сегмент должен начинаться с буквы или `_`; +- в сегментах допустимы только буквы, цифры и `_`. + +Примеры подходящего формата: + +- `com.example.app` +- `xyz.kusoft.aletheia` + +Примеры, которые сервер отвергнет: + +- `App` +- `.com.example` +- `com.example.` +- `com.example.my-app` + +Источник: `Program.cs:423-429`, `Program.cs:601-605`, `Program.cs:639-656`. + +### 2.4. Обязательные поля релиза + +Сервер отклоняет загрузку релиза, если отсутствует хотя бы одно из полей: + +- `version` +- `package` (сам файл) + +Пустой файл тоже отклоняется. + +Источник: `Program.cs:401-405`, `Program.cs:616-624`. + +### 2.5. Когда `androidVersionCode` обязателен + +`androidVersionCode` обязателен, если сервер считает релиз Android-артефактом. Сейчас это происходит, когда выполняется хотя бы одно условие: + +- `platform` содержит подстроку `android`, или +- `packageKind` равен `apk`, `xapk` или `apks`. + +Дополнительные правила: + +- если `androidVersionCode` передан, он должен быть положительным целым числом; +- для Android-артефактов `androidVersionCode` не может быть `null`. + +Источник: `Program.cs:418-420`, `Program.cs:423-429`, `Program.cs:613-633`, `Program.cs:659-661`. + +### 2.6. Ограничение на дубликаты релизов + +Сервер не разрешает второй релиз с тем же набором: + +- `slug` +- `version` +- `channel` +- `platform` + +`packageKind` в этом конфликте не участвует. Это означает, что нельзя загрузить два разных файла с одинаковыми `version + channel + platform` для одного и того же приложения. + +Если нужны разные ABI-сборки одной версии, они должны отличаться именно значением `platform`. + +Источник: `Program.cs:432-444`. + +### 2.7. Публичность приложения + +- В publish-скрипте приложение по умолчанию публикуется как публичное (`isListed=true`). +- Если использовать ключ `-Unlisted`, сервер сохранит `isListed=false`. +- Публичные API `/api/apps`, `/api/apps/{slug}` и `/api/apps/{slug}/manifest` возвращают только `IsListed` приложения. + +Практический вывод: если приложение должно появиться в `Argus Store`, его нельзя публиковать как `Unlisted`. + +Источник: `scripts/publish-release.ps1:30`, `scripts/publish-release.ps1:59-67`, `Program.cs:179-239`, `Program.cs:378`. + +## 3. Что нужно именно для Android-клиента Argus Store + +Ниже не только серверные требования, но и дополнительные условия текущего Android-клиента. Без них релиз может загрузиться на сервер, но приложение либо не появится в клиенте, либо будет помечено как `Unsupported`, либо не сможет установиться. + +Источник: `android/app/src/main/java/xyz/kusoft/argusstore/StoreCatalogLoader.kt:7-34`, `StoreModels.kt:12-110`, `PackageInstallerManager.kt:15-128`, `PackageStateResolver.kt:11-129`. + +### 3.1. Для установки через Argus Store нужен именно `apk` + +Текущий Android-клиент считает установимыми только релизы, у которых: + +- `packageKind == "apk"` + +`xapk` и `apks` сейчас сервер распознаёт как Android-артефакты для валидации, но Android-клиент их не выбирает как installable release. + +Практическое требование: если приложение должно устанавливаться через `Argus Store`, публикуй обычный `.apk` и ставь `packageKind=apk`. + +Источник: `Program.cs:659-661`, `android/app/src/main/java/xyz/kusoft/argusstore/StoreModels.kt:27-29`, `StoreModels.kt:72-82`. + +### 3.2. Для Android-клиента `androidPackageName` должен быть заполнен + +Если у карточки приложения отсутствует `androidPackageName`, клиент помечает приложение как неподдерживаемое для установки. + +Источник: `android/app/src/main/java/xyz/kusoft/argusstore/PackageStateResolver.kt:12-21`. + +### 3.3. `androidVersionCode` релиза должен совпадать с APK + +Перед отправкой APK в `PackageInstaller` клиент читает скачанный APK и сверяет: + +- `archiveInfo.packageName == androidPackageName` +- `archive versionCode == androidVersionCode` + +Если хотя бы одна проверка не проходит, установка отклоняется. + +Практическое требование: публикуемый `androidPackageName` должен точно совпадать с `applicationId`/package name внутри APK, а `androidVersionCode` — точно с `versionCode` внутри APK. + +Источник: `android/app/src/main/java/xyz/kusoft/argusstore/PackageInstallerManager.kt:24-55`. + +### 3.4. Требования к `platform` для подбора совместимого APK + +Клиент выбирает релиз как совместимый, если: + +- `packageKind == "apk"`, и +- `platform` соответствует одному из распознаваемых вариантов. + +Релиз считается универсальным, если `platform` равен: + +- `android` +- `android-universal` +- `android-generic` +- `generic` + +Для ABI-специфичных APK клиент ищет в `platform` одну из подстрок, связанных с ABI устройства: + +- `arm64` +- `arm64-v8a` +- `android-arm64` +- `android-arm64-v8a` +- `armv7` +- `armeabi-v7a` +- `android-armv7` +- `android-armeabi-v7a` +- `x86_64` +- `android-x86_64` +- `x86` +- `android-x86` + +Рекомендация для предсказуемости публикации: + +- universal APK: использовать `platform=android-universal`; +- ARM64 APK: использовать `platform=android-arm64`; +- ARMv7 APK: использовать `platform=android-armv7`; +- x86_64 APK: использовать `platform=android-x86_64`; +- x86 APK: использовать `platform=android-x86`. + +Первые два блока выше — фактическое поведение клиента. Последний блок — рекомендация для единообразия, а не серверная проверка. + +Источник: `android/app/src/main/java/xyz/kusoft/argusstore/StoreModels.kt:72-110`. + +### 3.5. Как клиент выбирает предпочитаемый APK + +Среди совместимых installable APK клиент выбирает релиз по такому порядку: + +1. больший `androidVersionCode`; +2. более поздний `publishedAt`; +3. большее строковое `version`. + +Практический вывод: для Android-обновлений нельзя полагаться только на красивый `version`; нужно монотонно увеличивать `androidVersionCode`. + +Источник: `android/app/src/main/java/xyz/kusoft/argusstore/StoreModels.kt:72-82`, `PackageStateResolver.kt:44-59`. + +## 4. Что нужно для корректной работы обновлений + +### 4.1. Для обычного обнаружения обновлений + +Чтобы клиент видел, что доступно обновление, нужны одновременно: + +- установленный пакет с тем же `androidPackageName`; +- опубликованный совместимый APK; +- у релиза должен быть заполнен `androidVersionCode`; +- новый `androidVersionCode` должен быть больше установленного на устройстве. + +Источник: `android/app/src/main/java/xyz/kusoft/argusstore/PackageStateResolver.kt:33-59`. + +### 4.2. Для best-effort автообновлений без ручного подтверждения + +Текущий клиент считает автообновление потенциально возможным только если одновременно выполняются все условия: + +- приложение уже установлено; +- опубликованный APK имеет `androidVersionCode`; +- в настройках Android разрешены установки из `Argus Store`; +- устройство работает минимум на Android 12 / API 31; +- установленное приложение было установлено именно `Argus Store`; +- `targetSdkVersion` установленного приложения не ниже минимального значения для текущего API устройства. + +Минимальные `targetSdkVersion`, которые сейчас проверяет клиент: + +- API 31-32: `29` +- API 33: `30` +- API 34: `31` +- API 35: `33` +- API 36 и выше: `34` + +Важно: + +- эти условия не гарантируют полностью бесшумное обновление на любом устройстве; +- это только текущая эвристика клиента, при которой он считает no-touch update допустимым к попытке. + +Источник: `android/app/src/main/java/xyz/kusoft/argusstore/PackageStateResolver.kt:76-129`, `PackageStateResolver.kt:244-252`. + +## 5. Рекомендации по версии и артефакту + +### 5.1. `version` + +Сервер выбирает `latest` релиз по semantic version precedence, если обе сравниваемые версии парсятся как semver. Если хотя бы одна версия не парсится, сравнение откатывается к обычному case-insensitive строковому сравнению. + +Практическая рекомендация: использовать semver-совместимые версии: + +- `1.0.0` +- `1.2.3` +- `1.2.3-beta.1` +- `v1.2.3` + +Это рекомендация для предсказуемого выбора `latest`, а не отдельная серверная валидация. + +Источник: `Infrastructure/SemanticVersionUtility.cs:5-240`, `Program.cs:563-567`, `README.md:20`. + +### 5.2. Расширение файла + +Сервер сохраняет любой непустой загруженный файл и вычисляет для него: + +- `SHA-256` +- размер в байтах +- исходное имя файла +- content type + +Но текущий publish-скрипт автоматически выставляет специальный MIME type только для файлов с расширением `.apk`. Для остальных расширений он ставит `application/octet-stream`. + +Практическое требование для Android-публикаций: использовать реальный `.apk` файл. + +Источник: `Infrastructure/PackageStorageService.cs:8-97`, `scripts/publish-release.ps1:111-121`. + +## 6. Шаблон brief'а для другого ИИ + +Ниже шаблон, который можно отдавать ИИ как входное задание. Он построен только из полей и ограничений, которые реально используются текущим `Argus`. + +```yaml +argusPublication: + target: "Argus" + mustBeVisibleInArgusStore: true + + app: + slug: "" + name: "" + summary: "" + description: "" + repositoryUrl: "" + homepageUrl: "" + isListed: true + + android: + androidPackageName: "" + versionName: "" + versionCode: + targetSdkVersion: + abiKind: "" + + release: + version: "" + channel: "stable" + platform: "" + packageKind: "apk" + notes: "" + packagePath: "" + + mandatoryChecks: + - "APK exists and is non-empty." + - "APK package name exactly matches androidPackageName." + - "APK versionCode exactly matches androidVersionCode." + - "If the app should appear in Argus Store, isListed must be true." + - "No existing Argus release uses the same slug + version + channel + platform." + - "If this is an update, androidVersionCode is greater than the already published Android version code." +``` + +## 7. Минимальная команда публикации + +Текущий стандартный путь публикации в этом репозитории — `scripts/publish-release.ps1`, который: + +1. логинится в admin API; +2. делает `PUT /api/admin/apps/{slug}`; +3. делает `POST /api/admin/apps/{slug}/releases`. + +Минимальный пример для Android APK: + +```powershell +.\scripts\publish-release.ps1 ` + -BaseUrl "https://argus.kusoft.xyz" ` + -Username "" ` + -Password "" ` + -Slug "" ` + -Name "" ` + -Summary "

" ` + -Description "" ` + -AndroidPackageName "" ` + -Version "" ` + -Channel "stable" ` + -Platform "android-universal" ` + -PackageKind "apk" ` + -AndroidVersionCode ` + -PackagePath "" +``` + +Источник: `scripts/publish-release.ps1:53-130`, `README.md:74-90`. diff --git a/src/Ikar.AndroidKotlin/MIGRATION_STATUS.md b/src/Ikar.AndroidKotlin/MIGRATION_STATUS.md new file mode 100644 index 00000000..9f2ec473 --- /dev/null +++ b/src/Ikar.AndroidKotlin/MIGRATION_STATUS.md @@ -0,0 +1,79 @@ +# Migration Status + +Источник переносимого клиента: +- `G:\Repos\Massenger\src\Ikar.Client` +- `G:\Repos\Massenger\src\Ikar.Client\Platforms\Android` + +## Уже поднято в Kotlin-проекте +- Gradle/AGP/Compose проект +- Session storage +- HTTP API client +- Прямой update manifest через Argus +- Phone auth: + - `request-code` + - `verify-code` + - рабочий login screen +- Chats screen +- Chat screen +- Realtime SignalR для: + - `MessageCreated` + - `MessageUpdated` + - `ChatCreated` + - `ChatsChanged` + - `AppUpdateAvailable` + - `IncomingCall` + - `CallConnected` + - `CallEnded` + - `CallOffer` + - `CallAnswer` + - `CallIceCandidate` +- Push/notification контур: + - Firebase manual bootstrap from `firebase.android.json` + - FCM token refresh service + - device registration to `/api/push/devices` + - Android notification channels + - notification display for message/update/call pushes + - живая push-проверка на телефоне +- Call state manager +- Call overlay screen +- Исходящий audio/video call signaling через SignalR +- Android WebRTC media pipeline для звонков: + - `PeerConnectionFactory` + - `PeerConnection` + - audio track capture/playback + - video capturer и renderer для call screen +- Profile screen: + - загрузка `me` + - редактирование display name / about + - upload/delete avatar +- Contacts screen +- Discover screen +- Forward screen +- Settings root screen +- Notification settings screen +- Bots list screen +- Bot editor screen: + - create + - update + - commands + - regenerate token + - open direct chat with bot + +## Остаётся перенести +- Media viewer / attachments upload +- Voice notes +- User profile screen для чужого пользователя +- Полный settings tree из MAUI-клиента +- Group/channel creation flow в Discover +- Runtime permission flow для microphone/camera/read contacts в полном UX-виде +- Чистую Firebase default initialization без warning в логах +- End-to-end верификацию media calls на авторизованном Kotlin-клиенте + +## Следующий практический этап +- проверить новые Kotlin-экраны вручную на телефоне +- затем перенести: + - media viewer + - attachments upload + - voice notes + - user profile + - полный settings tree diff --git a/src/Ikar.AndroidKotlin/README.md b/src/Ikar.AndroidKotlin/README.md new file mode 100644 index 00000000..b999d7cb --- /dev/null +++ b/src/Ikar.AndroidKotlin/README.md @@ -0,0 +1,39 @@ +# Ikar Android Kotlin + +Отдельный Android-клиент на Kotlin/Jetpack Compose, создаваемый как поэтапная замена текущего MAUI-клиента. + +Что уже перенесено в этом проекте: +- базовая Gradle/Android-структура +- Compose-приложение с экранами `Login`, `Chats`, `Chat` +- HTTP-клиент к `ikar.kusoft.xyz` +- хранение сессии +- прямой Android update manifest через `argus.kusoft.xyz` +- базовая модель данных, совместимая с текущими DTO `Ikar.Shared` + +Что еще не перенесено: +- push/FCM +- SignalR realtime и звонки +- запись и проигрывание voice notes +- загрузка вложений и аватаров в полном объеме +- контакты телефона, профиль, настройки, боты и остальная функциональность MAUI-клиента + +Текущее состояние нужно считать рабочим стартом переписывания, а не полным feature parity. + +## Подготовка к публикации в Argus + +- Локальная release-подпись хранится в gitignored файлах `argus-signing.local.properties` и `signing/`. +- Единая координата публикации для клиента Икар: slug `ikar-android`, channel `stable`, platform `android`. + Именно этот manifest запрашивают текущий Android-клиент и серверный proxy обновлений. +- Первый запуск локального signing pipeline: + - `.\scripts\new-argus-upload-keystore.ps1` +- Подготовка signed APK и metadata JSON для Argus: + - `.\scripts\prepare-argus-publication.ps1` + +Скрипт подготовки собирает `release` APK, проверяет подпись и извлекает из самого APK: +- `androidPackageName` +- `androidVersionCode` +- `version` +- `targetSdkVersion` +- ABI/`platform` + +После этого он складывает готовый APK и metadata JSON в `build/argus-publication/v/`. diff --git a/src/Ikar.AndroidKotlin/app/build.gradle.kts b/src/Ikar.AndroidKotlin/app/build.gradle.kts new file mode 100644 index 00000000..577622dc --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/build.gradle.kts @@ -0,0 +1,122 @@ +import java.util.Properties + +plugins { + id("com.android.application") + id("com.google.devtools.ksp") + id("org.jetbrains.kotlin.plugin.compose") + id("org.jetbrains.kotlin.plugin.serialization") +} + +val argusSigningProperties = Properties().apply { + val propertiesFile = rootProject.file("argus-signing.local.properties") + if (propertiesFile.exists()) { + propertiesFile.inputStream().use(::load) + } +} + +fun argusSigningValue(propertyKey: String, envKey: String): String? = + (argusSigningProperties.getProperty(propertyKey) ?: System.getenv(envKey)) + ?.trim() + ?.takeIf { it.isNotEmpty() } + +val releaseStoreFilePath = argusSigningValue("storeFile", "IKAR_ARGUS_STORE_FILE") +val releaseStorePassword = argusSigningValue("storePassword", "IKAR_ARGUS_STORE_PASSWORD") +val releaseKeyAlias = argusSigningValue("keyAlias", "IKAR_ARGUS_KEY_ALIAS") +val releaseKeyPassword = argusSigningValue("keyPassword", "IKAR_ARGUS_KEY_PASSWORD") +val hasArgusReleaseSigning = + releaseStoreFilePath != null && + releaseStorePassword != null && + releaseKeyAlias != null && + releaseKeyPassword != null + +android { + namespace = "com.seven.ikar.kotlin" + compileSdk = 36 + + defaultConfig { + applicationId = "com.seven.ikar.kotlin" + minSdk = 24 + targetSdk = 36 + versionCode = 180 + versionName = "3.67" + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + vectorDrawables.useSupportLibrary = true + } + + signingConfigs { + if (hasArgusReleaseSigning) { + create("argusRelease") { + storeFile = rootProject.file(releaseStoreFilePath!!) + storePassword = releaseStorePassword + keyAlias = releaseKeyAlias + keyPassword = releaseKeyPassword + } + } + } + + buildTypes { + release { + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + if (hasArgusReleaseSigning) { + signingConfig = signingConfigs.getByName("argusRelease") + } + } + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + + buildFeatures { + compose = true + buildConfig = true + } + + packaging { + resources { + excludes += "/META-INF/{AL2.0,LGPL2.1}" + } + } +} + +dependencies { + val composeBom = platform("androidx.compose:compose-bom:2026.03.00") + val roomVersion = "2.8.4" + + implementation("androidx.core:core-ktx:1.17.0") + implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.9.4") + implementation("androidx.lifecycle:lifecycle-runtime-compose:2.9.4") + implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.9.4") + implementation("androidx.activity:activity-compose:1.11.0") + implementation("androidx.fragment:fragment:1.3.0") + implementation("androidx.navigation:navigation-compose:2.9.1") + implementation("androidx.datastore:datastore-preferences:1.1.7") + implementation("androidx.room:room-runtime:$roomVersion") + implementation("androidx.room:room-ktx:$roomVersion") + implementation("androidx.work:work-runtime-ktx:2.11.0") + ksp("androidx.room:room-compiler:$roomVersion") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.10.2") + implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.9.0") + implementation("com.squareup.okhttp3:okhttp:4.12.0") + implementation("com.squareup.okhttp3:logging-interceptor:4.12.0") + implementation("io.coil-kt:coil-compose:2.7.0") + implementation("com.microsoft.signalr:signalr:8.0.17") + implementation("com.google.firebase:firebase-messaging:25.0.1") + implementation("io.github.webrtc-sdk:android:144.7559.01") + + implementation(composeBom) + androidTestImplementation(composeBom) + implementation("androidx.compose.ui:ui") + implementation("androidx.compose.ui:ui-tooling-preview") + implementation("androidx.compose.foundation:foundation") + implementation("androidx.compose.material3:material3") + implementation("androidx.compose.material:material-icons-extended") + debugImplementation("androidx.compose.ui:ui-tooling") + debugImplementation("androidx.compose.ui:ui-test-manifest") +} diff --git a/src/Ikar.AndroidKotlin/app/proguard-rules.pro b/src/Ikar.AndroidKotlin/app/proguard-rules.pro new file mode 100644 index 00000000..bce7e92d --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/proguard-rules.pro @@ -0,0 +1 @@ +# Intentionally empty for the first migration pass. diff --git a/src/Ikar.AndroidKotlin/app/src/main/AndroidManifest.xml b/src/Ikar.AndroidKotlin/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..56d41882 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/AndroidManifest.xml @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Ikar.AndroidKotlin/app/src/main/assets/firebase.android.json b/src/Ikar.AndroidKotlin/app/src/main/assets/firebase.android.json new file mode 100644 index 00000000..9936b57d --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/assets/firebase.android.json @@ -0,0 +1,6 @@ +{ + "applicationId": "1:91097833269:android:c123132a32a690ba19b67c", + "projectId": "ikar-3bdfb", + "apiKey": "AIzaSyCgjHUi4zFNRfwAwsiLBlRZCGup78N74ks", + "senderId": "91097833269" +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/MainActivity.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/MainActivity.kt new file mode 100644 index 00000000..59ae9bce --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/MainActivity.kt @@ -0,0 +1,307 @@ +package com.seven.ikar.kotlin + +import android.Manifest +import android.app.Activity +import android.app.KeyguardManager +import android.content.Intent +import android.graphics.Color +import android.net.Uri +import android.os.Build +import android.os.Bundle +import android.provider.Settings +import androidx.activity.ComponentActivity +import androidx.activity.result.contract.ActivityResultContracts +import androidx.activity.compose.setContent +import androidx.core.view.WindowCompat +import androidx.core.view.WindowInsetsControllerCompat +import androidx.lifecycle.lifecycleScope +import com.seven.ikar.kotlin.app.IkarApp +import com.seven.ikar.kotlin.app.IkarNativeApp +import com.seven.ikar.kotlin.core.push.AndroidAppVisibilityState +import com.seven.ikar.kotlin.core.push.IncomingCallFullScreenSetupHelper +import com.seven.ikar.kotlin.core.push.IncomingCallFullScreenSetupResult +import com.seven.ikar.kotlin.core.push.InitialCallPermissionPromptStore +import com.seven.ikar.kotlin.core.push.endedCallIdFromIntent +import com.seven.ikar.kotlin.core.push.pendingIncomingCallInviteFromIntent +import com.seven.ikar.kotlin.core.push.PushDataKeys +import com.seven.ikar.kotlin.core.push.PushDataKinds +import com.seven.ikar.kotlin.feature.share.PendingExternalShare +import com.seven.ikar.kotlin.ui.SecureWindowFlagController +import kotlinx.coroutines.launch + +class MainActivity : ComponentActivity() { + private val applicationContainer + get() = (application as IkarNativeApp).container + private val initialCallPermissionPromptStore by lazy { InitialCallPermissionPromptStore(this) } + private var lastInitialCallPermissionRequirement: String? = null + private var isUnlockedForVisibleSession = false + private var isUnlockChallengeInProgress = false + private val appUnlockLauncher = registerForActivityResult( + ActivityResultContracts.StartActivityForResult() + ) { result -> + isUnlockChallengeInProgress = false + if (result.resultCode == Activity.RESULT_OK) { + isUnlockedForVisibleSession = true + applicationContainer.appLockState.setLocked(false) + SecureWindowFlagController.setSecure(window, AppLockSecureToken, false) + } else { + applicationContainer.appLockState.setLocked(true) + SecureWindowFlagController.setSecure(window, AppLockSecureToken, true) + } + } + private val initialCallPermissionSettingsLauncher = registerForActivityResult( + ActivityResultContracts.StartActivityForResult() + ) { + continueInitialCallPermissionSetup(fromSettingsReturn = true) + } + private val initialCallNotificationPermissionLauncher = registerForActivityResult( + ActivityResultContracts.RequestPermission() + ) { granted -> + if (granted) { + continueInitialCallPermissionSetup() + } else { + lastInitialCallPermissionRequirement = InitialRequirementAppNotifications + initialCallPermissionSettingsLauncher.launch(buildAppNotificationSettingsIntent()) + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + WindowCompat.setDecorFitsSystemWindows(window, false) + window.statusBarColor = Color.TRANSPARENT + window.navigationBarColor = Color.TRANSPARENT + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + window.isNavigationBarContrastEnforced = false + window.isStatusBarContrastEnforced = false + } + WindowInsetsControllerCompat(window, window.decorView).apply { + isAppearanceLightStatusBars = true + isAppearanceLightNavigationBars = true + } + handleIncomingIntent(intent) + setContent { + IkarApp() + } + enforceAppLockIfNeeded() + continueInitialCallPermissionSetup() + } + + override fun onNewIntent(intent: Intent) { + super.onNewIntent(intent) + setIntent(intent) + handleIncomingIntent(intent) + } + + override fun onStart() { + super.onStart() + AndroidAppVisibilityState.setVisible(true) + enforceAppLockIfNeeded() + } + + override fun onStop() { + if (!isUnlockChallengeInProgress) { + isUnlockedForVisibleSession = false + } + AndroidAppVisibilityState.setVisible(false) + super.onStop() + } + + private fun enforceAppLockIfNeeded() { + val privacy = applicationContainer.privacyRuntimeSettings.loadSnapshot() + if (!privacy.passcodeLockEnabled) { + applicationContainer.appLockState.setLocked(false) + SecureWindowFlagController.setSecure(window, AppLockSecureToken, false) + return + } + if (isUnlockedForVisibleSession || isUnlockChallengeInProgress) { + return + } + + applicationContainer.appLockState.setLocked(true) + SecureWindowFlagController.setSecure(window, AppLockSecureToken, true) + val keyguardManager = getSystemService(KeyguardManager::class.java) + val unlockIntent = if (keyguardManager.isDeviceSecure) { + keyguardManager.createConfirmDeviceCredentialIntent("Икар", "Разблокируйте устройство, чтобы продолжить") + } else { + null + } + + if (unlockIntent == null) { + isUnlockedForVisibleSession = true + applicationContainer.appLockState.setLocked(false) + SecureWindowFlagController.setSecure(window, AppLockSecureToken, false) + return + } + + isUnlockChallengeInProgress = true + appUnlockLauncher.launch(unlockIntent) + } + + private fun continueInitialCallPermissionSetup(fromSettingsReturn: Boolean = false) { + if (initialCallPermissionPromptStore.wasPrompted()) { + return + } + + when (val result = IncomingCallFullScreenSetupHelper.evaluate(this)) { + IncomingCallFullScreenSetupResult.Ready -> { + initialCallPermissionPromptStore.markPrompted() + lastInitialCallPermissionRequirement = null + } + + IncomingCallFullScreenSetupResult.NeedsPostNotificationsPermission -> { + if (fromSettingsReturn && lastInitialCallPermissionRequirement == InitialRequirementPostNotifications) { + initialCallPermissionPromptStore.markPrompted() + lastInitialCallPermissionRequirement = null + return + } + + lastInitialCallPermissionRequirement = InitialRequirementPostNotifications + initialCallNotificationPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS) + } + + is IncomingCallFullScreenSetupResult.NeedsSystemSettings -> { + val requirement = requirementKeyFor(result) + if (fromSettingsReturn && lastInitialCallPermissionRequirement == requirement) { + initialCallPermissionPromptStore.markPrompted() + lastInitialCallPermissionRequirement = null + return + } + + lastInitialCallPermissionRequirement = requirement + initialCallPermissionSettingsLauncher.launch(result.intent) + } + } + } + + private fun handleIncomingIntent(intent: Intent?) { + val incomingIntent = intent ?: return + if (incomingIntent.action == Intent.ACTION_VIEW) { + val archiveUri = incomingIntent.data ?: incomingIntent.readSingleStream() + if (archiveUri != null) { + lifecycleScope.launch { + runCatching { applicationContainer.archiveFileService.importFromUri(archiveUri) } + .onSuccess(applicationContainer.incomingArchiveStore::setPending) + .onFailure { error -> + applicationContainer.incomingArchiveStore.setError( + message = error.message ?: "Не удалось открыть архив.", + fileName = incomingIntent.getStringExtra(Intent.EXTRA_TITLE) + ?: archiveUri.lastPathSegment + ) + } + } + return + } + } + + if (incomingIntent.action == Intent.ACTION_SEND || incomingIntent.action == Intent.ACTION_SEND_MULTIPLE) { + lifecycleScope.launch { + runCatching { extractPendingShare(incomingIntent) } + .onSuccess(applicationContainer.incomingShareStore::setPending) + .onFailure { applicationContainer.incomingShareStore.clear() } + } + return + } + + val kind = incomingIntent.getStringExtra(PushDataKeys.Kind) + when (kind) { + PushDataKinds.AudioCallInvite, + PushDataKinds.VideoCallInvite -> { + val invite = pendingIncomingCallInviteFromIntent(incomingIntent) + if (invite != null) { + applicationContainer.incomingCallInviteStore.setPending( + invite + ) + } + return + } + + PushDataKinds.AudioCallEnded, + PushDataKinds.VideoCallEnded -> { + val callId = endedCallIdFromIntent(incomingIntent) + applicationContainer.incomingCallInviteStore.clearByCallId(callId) + applicationContainer.callManager.dismissCallIfMatches(callId) + return + } + } + + val chatId = incomingIntent.getStringExtra(PushDataKeys.ChatId) + if ((kind == PushDataKinds.ChatMessage || kind == PushDataKinds.MessageReaction) && !chatId.isNullOrBlank()) { + applicationContainer.incomingPushNavigationStore.setPendingChat( + chatId = chatId, + messageId = incomingIntent.getStringExtra(PushDataKeys.MessageId) + ) + } + } + + private suspend fun extractPendingShare(intent: Intent): PendingExternalShare? { + val sharedText = intent.getStringExtra(Intent.EXTRA_TEXT)?.trim()?.takeIf { it.isNotBlank() } + val attachmentUris = when (intent.action) { + Intent.ACTION_SEND -> intent.readSingleStream()?.let(::listOf) ?: emptyList() + Intent.ACTION_SEND_MULTIPLE -> intent.readMultipleStreams() + else -> emptyList() + } + val attachments = buildList { + attachmentUris.forEach { uri -> + add(applicationContainer.attachmentFileService.importFromUri(uri)) + } + } + if (sharedText == null && attachments.isEmpty()) { + return null + } + + return PendingExternalShare( + text = sharedText, + attachments = attachments + ) + } + + private fun Intent.readSingleStream(): Uri? { + val directStream = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + getParcelableExtra(Intent.EXTRA_STREAM, Uri::class.java) + } else { + @Suppress("DEPRECATION") + getParcelableExtra(Intent.EXTRA_STREAM) + } + return directStream ?: clipData?.takeIf { it.itemCount > 0 }?.getItemAt(0)?.uri + } + + private fun Intent.readMultipleStreams(): List { + val extraStreams = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + getParcelableArrayListExtra(Intent.EXTRA_STREAM, Uri::class.java).orEmpty() + } else { + @Suppress("DEPRECATION") + getParcelableArrayListExtra(Intent.EXTRA_STREAM).orEmpty() + } + val clipDataStreams = buildList { + val currentClipData = clipData ?: return@buildList + repeat(currentClipData.itemCount) { index -> + currentClipData.getItemAt(index).uri?.let(::add) + } + } + return (extraStreams + clipDataStreams).distinct() + } + + private fun buildAppNotificationSettingsIntent(): Intent = + Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS).apply { + putExtra(Settings.EXTRA_APP_PACKAGE, packageName) + putExtra("android.provider.extra.APP_PACKAGE", packageName) + data = Uri.parse("package:$packageName") + } + + private fun requirementKeyFor(result: IncomingCallFullScreenSetupResult.NeedsSystemSettings): String = + when (result.intent.action) { + Settings.ACTION_APP_NOTIFICATION_SETTINGS -> InitialRequirementAppNotifications + Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS -> InitialRequirementCallsChannel + Settings.ACTION_MANAGE_APP_USE_FULL_SCREEN_INTENT -> InitialRequirementFullScreenIntent + else -> InitialRequirementAppDetails + } + + private companion object { + const val InitialRequirementPostNotifications = "post_notifications" + const val InitialRequirementAppNotifications = "app_notifications" + const val InitialRequirementCallsChannel = "calls_channel" + const val InitialRequirementFullScreenIntent = "full_screen_intent" + const val InitialRequirementAppDetails = "app_details" + const val AppLockSecureToken = "app-lock" + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/app/AppContainer.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/app/AppContainer.kt new file mode 100644 index 00000000..cf20a763 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/app/AppContainer.kt @@ -0,0 +1,183 @@ +package com.seven.ikar.kotlin.app + +import android.content.Context +import com.seven.ikar.kotlin.BuildConfig +import com.seven.ikar.kotlin.core.contacts.AndroidContactDiscoveryService +import com.seven.ikar.kotlin.core.contacts.ResolvedContactsRepository +import com.seven.ikar.kotlin.core.local.ChatListCache +import com.seven.ikar.kotlin.core.local.ChatMessageCache +import com.seven.ikar.kotlin.core.local.IkarLocalDatabase +import com.seven.ikar.kotlin.core.model.AuthSessionDto +import com.seven.ikar.kotlin.core.network.ApiClient +import com.seven.ikar.kotlin.core.network.ClientVersionProvider +import com.seven.ikar.kotlin.core.push.AndroidPushSettings +import com.seven.ikar.kotlin.core.push.IncomingCallInviteStore +import com.seven.ikar.kotlin.core.push.IncomingPushNavigationStore +import com.seven.ikar.kotlin.core.push.PushRegistrationManager +import com.seven.ikar.kotlin.core.realtime.RealtimeService +import com.seven.ikar.kotlin.core.settings.AndroidChatSettings +import com.seven.ikar.kotlin.core.settings.AndroidAppSettings +import com.seven.ikar.kotlin.core.settings.AndroidPrivacyRuntimeSettings +import com.seven.ikar.kotlin.core.settings.AppLockState +import com.seven.ikar.kotlin.core.settings.AppProxyType +import com.seven.ikar.kotlin.core.settings.AppSettingsSnapshot +import com.seven.ikar.kotlin.core.session.AuthorizedSessionManager +import com.seven.ikar.kotlin.core.session.SessionStore +import com.seven.ikar.kotlin.core.update.ArgusAppUpdateManager +import com.seven.ikar.kotlin.feature.archive.AndroidArchiveFileService +import com.seven.ikar.kotlin.feature.archive.IncomingArchiveStore +import com.seven.ikar.kotlin.feature.call.AndroidWebRtcCallService +import com.seven.ikar.kotlin.feature.call.AndroidCallTonePlayer +import com.seven.ikar.kotlin.feature.call.CallManager +import com.seven.ikar.kotlin.feature.chat.AndroidAttachmentFileService +import com.seven.ikar.kotlin.feature.chat.AndroidVoiceNotePlayerService +import com.seven.ikar.kotlin.feature.chat.AndroidVoiceNoteRecorderService +import com.seven.ikar.kotlin.feature.chat.ChatScrollStateStore +import com.seven.ikar.kotlin.feature.share.IncomingShareStore +import com.seven.ikar.kotlin.feature.transfer.TransferQueueRepository +import com.seven.ikar.kotlin.feature.transfer.TransferWorkScheduler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.launch +import kotlinx.serialization.json.Json +import okhttp3.OkHttpClient +import okhttp3.logging.HttpLoggingInterceptor +import java.net.InetSocketAddress +import java.net.Proxy + +class AppContainer(context: Context) { + val appContext: Context = context.applicationContext + val applicationScope = CoroutineScope(SupervisorJob() + Dispatchers.IO) + + val json: Json = Json { + ignoreUnknownKeys = true + explicitNulls = false + isLenient = true + } + + private val loggingInterceptor = HttpLoggingInterceptor().apply { + level = HttpLoggingInterceptor.Level.BASIC + } + + val pushSettings = AndroidPushSettings(appContext) + val chatSettings = AndroidChatSettings(appContext) + val appSettings = AndroidAppSettings(appContext) + val privacyRuntimeSettings = AndroidPrivacyRuntimeSettings(appContext) + val appLockState = AppLockState() + + val clientVersionProvider = ClientVersionProvider( + versionCode = BuildConfig.VERSION_CODE.toString(), + versionName = BuildConfig.VERSION_NAME + ) + + @Volatile + private var activeHttpClient: OkHttpClient = buildHttpClient(appSettings.loadSnapshot()) + + val httpClient: OkHttpClient + get() = activeHttpClient + + val sessionStore = SessionStore(appContext, json) + val localDatabase = IkarLocalDatabase.getInstance(appContext) + val chatMessageCache = ChatMessageCache( + database = localDatabase, + dao = localDatabase.cachedChatMessageDao(), + json = json + ) + val chatListCache = ChatListCache( + dao = localDatabase.cachedChatDao(), + json = json + ) + val appUpdateManager = ArgusAppUpdateManager(appContext) + val apiClient = ApiClient( + httpClientProvider = { httpClient }, + json = json, + clientVersionProvider = clientVersionProvider + ) + val authorizedSessionManager = AuthorizedSessionManager( + apiClient = apiClient, + sessionStore = sessionStore + ) + val contactDiscoveryService = AndroidContactDiscoveryService(appContext) + val resolvedContactsRepository = ResolvedContactsRepository( + apiClient = apiClient, + sessionStore = sessionStore, + authorizedSessionManager = authorizedSessionManager, + contactDiscoveryService = contactDiscoveryService + ) + val attachmentFileService = AndroidAttachmentFileService(appContext) + val archiveFileService = AndroidArchiveFileService(appContext) + val transferWorkScheduler = TransferWorkScheduler(appContext) + val transferQueueRepository = TransferQueueRepository( + dao = localDatabase.transferQueueDao(), + scheduler = transferWorkScheduler + ) + val chatScrollStateStore = ChatScrollStateStore(appContext, json) + val incomingShareStore = IncomingShareStore() + val incomingArchiveStore = IncomingArchiveStore() + val incomingPushNavigationStore = IncomingPushNavigationStore() + val incomingCallInviteStore = IncomingCallInviteStore() + val voiceNotePlayerService = AndroidVoiceNotePlayerService() + val voiceNoteRecorderService = AndroidVoiceNoteRecorderService(appContext) + val realtimeService = RealtimeService(clientVersionProvider) + val webRtcCallService = AndroidWebRtcCallService(appContext) + val callTonePlayer = AndroidCallTonePlayer() + val callManager = CallManager( + realtimeService = realtimeService, + authorizedSessionManager = authorizedSessionManager, + webRtcCallService = webRtcCallService, + callTonePlayer = callTonePlayer, + appContext = appContext + ) + val pushRegistrationManager = PushRegistrationManager( + context = appContext, + apiClient = apiClient, + sessionStore = sessionStore, + authorizedSessionManager = authorizedSessionManager, + settings = pushSettings + ) + + init { + applicationScope.launch { + appSettings.snapshot.collect { snapshot -> + activeHttpClient = buildHttpClient(snapshot) + runCatching { + attachmentFileService.enforceCachePolicy( + maxCacheMb = snapshot.maxCacheMb, + keepMediaDays = snapshot.keepMediaDays + ) + } + } + } + } + + suspend fun executeAuthorized(block: suspend (AuthSessionDto) -> T): T = + authorizedSessionManager.executeAuthorized(block) + + private fun buildHttpClient(settings: AppSettingsSnapshot): OkHttpClient { + val proxy = buildProxy(settings) + return OkHttpClient.Builder() + .addInterceptor(loggingInterceptor) + .apply { + if (proxy != null) { + proxy(proxy) + } + } + .build() + } + + private fun buildProxy(settings: AppSettingsSnapshot): Proxy? { + val host = settings.proxyHost.trim() + if (!settings.proxyEnabled || host.isBlank()) { + return null + } + + val proxyType = when (settings.proxyType) { + AppProxyType.Http -> Proxy.Type.HTTP + AppProxyType.Socks5, + AppProxyType.MtProto -> Proxy.Type.SOCKS + } + return Proxy(proxyType, InetSocketAddress(host, settings.proxyPort)) + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/app/IkarApp.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/app/IkarApp.kt new file mode 100644 index 00000000..c243ffdc --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/app/IkarApp.kt @@ -0,0 +1,1162 @@ +package com.seven.ikar.kotlin.app + +import android.net.Uri +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalContext +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.LifecycleEventObserver +import androidx.lifecycle.compose.LocalLifecycleOwner +import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.lifecycle.viewmodel.initializer +import androidx.lifecycle.viewmodel.viewModelFactory +import androidx.navigation.NavType +import androidx.navigation.NavGraph.Companion.findStartDestination +import androidx.navigation.compose.NavHost +import androidx.navigation.compose.composable +import androidx.navigation.compose.currentBackStackEntryAsState +import androidx.navigation.compose.rememberNavController +import androidx.navigation.navArgument +import com.seven.ikar.kotlin.core.model.ChatType +import com.seven.ikar.kotlin.core.settings.AppLocaleManager +import com.seven.ikar.kotlin.feature.archive.ArchiveExtractorScreen +import com.seven.ikar.kotlin.feature.archive.ArchiveExtractorViewModel +import com.seven.ikar.kotlin.feature.bots.BotEditorScreen +import com.seven.ikar.kotlin.feature.bots.BotEditorViewModel +import com.seven.ikar.kotlin.feature.bots.BotsScreen +import com.seven.ikar.kotlin.feature.bots.BotsViewModel +import com.seven.ikar.kotlin.feature.call.CallScreen +import com.seven.ikar.kotlin.core.push.AndroidActiveChatState +import com.seven.ikar.kotlin.feature.chat.ChatScreen +import com.seven.ikar.kotlin.feature.chat.ChatViewModel +import com.seven.ikar.kotlin.feature.chatinfo.ChatInfoScreen +import com.seven.ikar.kotlin.feature.chatinfo.ChatInfoViewModel +import com.seven.ikar.kotlin.feature.chats.ChatsScreen +import com.seven.ikar.kotlin.feature.chats.ChatsViewModel +import com.seven.ikar.kotlin.feature.contacts.ContactsScreen +import com.seven.ikar.kotlin.feature.contacts.ContactsViewModel +import com.seven.ikar.kotlin.feature.devices.DevicesScreen +import com.seven.ikar.kotlin.feature.devices.DevicesViewModel +import com.seven.ikar.kotlin.feature.discover.DiscoverScreen +import com.seven.ikar.kotlin.feature.discover.DiscoverViewModel +import com.seven.ikar.kotlin.feature.folders.ChatFoldersScreen +import com.seven.ikar.kotlin.feature.folders.ChatFoldersViewModel +import com.seven.ikar.kotlin.feature.forward.ForwardScreen +import com.seven.ikar.kotlin.feature.forward.ForwardViewModel +import com.seven.ikar.kotlin.feature.login.LoginScreen +import com.seven.ikar.kotlin.feature.login.LoginViewModel +import com.seven.ikar.kotlin.feature.mainmenu.MainMenuViewModel +import com.seven.ikar.kotlin.feature.members.ChatMembersScreen +import com.seven.ikar.kotlin.feature.members.ChatMembersViewModel +import com.seven.ikar.kotlin.feature.profile.AccountSettingsScreen +import com.seven.ikar.kotlin.feature.profile.PeerProfileScreen +import com.seven.ikar.kotlin.feature.profile.PeerProfileViewModel +import com.seven.ikar.kotlin.feature.profile.ProfileScreen +import com.seven.ikar.kotlin.feature.profile.ProfileViewModel +import com.seven.ikar.kotlin.feature.privacy.PrivacySecurityScreen +import com.seven.ikar.kotlin.feature.privacy.PrivacySecurityViewModel +import com.seven.ikar.kotlin.feature.search.GlobalSearchScreen +import com.seven.ikar.kotlin.feature.search.GlobalSearchViewModel +import com.seven.ikar.kotlin.feature.settings.ChatSettingsScreen +import com.seven.ikar.kotlin.feature.settings.ChatNotificationSettingsScreen +import com.seven.ikar.kotlin.feature.settings.ChatNotificationSettingsViewModel +import com.seven.ikar.kotlin.feature.settings.ChatWallpaperScreen +import com.seven.ikar.kotlin.feature.settings.ChatSettingsViewModel +import com.seven.ikar.kotlin.feature.settings.AppSettingsViewModel +import com.seven.ikar.kotlin.feature.settings.BlockedUsersPlaceholderScreen +import com.seven.ikar.kotlin.feature.settings.DataStorageSettingsScreen +import com.seven.ikar.kotlin.feature.settings.LanguagePlaceholderScreen +import com.seven.ikar.kotlin.feature.settings.NotificationSettingsScreen +import com.seven.ikar.kotlin.feature.settings.NotificationSettingsViewModel +import com.seven.ikar.kotlin.feature.settings.PrivacyExceptionsPlaceholderScreen +import com.seven.ikar.kotlin.feature.settings.ProxyPlaceholderScreen +import com.seven.ikar.kotlin.feature.settings.SettingsScreen +import com.seven.ikar.kotlin.feature.settings.SettingsViewModel +import com.seven.ikar.kotlin.feature.settings.ThemePlaceholderScreen +import com.seven.ikar.kotlin.feature.stories.StoriesScreen +import com.seven.ikar.kotlin.feature.stories.StoriesViewModel +import com.seven.ikar.kotlin.feature.stories.StoryComposerScreen +import com.seven.ikar.kotlin.feature.update.AppUpdateScreen +import com.seven.ikar.kotlin.feature.update.AppUpdateViewModel +import com.seven.ikar.kotlin.ui.LocalIkarAccessToken +import com.seven.ikar.kotlin.ui.LocalUnreadChatsCount +import com.seven.ikar.kotlin.ui.theme.IkarKotlinTheme +import kotlinx.coroutines.launch + +private const val ChatRoutePattern = "chat/{chatId}?messageId={messageId}&scrollToLatest={scrollToLatest}&scrollRequestId={scrollRequestId}" + +private fun chatRoute( + chatId: String, + messageId: String? = null, + scrollToLatest: Boolean = false, + scrollRequestId: Long? = null +): String { + val query = buildList { + messageId?.takeIf { it.isNotBlank() }?.let { add("messageId=${Uri.encode(it)}") } + if (scrollToLatest) { + add("scrollToLatest=true") + } + scrollRequestId?.let { add("scrollRequestId=$it") } + } + val route = "chat/${Uri.encode(chatId)}" + return if (query.isEmpty()) route else "$route?${query.joinToString("&")}" +} + +@Composable +fun IkarApp() { + val context = LocalContext.current + val application = context.applicationContext as IkarNativeApp + val navController = rememberNavController() + val currentBackStackEntry by navController.currentBackStackEntryAsState() + val activeCall by application.container.callManager.currentCall.collectAsStateWithLifecycle() + val pendingShare by application.container.incomingShareStore.pendingShare.collectAsStateWithLifecycle() + val pendingArchive by application.container.incomingArchiveStore.pendingArchive.collectAsStateWithLifecycle() + val pendingCallInvite by application.container.incomingCallInviteStore.pendingInvite.collectAsStateWithLifecycle() + val pendingPushNavigation by application.container.incomingPushNavigationStore.pendingNavigation.collectAsStateWithLifecycle() + val appSettings by application.container.appSettings.snapshot.collectAsStateWithLifecycle() + val isAppLocked by application.container.appLockState.isLocked.collectAsStateWithLifecycle() + val mainMenuViewModel: MainMenuViewModel = viewModel( + factory = viewModelFactory { + initializer { MainMenuViewModel(application.container) } + } + ) + val mainMenuState by mainMenuViewModel.uiState.collectAsStateWithLifecycle() + var currentAccessToken by rememberSaveable { mutableStateOf(application.container.sessionStore.read()?.accessToken) } + var startDestination by rememberSaveable { mutableStateOf("bootstrap") } + + fun navigatePrimary(route: String) { + if (currentBackStackEntry?.destination?.route == route) { + return + } + + navController.navigate(route) { + popUpTo(navController.graph.findStartDestination().id) { saveState = true } + launchSingleTop = true + restoreState = true + } + } + + fun logoutAndReturnToLogin() { + application.container.realtimeService.disconnect() + application.container.applicationScope.launch { + runCatching { application.container.pushRegistrationManager.unregisterCurrentDeviceAsync() } + } + application.container.sessionStore.clear() + currentAccessToken = null + mainMenuViewModel.clear() + navController.navigate("login") { + popUpTo(0) + launchSingleTop = true + } + } + + LaunchedEffect(Unit) { + val session = application.container.sessionStore.read() + currentAccessToken = session?.accessToken + startDestination = if (session == null) "login" else "chats" + } + + LaunchedEffect(appSettings.languageMode) { + AppLocaleManager.apply(context, appSettings.languageMode) + } + + IkarKotlinTheme(settings = appSettings) { + CompositionLocalProvider( + LocalUnreadChatsCount provides mainMenuState.unreadChatsCount, + LocalIkarAccessToken provides currentAccessToken + ) { + if (startDestination != "bootstrap") { + Box(modifier = Modifier.fillMaxSize()) { + NavHost(navController = navController, startDestination = startDestination) { + composable("login") { + val viewModel: LoginViewModel = viewModel( + factory = viewModelFactory { + initializer { LoginViewModel(application.container) } + } + ) + val state by viewModel.uiState.collectAsStateWithLifecycle() + if (state.isAuthenticated) { + LaunchedEffect(state.isAuthenticated) { + currentAccessToken = application.container.sessionStore.read()?.accessToken + mainMenuViewModel.refresh() + navController.navigate("chats") { + popUpTo("login") { inclusive = true } + } + } + } + LoginScreen( + state = state, + onPhoneNumberChanged = viewModel::updatePhoneNumber, + onDisplayNameChanged = viewModel::updateDisplayName, + onVerificationCodeChanged = viewModel::updateVerificationCode, + onRequestCodeClick = viewModel::requestCode, + onVerifyCodeClick = viewModel::verifyCode, + onChangePhoneNumberClick = viewModel::changePhoneNumber + ) + } + + composable("chats") { + val viewModel: ChatsViewModel = viewModel( + factory = viewModelFactory { + initializer { ChatsViewModel(application.container) } + } + ) + val state by viewModel.uiState.collectAsStateWithLifecycle() + val chatSettings by application.container.chatSettings.snapshot.collectAsStateWithLifecycle() + LaunchedEffect(state.pendingShareNavigation?.requestId) { + val target = state.pendingShareNavigation ?: return@LaunchedEffect + viewModel.consumePendingShareNavigation() + navController.navigate( + chatRoute( + chatId = target.chatId, + messageId = target.messageId, + scrollToLatest = target.scrollToLatest, + scrollRequestId = target.requestId + ) + ) + } + ChatsScreen( + state = state, + chatSettings = chatSettings, + onChatClick = { chat -> + if (state.isShareMode) { + viewModel.sendShareToChat(chat) + } else { + navController.navigate("chat/${chat.id}") + } + }, + onChatSelectionClick = viewModel::handleChatSelectionTap, + onChatLongPress = viewModel::handleChatLongPress, + onClearSelection = viewModel::clearSelection, + onSendSelectedChatsClick = viewModel::sendShareToSelectedChats, + onDismissPendingShare = viewModel::dismissPendingShare, + onDeleteSelectedClick = viewModel::showDeleteDialog, + onPinSelectedChatsClick = viewModel::togglePinSelectedChats, + onArchiveSelectedChatsClick = viewModel::archiveSelectedChats, + onMuteSelectedChatsClick = viewModel::muteSelectedChats, + onDismissDeleteDialog = viewModel::dismissDeleteDialog, + onDeleteForEveryoneChanged = viewModel::updateDeleteForEveryone, + onConfirmDeleteSelected = viewModel::confirmDeleteSelected, + onLogoutClick = { + viewModel.logout() + currentAccessToken = null + mainMenuViewModel.clear() + navController.navigate("login") { + popUpTo("chats") { inclusive = true } + } + }, + onRefreshClick = viewModel::refresh, + onProfileClick = { navigatePrimary("profile") }, + onContactsClick = { navigatePrimary("contacts") }, + onDiscoverClick = { navController.navigate("discover") }, + onComposeStoryClick = { navController.navigate("stories/compose") }, + onStoryClick = { story -> navController.navigate("stories/view/${story.id}") }, + onSettingsClick = { navigatePrimary("settings") }, + onNotificationsClick = { navController.navigate("settings/notifications") }, + onGlobalSearchClick = { navController.navigate("search") }, + onQueryChanged = viewModel::updateQuery + ) + } + + composable("search") { + val viewModel: GlobalSearchViewModel = viewModel( + factory = viewModelFactory { + initializer { GlobalSearchViewModel(application.container) } + } + ) + val state by viewModel.uiState.collectAsStateWithLifecycle() + GlobalSearchScreen( + state = state, + onBackClick = { navController.popBackStack() }, + onQueryChanged = viewModel::updateQuery, + onFilterChanged = viewModel::updateFilter, + onDateFilterChanged = viewModel::updateDateFilter, + onResultTypeChanged = viewModel::updateResultType, + onAuthorFilterChanged = viewModel::updateAuthorFilter, + onLoadMore = viewModel::loadMore, + onResultClick = { result -> + val messageId = result.message?.id + if (messageId == null) { + navController.navigate(chatRoute(result.chat.id)) + } else { + navController.navigate(chatRoute(result.chat.id, messageId = messageId)) + } + } + ) + } + + composable( + route = ChatRoutePattern, + arguments = listOf( + navArgument("chatId") { type = NavType.StringType }, + navArgument("messageId") { + type = NavType.StringType + nullable = true + defaultValue = null + }, + navArgument("scrollToLatest") { + type = NavType.BoolType + defaultValue = false + }, + navArgument("scrollRequestId") { + type = NavType.StringType + nullable = true + defaultValue = null + } + ) + ) { backStackEntry -> + val chatId = backStackEntry.arguments?.getString("chatId").orEmpty() + val messageId = backStackEntry.arguments?.getString("messageId")?.takeIf { it.isNotBlank() } + val scrollToLatest = backStackEntry.arguments?.getBoolean("scrollToLatest") ?: false + val scrollRequestId = backStackEntry.arguments?.getString("scrollRequestId") + val viewModel: ChatViewModel = viewModel( + key = "chat-$chatId", + factory = viewModelFactory { + initializer { ChatViewModel(application.container, chatId) } + } + ) + val state by viewModel.uiState.collectAsStateWithLifecycle() + val chatSettings by application.container.chatSettings.snapshot.collectAsStateWithLifecycle() + LaunchedEffect(messageId, scrollToLatest, scrollRequestId) { + if (scrollRequestId != null) { + viewModel.refresh() + } + when { + messageId != null -> viewModel.requestScrollToMessage(messageId) + scrollToLatest -> viewModel.requestScrollToLatest() + } + } + ChatScreen( + state = state, + viewModel = viewModel, + chatSettings = chatSettings, + onBackClick = { navController.popBackStack() }, + onPeerProfileClick = state.peer?.id?.let { userId -> + { navController.navigate("profile/user/$userId") } + } ?: when { + state.chatType != ChatType.Direct -> { + { navController.navigate("chat/$chatId/info") } + } + else -> null + }, + onChatNotificationsClick = { + val encodedTitle = Uri.encode(state.title.ifBlank { "Чат" }) + navController.navigate("chat/$chatId/notifications?title=$encodedTitle") + }, + onChatWallpaperClick = { navController.navigate("settings/chats/wallpaper") }, + onForwardMessage = { message -> + if (!message.hasProtectedContent) { + navController.navigate("forward/${message.chatId}/${message.id}") + } + } + ) + } + + composable( + route = "chat/{chatId}/notifications?title={title}", + arguments = listOf( + navArgument("chatId") { type = NavType.StringType }, + navArgument("title") { + type = NavType.StringType + nullable = true + defaultValue = null + } + ) + ) { backStackEntry -> + val chatId = backStackEntry.arguments?.getString("chatId").orEmpty() + val title = backStackEntry.arguments?.getString("title").orEmpty() + val viewModel: ChatNotificationSettingsViewModel = viewModel( + key = "chat-notifications-$chatId", + factory = viewModelFactory { + initializer { + ChatNotificationSettingsViewModel( + application.container, + chatId, + title + ) + } + } + ) + val state by viewModel.uiState.collectAsStateWithLifecycle() + ChatNotificationSettingsScreen( + state = state, + messageSoundOptions = viewModel.messageSoundOptions, + onBackClick = { navController.popBackStack() }, + onSnapshotChanged = { snapshot -> viewModel.updateSnapshot { snapshot } }, + onMessageSoundChanged = viewModel::setMessageSound, + onResetClick = viewModel::reset + ) + } + + composable( + route = "chat/{chatId}/members", + arguments = listOf(navArgument("chatId") { type = NavType.StringType }) + ) { backStackEntry -> + val chatId = backStackEntry.arguments?.getString("chatId").orEmpty() + val viewModel: ChatMembersViewModel = viewModel( + key = "chat-members-$chatId", + factory = viewModelFactory { + initializer { ChatMembersViewModel(application.container, chatId) } + } + ) + val state by viewModel.uiState.collectAsStateWithLifecycle() + ChatMembersScreen( + state = state, + onBackClick = { navController.popBackStack() }, + onRefreshClick = viewModel::refresh, + onToggleAdmin = viewModel::toggleAdmin, + onToggleCanPost = viewModel::toggleCanPost, + onToggleCanPin = viewModel::toggleCanPin, + onToggleCanDelete = viewModel::toggleCanDelete, + onToggleCanInvite = viewModel::toggleCanInvite, + onMemberSearchChanged = viewModel::updateMemberSearchQuery, + onAddMember = { user -> viewModel.addMember(user, asAdmin = false) }, + onAddAdmin = { user -> viewModel.addMember(user, asAdmin = true) }, + onApproveJoinRequest = viewModel::approveJoinRequest, + onDeclineJoinRequest = viewModel::declineJoinRequest + ) + } + + composable( + route = "chat/{chatId}/info", + arguments = listOf(navArgument("chatId") { type = NavType.StringType }) + ) { backStackEntry -> + val chatId = backStackEntry.arguments?.getString("chatId").orEmpty() + val viewModel: ChatInfoViewModel = viewModel( + key = "chat-info-$chatId", + factory = viewModelFactory { + initializer { ChatInfoViewModel(application.container, chatId) } + } + ) + val state by viewModel.uiState.collectAsStateWithLifecycle() + ChatInfoScreen( + state = state, + onBackClick = { navController.popBackStack() }, + onRefreshClick = viewModel::refresh, + onMembersClick = { navController.navigate("chat/$chatId/members") }, + onSearchClick = { navController.navigate("search") }, + onInviteTitleChanged = viewModel::updateInviteTitle, + onInviteJoinRequestChanged = viewModel::updateInviteCreatesJoinRequest, + onCreateInviteClick = viewModel::createInviteLink, + onRevokeInviteClick = viewModel::revokeInviteLink, + onTopicTitleChanged = viewModel::updateTopicTitle, + onCreateTopicClick = viewModel::createTopic + ) + } + + composable( + route = "profile/user/{userId}", + arguments = listOf(navArgument("userId") { type = NavType.StringType }) + ) { backStackEntry -> + val userId = backStackEntry.arguments?.getString("userId").orEmpty() + val viewModel: PeerProfileViewModel = viewModel( + key = "peer-profile-$userId", + factory = viewModelFactory { + initializer { PeerProfileViewModel(application.container, userId) } + } + ) + val state by viewModel.uiState.collectAsStateWithLifecycle() + PeerProfileScreen( + state = state, + onBackClick = { navController.popBackStack() }, + onRefreshClick = viewModel::refresh + ) + } + + composable("profile") { + val viewModel: ProfileViewModel = viewModel( + factory = viewModelFactory { + initializer { ProfileViewModel(application.container) } + } + ) + val state by viewModel.uiState.collectAsStateWithLifecycle() + ProfileScreen( + state = state, + onSettingsClick = { navController.navigate("settings/account") }, + onLogoutClick = ::logoutAndReturnToLogin, + onManageAvatarClick = viewModel::uploadAvatar, + onChatsClick = { navigatePrimary("chats") }, + onContactsClick = { navigatePrimary("contacts") }, + onProfileClick = { navigatePrimary("profile") }, + onSettingsTabClick = { navigatePrimary("settings") } + ) + } + + composable("settings/account") { + val viewModel: ProfileViewModel = viewModel( + key = "account-settings", + factory = viewModelFactory { + initializer { ProfileViewModel(application.container) } + } + ) + val state by viewModel.uiState.collectAsStateWithLifecycle() + AccountSettingsScreen( + state = state, + onBackClick = { navController.popBackStack() }, + onDisplayNameChanged = viewModel::updateDisplayName, + onAboutChanged = viewModel::updateAbout, + onSaveClick = viewModel::save, + onDeleteAvatarClick = viewModel::deleteAvatar, + onAvatarSelected = viewModel::uploadAvatar + ) + } + + composable("contacts") { + val viewModel: ContactsViewModel = viewModel( + factory = viewModelFactory { + initializer { ContactsViewModel(application.container) } + } + ) + val state by viewModel.uiState.collectAsStateWithLifecycle() + LaunchedEffect(state.pendingChatId) { + val chatId = state.pendingChatId ?: return@LaunchedEffect + viewModel.consumePendingChatNavigation() + navController.navigate("chat/$chatId") + } + ContactsScreen( + state = state, + items = viewModel.filteredItems(), + onQueryChanged = viewModel::updateQuery, + onContactClick = viewModel::startDirectChat, + onRefresh = viewModel::refresh, + onChatsClick = { navigatePrimary("chats") }, + onContactsClick = { navigatePrimary("contacts") }, + onSettingsClick = { navigatePrimary("settings") }, + onProfileClick = { navigatePrimary("profile") }, + onOpenNewMessageClick = { navController.navigate("discover") } + ) + } + + composable("discover") { + val viewModel: DiscoverViewModel = viewModel( + factory = viewModelFactory { + initializer { DiscoverViewModel(application.container) } + } + ) + val state by viewModel.uiState.collectAsStateWithLifecycle() + LaunchedEffect(state.pendingChatId) { + val chatId = state.pendingChatId ?: return@LaunchedEffect + viewModel.consumePendingChatNavigation() + navController.navigate("chat/$chatId") + } + DiscoverScreen( + state = state, + onBackClick = { navController.popBackStack() }, + onQueryChanged = viewModel::updateQuery, + onRefreshClick = viewModel::refresh, + onUserClick = viewModel::handleUserTap, + onBeginGroupSelection = viewModel::beginGroupSelection, + onBeginChannelSelection = viewModel::beginChannelSelection, + onCancelSelection = viewModel::cancelSelection, + onChannelBackClick = viewModel::previousChannelWizardStep, + onChannelTitleChanged = viewModel::updateChannelTitle, + onChannelDescriptionChanged = viewModel::updateChannelDescription, + onChannelVisibilityChanged = viewModel::updateChannelVisibility, + onChannelPublicUsernameChanged = viewModel::updateChannelPublicUsername, + onChannelSignaturesChanged = viewModel::updateChannelSignaturesEnabled, + onContinueChannelWizard = viewModel::continueChannelWizard, + onCompleteSelection = viewModel::completeSelection + ) + } + + composable( + route = "forward/{sourceChatId}/{sourceMessageId}", + arguments = listOf( + navArgument("sourceChatId") { type = NavType.StringType }, + navArgument("sourceMessageId") { type = NavType.StringType } + ) + ) { backStackEntry -> + val sourceChatId = backStackEntry.arguments?.getString("sourceChatId").orEmpty() + val sourceMessageId = backStackEntry.arguments?.getString("sourceMessageId").orEmpty() + val viewModel: ForwardViewModel = viewModel( + key = "forward-$sourceChatId-$sourceMessageId", + factory = viewModelFactory { + initializer { ForwardViewModel(application.container, sourceChatId, sourceMessageId) } + } + ) + val state by viewModel.uiState.collectAsStateWithLifecycle() + LaunchedEffect(state.pendingChatId) { + val chatId = state.pendingChatId ?: return@LaunchedEffect + viewModel.consumePendingChatNavigation() + navController.navigate("chat/$chatId") { + popUpTo("chats") + } + } + ForwardScreen( + state = state, + onBackClick = { navController.popBackStack() }, + onQueryChanged = viewModel::updateQuery, + onUserClick = viewModel::forwardToUser + ) + } + + composable("settings") { + val viewModel: SettingsViewModel = viewModel( + factory = viewModelFactory { + initializer { SettingsViewModel(application.container) } + } + ) + SettingsScreen( + state = viewModel.uiState, + onChatsClick = { navigatePrimary("chats") }, + onContactsClick = { navigatePrimary("contacts") }, + onSettingsClick = { navigatePrimary("settings") }, + onProfileClick = { navigatePrimary("profile") }, + onAccountClick = { navController.navigate("settings/account") }, + onChatSettingsClick = { navController.navigate("settings/chats") }, + onPrivacyClick = { navController.navigate("settings/privacy") }, + onNotificationsClick = { navController.navigate("settings/notifications") }, + onBotsClick = { navController.navigate("bots") }, + onFoldersClick = { navController.navigate("settings/folders") }, + onDevicesClick = { navController.navigate("settings/devices") }, + onUpdatesClick = { navController.navigate("settings/update") }, + onDataStorageClick = { navController.navigate("settings/data-storage") }, + onThemeClick = { navController.navigate("settings/theme") }, + onLanguageClick = { navController.navigate("settings/language") }, + onProxyClick = { navController.navigate("settings/proxy") }, + onStoriesClick = { navController.navigate("stories") }, + ) + } + + composable("settings/privacy") { + val viewModel: PrivacySecurityViewModel = viewModel( + factory = viewModelFactory { + initializer { PrivacySecurityViewModel(application.container) } + } + ) + val state by viewModel.uiState.collectAsStateWithLifecycle() + PrivacySecurityScreen( + state = state, + onBackClick = { navController.popBackStack() }, + onRefreshClick = viewModel::refresh, + onBlockedUsersClick = { navController.navigate("settings/privacy/blocked") }, + onExceptionsClick = { navController.navigate("settings/privacy/exceptions") }, + onUpdate = viewModel::update + ) + } + + composable("settings/privacy/blocked") { + BlockedUsersPlaceholderScreen(onBackClick = { navController.popBackStack() }) + } + + composable("settings/privacy/exceptions") { + PrivacyExceptionsPlaceholderScreen(onBackClick = { navController.popBackStack() }) + } + + composable("settings/data-storage") { + val viewModel: AppSettingsViewModel = viewModel( + factory = viewModelFactory { + initializer { AppSettingsViewModel(application.container) } + } + ) + val state by viewModel.uiState.collectAsStateWithLifecycle() + DataStorageSettingsScreen( + state = state, + onBackClick = { navController.popBackStack() }, + onSnapshotChanged = viewModel::updateSnapshot, + onProxyClick = { navController.navigate("settings/proxy") }, + onResetClick = viewModel::reset + ) + } + + composable("settings/theme") { + val viewModel: AppSettingsViewModel = viewModel( + factory = viewModelFactory { + initializer { AppSettingsViewModel(application.container) } + } + ) + val state by viewModel.uiState.collectAsStateWithLifecycle() + ThemePlaceholderScreen( + state = state, + onBackClick = { navController.popBackStack() }, + onSnapshotChanged = viewModel::updateSnapshot, + onResetClick = viewModel::reset + ) + } + + composable("settings/language") { + val viewModel: AppSettingsViewModel = viewModel( + factory = viewModelFactory { + initializer { AppSettingsViewModel(application.container) } + } + ) + val state by viewModel.uiState.collectAsStateWithLifecycle() + LanguagePlaceholderScreen( + state = state, + onBackClick = { navController.popBackStack() }, + onSnapshotChanged = viewModel::updateSnapshot + ) + } + + composable("settings/proxy") { + val viewModel: AppSettingsViewModel = viewModel( + factory = viewModelFactory { + initializer { AppSettingsViewModel(application.container) } + } + ) + val state by viewModel.uiState.collectAsStateWithLifecycle() + ProxyPlaceholderScreen( + state = state, + onBackClick = { navController.popBackStack() }, + onSnapshotChanged = viewModel::updateSnapshot + ) + } + + composable("stories") { + val viewModel: StoriesViewModel = viewModel( + factory = viewModelFactory { + initializer { StoriesViewModel(application.container) } + } + ) + val state by viewModel.uiState.collectAsStateWithLifecycle() + StoriesScreen( + state = state, + onBackClick = { navController.popBackStack() }, + onComposeClick = { navController.navigate("stories/compose") }, + onRefreshClick = viewModel::refresh, + onStoryClick = viewModel::openStory, + onDeleteStory = viewModel::deleteStory, + onCloseStoryPreview = viewModel::closeStoryPreview, + onNextStory = viewModel::openNextStory, + onPreviousStory = viewModel::openPreviousStory, + onRetryTransfer = viewModel::retryTransfer, + onCancelTransfer = viewModel::cancelTransfer + ) + } + + composable( + route = "stories/view/{storyId}", + arguments = listOf(navArgument("storyId") { type = NavType.StringType }) + ) { backStackEntry -> + val storyId = backStackEntry.arguments?.getString("storyId").orEmpty() + val viewModel: StoriesViewModel = viewModel( + key = "story-view-$storyId", + factory = viewModelFactory { + initializer { StoriesViewModel(application.container) } + } + ) + val state by viewModel.uiState.collectAsStateWithLifecycle() + LaunchedEffect(storyId) { + viewModel.openStoryById(storyId) + } + StoriesScreen( + state = state, + onBackClick = { navController.popBackStack() }, + onComposeClick = { navController.navigate("stories/compose") }, + onRefreshClick = viewModel::refresh, + onStoryClick = viewModel::openStory, + onDeleteStory = viewModel::deleteStory, + onCloseStoryPreview = { + viewModel.closeStoryPreview() + navController.popBackStack() + }, + onNextStory = viewModel::openNextStory, + onPreviousStory = viewModel::openPreviousStory, + onRetryTransfer = viewModel::retryTransfer, + onCancelTransfer = viewModel::cancelTransfer + ) + } + + composable("stories/compose") { + val viewModel: StoriesViewModel = viewModel( + factory = viewModelFactory { + initializer { StoriesViewModel(application.container) } + } + ) + val state by viewModel.uiState.collectAsStateWithLifecycle() + StoryComposerScreen( + state = state, + onBackClick = { navController.popBackStack() }, + onTextChanged = viewModel::updateDraftText, + onVisibilityChanged = viewModel::setVisibility, + onProtectedChanged = viewModel::setProtectedContent, + onTtlChanged = viewModel::setTtlSeconds, + onMediaSelected = viewModel::consumeMediaUris, + onRemoveMedia = viewModel::removePendingMedia, + onClearMedia = viewModel::clearPendingMedia, + onCreateClick = { viewModel.createStory { navController.popBackStack() } }, + onRetryTransfer = viewModel::retryTransfer, + onCancelTransfer = viewModel::cancelTransfer + ) + } + + composable("settings/devices") { + val viewModel: DevicesViewModel = viewModel( + factory = viewModelFactory { + initializer { DevicesViewModel(application.container) } + } + ) + val state by viewModel.uiState.collectAsStateWithLifecycle() + DevicesScreen( + state = state, + onBackClick = { navController.popBackStack() }, + onRefreshClick = viewModel::refresh, + onRevokeClick = viewModel::revoke + ) + } + + composable("settings/folders") { + val viewModel: ChatFoldersViewModel = viewModel( + factory = viewModelFactory { + initializer { ChatFoldersViewModel(application.container) } + } + ) + val state by viewModel.uiState.collectAsStateWithLifecycle() + ChatFoldersScreen( + state = state, + onBackClick = { navController.popBackStack() }, + onRefreshClick = viewModel::refresh, + onNewFolderKeyChanged = viewModel::updateNewFolderKey, + onFolderSelected = viewModel::selectFolder, + onChatToggled = viewModel::toggleChat, + onAssignSelected = viewModel::assignSelectedToFolder, + onClearSelected = viewModel::clearSelectedFolders + ) + } + + composable("settings/update") { + val viewModel: AppUpdateViewModel = viewModel( + factory = viewModelFactory { + initializer { AppUpdateViewModel(application.container) } + } + ) + val state by viewModel.uiState.collectAsStateWithLifecycle() + val lifecycleOwner = LocalLifecycleOwner.current + DisposableEffect(lifecycleOwner) { + val observer = LifecycleEventObserver { _, event -> + if (event == Lifecycle.Event.ON_RESUME) { + viewModel.refreshStatus() + } + } + lifecycleOwner.lifecycle.addObserver(observer) + onDispose { + lifecycleOwner.lifecycle.removeObserver(observer) + } + } + AppUpdateScreen( + state = state, + onBackClick = { navController.popBackStack() }, + onRefreshClick = { + if (state.canRequestPackageInstalls) { + viewModel.checkForUpdates() + } else { + viewModel.requestUnknownSourcesPermission() + context.startActivity( + application.container.appUpdateManager + .buildUnknownSourcesIntent() + .addFlags(android.content.Intent.FLAG_ACTIVITY_NEW_TASK) + ) + } + }, + onInstallClick = viewModel::installAvailableUpdate, + onGrantPermissionClick = { + viewModel.requestUnknownSourcesPermission() + context.startActivity( + application.container.appUpdateManager + .buildUnknownSourcesIntent() + .addFlags(android.content.Intent.FLAG_ACTIVITY_NEW_TASK) + ) + } + ) + } + + composable("archive/open") { + val viewModel: ArchiveExtractorViewModel = viewModel( + factory = viewModelFactory { + initializer { ArchiveExtractorViewModel(application.container) } + } + ) + val state by viewModel.uiState.collectAsStateWithLifecycle() + ArchiveExtractorScreen( + state = state, + onBackClick = { + viewModel.clearAndClose() + navController.popBackStack() + }, + onKeepFoldersChanged = viewModel::setKeepFolders, + onOverwriteExistingChanged = viewModel::setOverwriteExisting, + onExtractClick = viewModel::extract, + onCancelClick = viewModel::cancelExtraction + ) + } + + composable("settings/chats") { + val viewModel: ChatSettingsViewModel = viewModel( + factory = viewModelFactory { + initializer { ChatSettingsViewModel(application.container) } + } + ) + val state by viewModel.uiState.collectAsStateWithLifecycle() + ChatSettingsScreen( + state = state, + onBackClick = { navController.popBackStack() }, + onSnapshotChanged = { snapshot -> viewModel.updateSnapshot { snapshot } }, + onWallpaperClick = { navController.navigate("settings/chats/wallpaper") }, + onResetClick = viewModel::reset + ) + } + + composable("settings/chats/wallpaper") { + val viewModel: ChatSettingsViewModel = viewModel( + factory = viewModelFactory { + initializer { ChatSettingsViewModel(application.container) } + } + ) + val state by viewModel.uiState.collectAsStateWithLifecycle() + ChatWallpaperScreen( + snapshot = state.snapshot, + onBackClick = { navController.popBackStack() }, + onPresetSelected = { presetId -> + viewModel.updateSnapshot { + it.copy( + selectedWallpaperPresetId = presetId, + useCustomWallpaper = false + ) + } + }, + onCustomWallpaperSelected = { uri -> + viewModel.updateSnapshot { + it.copy( + customWallpaperUri = uri.toString(), + useCustomWallpaper = true + ) + } + }, + onUseCustomWallpaper = { + viewModel.updateSnapshot { snapshot -> + if (snapshot.customWallpaperUri.isNullOrBlank()) { + snapshot + } else { + snapshot.copy(useCustomWallpaper = true) + } + } + } + ) + } + + composable("settings/notifications") { + val viewModel: NotificationSettingsViewModel = viewModel( + factory = viewModelFactory { + initializer { NotificationSettingsViewModel(application.container) } + } + ) + val state by viewModel.uiState.collectAsStateWithLifecycle() + NotificationSettingsScreen( + state = state, + messageSoundOptions = viewModel.messageSoundOptions, + callRingtoneOptions = viewModel.callRingtoneOptions, + repeatIntervalOptions = viewModel.repeatIntervalOptions, + onBackClick = { navController.popBackStack() }, + onSnapshotChanged = { snapshot -> viewModel.updateSnapshot { snapshot } }, + onMessageSoundChanged = viewModel::setMessageSound, + onCallRingtoneChanged = viewModel::setCallRingtone, + onRepeatIntervalChanged = viewModel::setRepeatInterval, + onSaveClick = viewModel::save, + onResetClick = viewModel::reset + ) + } + + composable("bots") { + val viewModel: BotsViewModel = viewModel( + factory = viewModelFactory { + initializer { BotsViewModel(application.container) } + } + ) + val state by viewModel.uiState.collectAsStateWithLifecycle() + BotsScreen( + state = state, + onBackClick = { navController.popBackStack() }, + onCreateBotClick = { navController.navigate("bots/editor") }, + onBotClick = { bot -> navController.navigate("bots/editor?botId=${bot.id}") } + ) + } + + composable( + route = "bots/editor?botId={botId}", + arguments = listOf( + navArgument("botId") { + type = NavType.StringType + nullable = true + defaultValue = null + } + ) + ) { backStackEntry -> + val botId = backStackEntry.arguments?.getString("botId") + val viewModel: BotEditorViewModel = viewModel( + key = "bot-editor-${botId ?: "new"}", + factory = viewModelFactory { + initializer { BotEditorViewModel(application.container, botId) } + } + ) + val state by viewModel.uiState.collectAsStateWithLifecycle() + LaunchedEffect(state.pendingChatId) { + val chatId = state.pendingChatId ?: return@LaunchedEffect + viewModel.consumePendingChatNavigation() + navController.navigate("chat/$chatId") + } + LaunchedEffect(state.deleteCompleted) { + if (!state.deleteCompleted) { + return@LaunchedEffect + } + + viewModel.consumeDeleteCompleted() + navController.navigate("bots") { + popUpTo("bots") { + inclusive = true + } + } + } + BotEditorScreen( + state = state, + onBackClick = { navController.popBackStack() }, + onDisplayNameChanged = viewModel::updateDisplayName, + onUsernameChanged = viewModel::updateUsername, + onAboutChanged = viewModel::updateAbout, + onCommandsChanged = viewModel::updateCommandsText, + onEnabledChanged = viewModel::updateEnabled, + onSaveClick = viewModel::save, + onRegenerateTokenClick = viewModel::regenerateToken, + onDeleteBotClick = viewModel::deleteBot, + onOpenChatClick = viewModel::openChat + ) + } + } + + LaunchedEffect(pendingShare?.id, currentBackStackEntry?.destination?.route) { + if (pendingShare == null) { + return@LaunchedEffect + } + if (application.container.sessionStore.read() == null) { + return@LaunchedEffect + } + if (currentBackStackEntry?.destination?.route == "chats") { + return@LaunchedEffect + } + + navigatePrimary("chats") + } + + LaunchedEffect(pendingArchive?.id, currentBackStackEntry?.destination?.route) { + if (pendingArchive == null) { + return@LaunchedEffect + } + if (currentBackStackEntry?.destination?.route == "archive/open") { + return@LaunchedEffect + } + + navController.navigate("archive/open") { + launchSingleTop = true + } + } + + LaunchedEffect(pendingCallInvite?.requestId) { + val invite = pendingCallInvite ?: return@LaunchedEffect + if (application.container.sessionStore.read() == null) { + application.container.incomingCallInviteStore.clear(invite.requestId) + return@LaunchedEffect + } + + application.container.callManager.presentIncomingCallInvite( + callId = invite.callId, + chatId = invite.chatId, + callerId = invite.callerId, + callerDisplayName = invite.callerDisplayName, + callerPhoneNumber = invite.callerPhoneNumber, + mediaType = invite.mediaType + ) + application.container.incomingCallInviteStore.clear(invite.requestId) + } + + LaunchedEffect( + pendingPushNavigation?.requestId, + currentBackStackEntry?.destination?.route, + currentBackStackEntry?.arguments?.getString("chatId") + ) { + val pendingPush = pendingPushNavigation ?: return@LaunchedEffect + if (application.container.sessionStore.read() == null) { + return@LaunchedEffect + } + + val currentRoute = currentBackStackEntry?.destination?.route + val currentChatId = currentBackStackEntry?.arguments?.getString("chatId") + val route = chatRoute( + chatId = pendingPush.chatId, + messageId = pendingPush.messageId, + scrollRequestId = pendingPush.requestId + ) + if (currentRoute == ChatRoutePattern && currentChatId == pendingPush.chatId) { + if (!pendingPush.messageId.isNullOrBlank()) { + navController.navigate(route) { + launchSingleTop = true + } + } + application.container.incomingPushNavigationStore.clear(pendingPush.requestId) + return@LaunchedEffect + } + + navController.navigate(route) { + launchSingleTop = true + } + application.container.incomingPushNavigationStore.clear(pendingPush.requestId) + } + + LaunchedEffect( + currentBackStackEntry?.destination?.route, + currentBackStackEntry?.arguments?.getString("chatId") + ) { + val activeChatId = if (currentBackStackEntry?.destination?.route == ChatRoutePattern) { + currentBackStackEntry?.arguments?.getString("chatId") + } else { + null + } + AndroidActiveChatState.setActiveChatId(activeChatId) + } + + activeCall?.let { call -> + CallScreen( + state = call, + onAccept = application.container.callManager::acceptCurrentCall, + onDecline = application.container.callManager::declineCurrentCall, + onEnd = application.container.callManager::endCurrentCall + ) + } + + if (isAppLocked) { + AppLockedOverlay() + } + } + } + } +} +} + +@Composable +private fun AppLockedOverlay() { + Box( + modifier = Modifier + .fillMaxSize() + .background(Color(0xFF101820)), + contentAlignment = Alignment.Center + ) { + Text( + text = "Икар заблокирован", + style = MaterialTheme.typography.headlineLarge, + color = Color.White + ) + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/app/IkarNativeApp.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/app/IkarNativeApp.kt new file mode 100644 index 00000000..9a9211fd --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/app/IkarNativeApp.kt @@ -0,0 +1,51 @@ +package com.seven.ikar.kotlin.app + +import android.app.Application +import coil.ImageLoader +import coil.ImageLoaderFactory +import coil.disk.DiskCache +import coil.memory.MemoryCache +import coil.request.CachePolicy +import com.seven.ikar.kotlin.core.push.AndroidPushBootstrapper +import java.io.File +import kotlinx.coroutines.launch + +class IkarNativeApp : Application(), ImageLoaderFactory { + lateinit var container: AppContainer + private set + + override fun onCreate() { + super.onCreate() + AndroidPushBootstrapper.tryInitialize(this) + container = AppContainer(this) + container.applicationScope.launch { + container.pushRegistrationManager.initializeAsync() + if (container.sessionStore.read() != null) { + runCatching { container.pushRegistrationManager.registerCurrentDeviceAsync() } + } + } + } + + override fun newImageLoader(): ImageLoader = + ImageLoader.Builder(this) + .callFactory { container.httpClient } + .memoryCache { + MemoryCache.Builder(this) + .maxSizePercent(0.25) + .build() + } + .diskCache { + DiskCache.Builder() + .directory(File(cacheDir, "image_cache")) + .minimumMaxSizeBytes(64L * 1024L * 1024L) + .maximumMaxSizeBytes(256L * 1024L * 1024L) + .maxSizePercent(0.03) + .build() + } + .memoryCachePolicy(CachePolicy.ENABLED) + .diskCachePolicy(CachePolicy.ENABLED) + .networkCachePolicy(CachePolicy.ENABLED) + .respectCacheHeaders(false) + .crossfade(true) + .build() +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/contacts/AndroidContactDiscoveryService.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/contacts/AndroidContactDiscoveryService.kt new file mode 100644 index 00000000..f10c598d --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/contacts/AndroidContactDiscoveryService.kt @@ -0,0 +1,45 @@ +package com.seven.ikar.kotlin.core.contacts + +import android.content.Context +import android.provider.ContactsContract + +data class DeviceContactRecord( + val displayName: String, + val normalizedPhoneNumber: String +) + +class AndroidContactDiscoveryService(private val context: Context) { + fun getContacts(): List { + val contentResolver = context.contentResolver ?: return emptyList() + val contacts = linkedMapOf() + val projection = arrayOf( + ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, + ContactsContract.CommonDataKinds.Phone.NUMBER + ) + + contentResolver.query( + ContactsContract.CommonDataKinds.Phone.CONTENT_URI, + projection, + null, + null, + "${ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME} COLLATE NOCASE ASC" + )?.use { cursor -> + val nameIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME) + val phoneIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER) + + while (cursor.moveToNext()) { + val rawPhone = if (phoneIndex >= 0) cursor.getString(phoneIndex) else null + val normalizedPhone = PhoneNumberNormalizer.normalize(rawPhone) ?: continue + if (contacts.containsKey(normalizedPhone)) { + continue + } + + val rawName = if (nameIndex >= 0) cursor.getString(nameIndex) else null + val displayName = rawName?.trim().takeUnless { it.isNullOrBlank() } ?: normalizedPhone + contacts[normalizedPhone] = DeviceContactRecord(displayName, normalizedPhone) + } + } + + return contacts.values.toList() + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/contacts/PhoneNumberNormalizer.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/contacts/PhoneNumberNormalizer.kt new file mode 100644 index 00000000..a6833aeb --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/contacts/PhoneNumberNormalizer.kt @@ -0,0 +1,16 @@ +package com.seven.ikar.kotlin.core.contacts + +object PhoneNumberNormalizer { + fun normalize(phoneNumber: String?): String? { + if (phoneNumber.isNullOrBlank()) { + return null + } + + val digits = phoneNumber.filter(Char::isDigit) + if (digits.length < 10) { + return null + } + + return if (digits.length == 10) digits else digits.takeLast(10) + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/contacts/ResolvedContactsRepository.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/contacts/ResolvedContactsRepository.kt new file mode 100644 index 00000000..9e6e6bda --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/contacts/ResolvedContactsRepository.kt @@ -0,0 +1,95 @@ +package com.seven.ikar.kotlin.core.contacts + +import com.seven.ikar.kotlin.core.model.UserSummaryDto +import com.seven.ikar.kotlin.core.network.ApiClient +import com.seven.ikar.kotlin.core.network.ServerConfig +import com.seven.ikar.kotlin.core.session.AuthorizedSessionManager +import com.seven.ikar.kotlin.core.session.SessionStore +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext + +data class DiscoverUserItem( + val user: UserSummaryDto, + val displayName: String, + val normalizedPhoneNumber: String, + val isSelected: Boolean = false +) { + val id: String get() = user.id + val username: String get() = user.username + val avatarUrl: String? get() = ServerConfig.normalizeMediaUrl(user.avatarPath) + val secondaryLine: String + get() = if (user.isBot) { + "бот · @${user.username}" + } else if (displayName == user.displayName) { + "" + } else { + "ИКАР: ${user.displayName}" + } +} + +class ResolvedContactsRepository( + private val apiClient: ApiClient, + private val sessionStore: SessionStore, + private val authorizedSessionManager: AuthorizedSessionManager, + private val contactDiscoveryService: AndroidContactDiscoveryService +) { + suspend fun loadResolvedContacts(): List = withContext(Dispatchers.IO) { + val contacts = contactDiscoveryService.getContacts() + if (sessionStore.read() == null) { + return@withContext emptyList() + } + val resolved = authorizedSessionManager.executeAuthorized { session -> + apiClient.resolveContacts( + accessToken = session.accessToken, + phoneNumbers = contacts.map { it.normalizedPhoneNumber }.distinct() + ) + } + + val contactMap = contacts.associateBy { it.normalizedPhoneNumber } + return@withContext resolved + .mapNotNull { match -> + val deviceContact = contactMap[match.phoneNumber] ?: return@mapNotNull null + DiscoverUserItem( + user = match.user, + displayName = deviceContact.displayName, + normalizedPhoneNumber = deviceContact.normalizedPhoneNumber + ) + } + .sortedWith( + compareByDescending { it.user.isBot } + .thenByDescending { it.user.isOnline } + .thenBy { it.displayName.lowercase() } + ) + } + + suspend fun loadMergedCandidates(query: String): List = withContext(Dispatchers.IO) { + if (sessionStore.read() == null) { + return@withContext emptyList() + } + val contacts = loadResolvedContacts() + if (query.isBlank()) { + return@withContext contacts + } + + val merged = contacts.toMutableList() + val existingIds = merged.map { it.id }.toMutableSet() + val remoteUsers = authorizedSessionManager.executeAuthorized { session -> + apiClient.searchUsers(session.accessToken, query) + } + remoteUsers.forEach { user -> + if (existingIds.add(user.id)) { + merged += DiscoverUserItem( + user = user, + displayName = user.displayName, + normalizedPhoneNumber = PhoneNumberNormalizer.normalize(user.phoneNumber) ?: "" + ) + } + } + + return@withContext merged.sortedWith( + compareByDescending { it.user.isBot } + .thenByDescending { it.user.isOnline } + .thenBy { it.displayName.lowercase() } + ) + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/local/CachedChatEntity.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/local/CachedChatEntity.kt new file mode 100644 index 00000000..9ce7ec9f --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/local/CachedChatEntity.kt @@ -0,0 +1,53 @@ +package com.seven.ikar.kotlin.core.local + +import androidx.room.ColumnInfo +import androidx.room.Dao +import androidx.room.Entity +import androidx.room.Index +import androidx.room.Query +import androidx.room.Upsert + +@Entity( + tableName = "cached_chats", + primaryKeys = ["owner_user_id", "chat_id"], + indices = [ + Index(value = ["owner_user_id", "is_archived", "is_pinned"]), + Index(value = ["owner_user_id", "last_activity_at"]) + ] +) +data class CachedChatEntity( + @ColumnInfo(name = "owner_user_id") + val ownerUserId: String, + @ColumnInfo(name = "chat_id") + val chatId: String, + @ColumnInfo(name = "last_activity_at") + val lastActivityAt: String?, + @ColumnInfo(name = "is_pinned") + val isPinned: Boolean, + @ColumnInfo(name = "is_archived") + val isArchived: Boolean, + @ColumnInfo(name = "unread_count") + val unreadCount: Int, + @ColumnInfo(name = "payload_json") + val payloadJson: String, + @ColumnInfo(name = "updated_at_millis") + val updatedAtMillis: Long +) + +@Dao +interface CachedChatDao { + @Query( + """ + SELECT * FROM cached_chats + WHERE owner_user_id = :ownerUserId + ORDER BY is_pinned DESC, last_activity_at DESC + """ + ) + suspend fun loadChats(ownerUserId: String): List + + @Upsert + suspend fun upsert(chats: List) + + @Query("DELETE FROM cached_chats WHERE owner_user_id = :ownerUserId") + suspend fun clear(ownerUserId: String) +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/local/CachedChatMessageDao.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/local/CachedChatMessageDao.kt new file mode 100644 index 00000000..d74e6cc8 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/local/CachedChatMessageDao.kt @@ -0,0 +1,58 @@ +package com.seven.ikar.kotlin.core.local + +import androidx.room.Dao +import androidx.room.Insert +import androidx.room.OnConflictStrategy +import androidx.room.Query + +@Dao +interface CachedChatMessageDao { + @Query( + """ + SELECT * FROM cached_chat_messages + WHERE owner_user_id = :ownerUserId AND chat_id = :chatId + ORDER BY sent_at DESC + LIMIT :limit + """ + ) + suspend fun loadLatestMessages( + ownerUserId: String, + chatId: String, + limit: Int + ): List + + @Query( + """ + SELECT * FROM cached_chat_messages + WHERE owner_user_id = :ownerUserId AND chat_id = :chatId AND is_optimistic = 1 + ORDER BY sent_at ASC + """ + ) + suspend fun loadOptimisticMessages( + ownerUserId: String, + chatId: String + ): List + + @Insert(onConflict = OnConflictStrategy.REPLACE) + suspend fun upsert(messages: List) + + @Query( + """ + DELETE FROM cached_chat_messages + WHERE owner_user_id = :ownerUserId AND chat_id = :chatId AND message_id = :messageId + """ + ) + suspend fun deleteMessage( + ownerUserId: String, + chatId: String, + messageId: String + ) + + @Query( + """ + DELETE FROM cached_chat_messages + WHERE owner_user_id = :ownerUserId AND chat_id = :chatId + """ + ) + suspend fun clearChat(ownerUserId: String, chatId: String) +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/local/CachedChatMessageEntity.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/local/CachedChatMessageEntity.kt new file mode 100644 index 00000000..34ccedf7 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/local/CachedChatMessageEntity.kt @@ -0,0 +1,28 @@ +package com.seven.ikar.kotlin.core.local + +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.Index + +@Entity( + tableName = "cached_chat_messages", + primaryKeys = ["owner_user_id", "chat_id", "message_id"], + indices = [ + Index(value = ["owner_user_id", "chat_id", "sent_at"]), + Index(value = ["owner_user_id", "chat_id", "is_optimistic"]) + ] +) +data class CachedChatMessageEntity( + @ColumnInfo(name = "owner_user_id") + val ownerUserId: String, + @ColumnInfo(name = "chat_id") + val chatId: String, + @ColumnInfo(name = "message_id") + val messageId: String, + @ColumnInfo(name = "sent_at") + val sentAt: String, + @ColumnInfo(name = "payload_json") + val payloadJson: String, + @ColumnInfo(name = "is_optimistic") + val isOptimistic: Boolean +) diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/local/ChatListCache.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/local/ChatListCache.kt new file mode 100644 index 00000000..56091386 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/local/ChatListCache.kt @@ -0,0 +1,38 @@ +package com.seven.ikar.kotlin.core.local + +import com.seven.ikar.kotlin.core.model.ChatSummaryDto +import kotlinx.serialization.decodeFromString +import kotlinx.serialization.encodeToString +import kotlinx.serialization.json.Json + +class ChatListCache( + private val dao: CachedChatDao, + private val json: Json +) { + suspend fun loadChats(ownerUserId: String): List = + dao.loadChats(ownerUserId) + .mapNotNull { entity -> runCatching { json.decodeFromString(entity.payloadJson) }.getOrNull() } + + suspend fun replaceChats(ownerUserId: String, chats: List) { + val now = System.currentTimeMillis() + dao.clear(ownerUserId) + if (chats.isEmpty()) { + return + } + + dao.upsert( + chats.map { chat -> + CachedChatEntity( + ownerUserId = ownerUserId, + chatId = chat.id, + lastActivityAt = chat.lastActivityAt, + isPinned = chat.isPinned, + isArchived = chat.isArchived, + unreadCount = chat.unreadCount, + payloadJson = json.encodeToString(chat), + updatedAtMillis = now + ) + } + ) + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/local/ChatMessageCache.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/local/ChatMessageCache.kt new file mode 100644 index 00000000..828e39d5 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/local/ChatMessageCache.kt @@ -0,0 +1,74 @@ +package com.seven.ikar.kotlin.core.local + +import androidx.room.withTransaction +import com.seven.ikar.kotlin.core.model.MessageDto +import kotlinx.serialization.json.Json +import kotlinx.serialization.decodeFromString +import kotlinx.serialization.encodeToString + +class ChatMessageCache( + private val database: IkarLocalDatabase, + private val dao: CachedChatMessageDao, + private val json: Json +) { + suspend fun loadLatestMessages( + ownerUserId: String, + chatId: String, + limit: Int = LatestMessagesLimit + ): List = + dao.loadLatestMessages(ownerUserId, chatId, limit) + .mapNotNull { it.toMessageOrNull() } + .sortedBy(MessageDto::sentAt) + + suspend fun loadOptimisticMessages(ownerUserId: String, chatId: String): List = + dao.loadOptimisticMessages(ownerUserId, chatId) + .mapNotNull { it.toMessageOrNull() } + .sortedBy(MessageDto::sentAt) + + suspend fun upsertMessages( + ownerUserId: String, + chatId: String, + messages: List, + isOptimistic: Boolean = false + ) { + if (messages.isEmpty()) { + return + } + + dao.upsert( + messages.map { message -> + CachedChatMessageEntity( + ownerUserId = ownerUserId, + chatId = chatId, + messageId = message.id, + sentAt = message.sentAt, + payloadJson = json.encodeToString(message), + isOptimistic = isOptimistic + ) + } + ) + } + + suspend fun replaceOptimisticMessage( + ownerUserId: String, + chatId: String, + localMessageId: String, + serverMessage: MessageDto + ) { + database.withTransaction { + dao.deleteMessage(ownerUserId, chatId, localMessageId) + upsertMessages(ownerUserId, chatId, listOf(serverMessage), isOptimistic = false) + } + } + + suspend fun clearChat(ownerUserId: String, chatId: String) { + dao.clearChat(ownerUserId, chatId) + } + + private fun CachedChatMessageEntity.toMessageOrNull(): MessageDto? = + runCatching { json.decodeFromString(payloadJson) }.getOrNull() + + private companion object { + const val LatestMessagesLimit = 100 + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/local/IkarLocalDatabase.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/local/IkarLocalDatabase.kt new file mode 100644 index 00000000..418f408f --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/local/IkarLocalDatabase.kt @@ -0,0 +1,94 @@ +package com.seven.ikar.kotlin.core.local + +import android.content.Context +import androidx.room.Database +import androidx.room.Room +import androidx.room.RoomDatabase +import androidx.room.migration.Migration +import androidx.sqlite.db.SupportSQLiteDatabase + +@Database( + entities = [CachedChatMessageEntity::class, CachedChatEntity::class, TransferQueueEntity::class], + version = 4, + exportSchema = false +) +abstract class IkarLocalDatabase : RoomDatabase() { + abstract fun cachedChatMessageDao(): CachedChatMessageDao + abstract fun cachedChatDao(): CachedChatDao + abstract fun transferQueueDao(): TransferQueueDao + + companion object { + @Volatile + private var instance: IkarLocalDatabase? = null + + private val Migration1To2 = object : Migration(1, 2) { + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL( + """ + CREATE TABLE IF NOT EXISTS transfer_queue ( + id TEXT NOT NULL PRIMARY KEY, + groupId TEXT NOT NULL, + type TEXT NOT NULL, + status TEXT NOT NULL, + chatId TEXT, + text TEXT, + replyToMessageId TEXT, + attachmentId TEXT, + fileName TEXT NOT NULL, + contentType TEXT NOT NULL, + fileSizeBytes INTEGER NOT NULL, + localPath TEXT NOT NULL, + sortOrder INTEGER NOT NULL, + progressPercent INTEGER NOT NULL, + errorMessage TEXT, + createdAtMillis INTEGER NOT NULL, + updatedAtMillis INTEGER NOT NULL + ) + """.trimIndent() + ) + } + } + + private val Migration2To3 = object : Migration(2, 3) { + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL( + """ + CREATE TABLE IF NOT EXISTS cached_chats ( + owner_user_id TEXT NOT NULL, + chat_id TEXT NOT NULL, + last_activity_at TEXT, + is_pinned INTEGER NOT NULL, + is_archived INTEGER NOT NULL, + unread_count INTEGER NOT NULL, + payload_json TEXT NOT NULL, + updated_at_millis INTEGER NOT NULL, + PRIMARY KEY(owner_user_id, chat_id) + ) + """.trimIndent() + ) + db.execSQL("CREATE INDEX IF NOT EXISTS index_cached_chats_owner_user_id_is_archived_is_pinned ON cached_chats(owner_user_id, is_archived, is_pinned)") + db.execSQL("CREATE INDEX IF NOT EXISTS index_cached_chats_owner_user_id_last_activity_at ON cached_chats(owner_user_id, last_activity_at)") + } + } + + private val Migration3To4 = object : Migration(3, 4) { + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL("ALTER TABLE transfer_queue ADD COLUMN storyVisibility TEXT") + db.execSQL("ALTER TABLE transfer_queue ADD COLUMN hasProtectedContent INTEGER NOT NULL DEFAULT 0") + db.execSQL("ALTER TABLE transfer_queue ADD COLUMN ttlSeconds INTEGER") + } + } + + fun getInstance(context: Context): IkarLocalDatabase = + instance ?: synchronized(this) { + instance ?: Room.databaseBuilder( + context.applicationContext, + IkarLocalDatabase::class.java, + "ikar-local.db" + ) + .addMigrations(Migration1To2, Migration2To3, Migration3To4) + .build() + .also { instance = it } + } + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/local/TransferQueueEntity.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/local/TransferQueueEntity.kt new file mode 100644 index 00000000..e38cd9f2 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/local/TransferQueueEntity.kt @@ -0,0 +1,73 @@ +package com.seven.ikar.kotlin.core.local + +import androidx.room.Dao +import androidx.room.Entity +import androidx.room.Insert +import androidx.room.OnConflictStrategy +import androidx.room.PrimaryKey +import androidx.room.Query +import kotlinx.coroutines.flow.Flow + +@Entity(tableName = "transfer_queue") +data class TransferQueueEntity( + @PrimaryKey val id: String, + val groupId: String, + val type: String, + val status: String, + val chatId: String?, + val text: String?, + val replyToMessageId: String?, + val attachmentId: String?, + val storyVisibility: String?, + val hasProtectedContent: Boolean, + val ttlSeconds: Int?, + val fileName: String, + val contentType: String, + val fileSizeBytes: Long, + val localPath: String, + val sortOrder: Int, + val progressPercent: Int, + val errorMessage: String?, + val createdAtMillis: Long, + val updatedAtMillis: Long +) + +@Dao +interface TransferQueueDao { + @Insert(onConflict = OnConflictStrategy.REPLACE) + suspend fun upsert(items: List) + + @Query("SELECT * FROM transfer_queue WHERE groupId = :groupId ORDER BY sortOrder ASC") + suspend fun getGroup(groupId: String): List + + @Query("SELECT * FROM transfer_queue WHERE chatId = :chatId AND status IN ('queued', 'running', 'failed') ORDER BY createdAtMillis ASC, sortOrder ASC") + fun observeActiveForChat(chatId: String): Flow> + + @Query("SELECT * FROM transfer_queue WHERE type = 'story_upload' AND status IN ('queued', 'running', 'failed') ORDER BY createdAtMillis ASC, sortOrder ASC") + fun observeActiveStoryUploads(): Flow> + + @Query("UPDATE transfer_queue SET status = :status, progressPercent = :progressPercent, errorMessage = :errorMessage, updatedAtMillis = :updatedAtMillis WHERE groupId = :groupId") + suspend fun updateGroupStatus( + groupId: String, + status: String, + progressPercent: Int, + errorMessage: String?, + updatedAtMillis: Long + ) + + @Query("DELETE FROM transfer_queue WHERE groupId = :groupId") + suspend fun deleteGroup(groupId: String) +} + +object TransferQueueTypes { + const val Upload = "upload" + const val StoryUpload = "story_upload" + const val Download = "download" +} + +object TransferQueueStatus { + const val Queued = "queued" + const val Running = "running" + const val Completed = "completed" + const val Failed = "failed" +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/model/Models.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/model/Models.kt new file mode 100644 index 00000000..31da6a90 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/model/Models.kt @@ -0,0 +1,793 @@ +package com.seven.ikar.kotlin.core.model + +import kotlinx.serialization.KSerializer +import kotlinx.serialization.Serializable +import kotlinx.serialization.descriptors.PrimitiveKind +import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder + +@Serializable(with = ChatTypeSerializer::class) +enum class ChatType(val wireValue: Int) { + Direct(1), + Group(2), + Channel(3); + + companion object { + fun fromWireValue(value: Int): ChatType = entries.firstOrNull { it.wireValue == value } ?: Direct + } +} + +@Serializable(with = ChatMemberRoleSerializer::class) +enum class ChatMemberRole(val wireValue: Int) { + Member(0), + Admin(1), + Owner(2); + + companion object { + fun fromWireValue(value: Int): ChatMemberRole = entries.firstOrNull { it.wireValue == value } ?: Member + } +} + +object ChatMemberRoleSerializer : KSerializer { + override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("ChatMemberRole", PrimitiveKind.INT) + override fun deserialize(decoder: Decoder): ChatMemberRole = ChatMemberRole.fromWireValue(decoder.decodeInt()) + override fun serialize(encoder: Encoder, value: ChatMemberRole) = encoder.encodeInt(value.wireValue) +} + +@Serializable(with = ChatJoinRequestStatusSerializer::class) +enum class ChatJoinRequestStatus(val wireValue: Int) { + Pending(0), + Approved(1), + Declined(2); + + companion object { + fun fromWireValue(value: Int): ChatJoinRequestStatus = entries.firstOrNull { it.wireValue == value } ?: Pending + } +} + +object ChatJoinRequestStatusSerializer : KSerializer { + override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("ChatJoinRequestStatus", PrimitiveKind.INT) + override fun deserialize(decoder: Decoder): ChatJoinRequestStatus = ChatJoinRequestStatus.fromWireValue(decoder.decodeInt()) + override fun serialize(encoder: Encoder, value: ChatJoinRequestStatus) = encoder.encodeInt(value.wireValue) +} + +@Serializable(with = ModerationLogTargetTypeSerializer::class) +enum class ModerationLogTargetType(val wireValue: Int) { + Chat(0), + Message(1), + User(2), + InviteLink(3), + JoinRequest(4), + Story(5); + + companion object { + fun fromWireValue(value: Int): ModerationLogTargetType = entries.firstOrNull { it.wireValue == value } ?: Chat + } +} + +object ModerationLogTargetTypeSerializer : KSerializer { + override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("ModerationLogTargetType", PrimitiveKind.INT) + override fun deserialize(decoder: Decoder): ModerationLogTargetType = ModerationLogTargetType.fromWireValue(decoder.decodeInt()) + override fun serialize(encoder: Encoder, value: ModerationLogTargetType) = encoder.encodeInt(value.wireValue) +} + +object ChatTypeSerializer : KSerializer { + override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("ChatType", PrimitiveKind.INT) + override fun deserialize(decoder: Decoder): ChatType = ChatType.fromWireValue(decoder.decodeInt()) + override fun serialize(encoder: Encoder, value: ChatType) = encoder.encodeInt(value.wireValue) +} + +@Serializable(with = AttachmentKindSerializer::class) +enum class AttachmentKind(val wireValue: Int) { + File(1), + VoiceNote(2); + + companion object { + fun fromWireValue(value: Int): AttachmentKind = entries.firstOrNull { it.wireValue == value } ?: File + } +} + +object AttachmentKindSerializer : KSerializer { + override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("AttachmentKind", PrimitiveKind.INT) + override fun deserialize(decoder: Decoder): AttachmentKind = AttachmentKind.fromWireValue(decoder.decodeInt()) + override fun serialize(encoder: Encoder, value: AttachmentKind) = encoder.encodeInt(value.wireValue) +} + +@Serializable(with = MessageDeliveryStateSerializer::class) +enum class MessageDeliveryState(val wireValue: Int) { + Sent(0), + Delivered(1), + Read(2); + + companion object { + fun fromWireValue(value: Int): MessageDeliveryState = entries.firstOrNull { it.wireValue == value } ?: Sent + } +} + +object MessageDeliveryStateSerializer : KSerializer { + override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("MessageDeliveryState", PrimitiveKind.INT) + override fun deserialize(decoder: Decoder): MessageDeliveryState = MessageDeliveryState.fromWireValue(decoder.decodeInt()) + override fun serialize(encoder: Encoder, value: MessageDeliveryState) = encoder.encodeInt(value.wireValue) +} + +@Serializable(with = CallMediaTypeSerializer::class) +enum class CallMediaType(val wireValue: Int) { + Audio(0), + Video(1); + + companion object { + fun fromWireValue(value: Int): CallMediaType = entries.firstOrNull { it.wireValue == value } ?: Audio + } +} + +object CallMediaTypeSerializer : KSerializer { + override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("CallMediaType", PrimitiveKind.INT) + override fun deserialize(decoder: Decoder): CallMediaType = CallMediaType.fromWireValue(decoder.decodeInt()) + override fun serialize(encoder: Encoder, value: CallMediaType) = encoder.encodeInt(value.wireValue) +} + +@Serializable(with = PushPlatformSerializer::class) +enum class PushPlatform(val wireValue: Int) { + Unknown(0), + Android(1), + Windows(2); + + companion object { + fun fromWireValue(value: Int): PushPlatform = entries.firstOrNull { it.wireValue == value } ?: Unknown + } +} + +object PushPlatformSerializer : KSerializer { + override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("PushPlatform", PrimitiveKind.INT) + override fun deserialize(decoder: Decoder): PushPlatform = PushPlatform.fromWireValue(decoder.decodeInt()) + override fun serialize(encoder: Encoder, value: PushPlatform) = encoder.encodeInt(value.wireValue) +} + +@Serializable(with = StoryVisibilitySerializer::class) +enum class StoryVisibility(val wireValue: Int) { + Everyone(0), + Contacts(1), + CloseFriends(2), + Private(3); + + companion object { + fun fromWireValue(value: Int): StoryVisibility = entries.firstOrNull { it.wireValue == value } ?: Everyone + } +} + +object StoryVisibilitySerializer : KSerializer { + override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("StoryVisibility", PrimitiveKind.INT) + override fun deserialize(decoder: Decoder): StoryVisibility = StoryVisibility.fromWireValue(decoder.decodeInt()) + override fun serialize(encoder: Encoder, value: StoryVisibility) = encoder.encodeInt(value.wireValue) +} + +@Serializable +data class UserSummaryDto( + val id: String, + val username: String, + val displayName: String, + val isOnline: Boolean, + val phoneNumber: String? = null, + val lastSeenAt: String? = null, + val about: String? = null, + val avatarPath: String? = null, + val isBot: Boolean = false +) + +@Serializable +data class AttachmentDto( + val id: String, + val fileName: String, + val contentType: String, + val fileSizeBytes: Long, + val downloadPath: String, + val kind: AttachmentKind, + val sortOrder: Int = 0 +) + +@Serializable +data class MessageReplyDto( + val messageId: String, + val senderId: String, + val senderDisplayName: String, + val previewText: String +) + +@Serializable +data class MessageReactionDto( + val emoji: String, + val count: Int, + val isMine: Boolean +) + +@Serializable +data class MessageDto( + val id: String, + val chatId: String, + val chatType: ChatType = ChatType.Direct, + val sender: UserSummaryDto, + val text: String, + val attachments: List = emptyList(), + val sentAt: String, + val editedAt: String? = null, + val deletedAt: String? = null, + val deliveryState: MessageDeliveryState, + val forwardedFromDisplayName: String? = null, + val replyTo: MessageReplyDto? = null, + val pinnedAt: String? = null, + val pinnedBy: UserSummaryDto? = null, + val mediaAlbumId: String? = null, + val reactions: List = emptyList(), + val hasProtectedContent: Boolean = false, + val expiresAt: String? = null, + val ttlSeconds: Int? = null, + val postedAsChannel: Boolean = false, + val displayAuthorName: String? = null, + val viewCount: Int? = null +) + +@Serializable +data class ChatPermissionsDto( + val canPostMessages: Boolean = true, + val canPinMessages: Boolean = true, + val canDeleteMessages: Boolean = false, + val canInviteUsers: Boolean = true, + val canManageMembers: Boolean = false +) + +@Serializable +data class ChatMemberDto( + val user: UserSummaryDto, + val role: ChatMemberRole = ChatMemberRole.Member, + val isOwner: Boolean = false, + val permissions: ChatPermissionsDto = ChatPermissionsDto() +) + +@Serializable +data class ChatSummaryDto( + val id: String, + val title: String, + val type: ChatType, + val secondaryText: String? = null, + val lastActivityAt: String? = null, + val lastMessagePreview: String? = null, + val participants: List = emptyList(), + val canSendMessages: Boolean = true, + val unreadCount: Int = 0, + val isPinned: Boolean = false, + val isArchived: Boolean = false, + val isMuted: Boolean = false, + val folderKey: String? = null, + val hasProtectedContent: Boolean = false, + val defaultMessageTtlSeconds: Int? = null, + val lastMessageAttachment: AttachmentDto? = null, + val subscriberCount: Int = 0, + val adminCount: Int = 0, + val isSubscribed: Boolean = false, + val canSubscribe: Boolean = false, + val canManageChannel: Boolean = false, + val canPostAsChannel: Boolean = false, + val publicUsername: String? = null, + val linkedDiscussionChatId: String? = null, + val channelSignaturesEnabled: Boolean = false, + val description: String? = null +) + +@Serializable +data class ChatDetailsDto( + val id: String, + val title: String, + val type: ChatType, + val participants: List = emptyList(), + val canSendMessages: Boolean = true, + val messages: List = emptyList(), + val firstUnreadMessageId: String? = null, + val hasMoreMessages: Boolean = false, + val pinnedMessages: List = emptyList(), + val currentUserPermissions: ChatPermissionsDto? = null, + val members: List = emptyList(), + val hasProtectedContent: Boolean = false, + val defaultMessageTtlSeconds: Int? = null, + val subscriberCount: Int = 0, + val adminCount: Int = 0, + val isSubscribed: Boolean = false, + val canSubscribe: Boolean = false, + val canManageChannel: Boolean = false, + val canPostAsChannel: Boolean = false, + val publicUsername: String? = null, + val linkedDiscussionChatId: String? = null, + val channelSignaturesEnabled: Boolean = false, + val description: String? = null +) + +@Serializable +data class ChatInfoDto( + val chat: ChatDetailsDto, + val mediaCount: Int = 0, + val fileCount: Int = 0, + val linkCount: Int = 0, + val voiceCount: Int = 0, + val pinnedCount: Int = 0, + val topicCount: Int = 0, + val publicUsername: String? = null, + val inviteLinks: List = emptyList(), + val topics: List = emptyList(), + val subscriberCount: Int = 0, + val adminCount: Int = 0, + val linkedDiscussionChatId: String? = null, + val channelSignaturesEnabled: Boolean = false, + val canManageChannel: Boolean = false, + val canPostAsChannel: Boolean = false, + val description: String? = null +) + +@Serializable +data class ChatMessagesPageDto( + val messages: List = emptyList(), + val hasMoreMessages: Boolean = false +) + +@Serializable +data class TypingIndicatorDto( + val chatId: String, + val user: UserSummaryDto, + val isTyping: Boolean, + val typedAt: String +) + +@Serializable +data class ChatFolderDto( + val key: String, + val title: String, + val totalCount: Int, + val unreadCount: Int +) + +@Serializable +data class ChatStateRequest( + val isPinned: Boolean? = null, + val isArchived: Boolean? = null, + val mutedUntil: String? = null, + val folderKey: String? = null, + val isMuted: Boolean? = null, + val hasProtectedContent: Boolean? = null, + val defaultMessageTtlSeconds: Int? = null, + val channelSignaturesEnabled: Boolean? = null, + val linkedDiscussionChatId: String? = null +) + +@Serializable +data class ChatInviteLinkDto( + val id: String, + val chatId: String, + val token: String, + val link: String, + val title: String? = null, + val createsJoinRequest: Boolean = false, + val isRevoked: Boolean = false, + val createdAt: String, + val revokedAt: String? = null +) + +@Serializable +data class CreateChatInviteLinkRequest( + val title: String? = null, + val createsJoinRequest: Boolean = false +) + +@Serializable +data class ChatJoinRequestDto( + val id: String, + val chatId: String, + val inviteLinkId: String, + val user: UserSummaryDto, + val status: ChatJoinRequestStatus, + val requestedAt: String, + val resolvedAt: String? = null, + val resolvedBy: UserSummaryDto? = null +) + +@Serializable +data class ResolveChatJoinRequestRequest( + val approve: Boolean +) + +@Serializable +data class ModerationLogDto( + val id: Long, + val chatId: String? = null, + val actorUserId: String, + val actorDisplayName: String, + val targetType: ModerationLogTargetType, + val targetId: String? = null, + val action: String, + val reason: String? = null, + val createdAt: String +) + +@Serializable +data class ChatTopicDto( + val id: String, + val chatId: String, + val title: String, + val icon: String = "💬", + val isPinned: Boolean = false, + val isClosed: Boolean = false, + val createdAt: String, + val lastActivityAt: String, + val messageCount: Int = 0 +) + +@Serializable +data class CreateChatTopicRequest( + val title: String, + val icon: String? = null +) + +@Serializable +data class UpdateChatMemberPermissionsRequest( + val role: ChatMemberRole, + val canPinMessages: Boolean, + val canDeleteMessages: Boolean, + val canInviteUsers: Boolean, + val canPostMessages: Boolean +) + +@Serializable +data class AddChatMembersRequest( + val memberIds: List, + val role: ChatMemberRole = ChatMemberRole.Member, + val canPinMessages: Boolean = false, + val canDeleteMessages: Boolean = false, + val canInviteUsers: Boolean = false, + val canPostMessages: Boolean = false +) + +@Serializable +data class ChatSearchResultDto( + val chat: ChatSummaryDto, + val message: MessageDto? = null, + val matchText: String, + val matchedAt: String? = null, + val chatId: String? = null, + val messageId: String? = null, + val senderUserId: String? = null, + val messageSentAt: String? = null +) + +@Serializable +data class ChatSearchPageDto( + val results: List = emptyList(), + val page: Int = 1, + val limit: Int = 50, + val hasMore: Boolean = false +) + +@Serializable +data class MessageSearchPageDto( + val messages: List = emptyList(), + val page: Int = 1, + val limit: Int = 50, + val hasMore: Boolean = false +) + +@Serializable +data class CreateDirectChatRequest( + val userId: String +) + +@Serializable +data class CreateGroupChatRequest( + val title: String, + val memberIds: List +) + +@Serializable +data class CreateChannelRequest( + val title: String, + val memberIds: List, + val description: String? = null, + val publicUsername: String? = null, + val createInviteLink: Boolean = false, + val channelSignaturesEnabled: Boolean = false +) + +@Serializable +data class RequestPhoneCodeRequest( + val phoneNumber: String +) + +@Serializable +data class PhoneCodeChallengeDto( + val challengeId: String, + val expiresAt: String, + val testCode: String, + val isRegistered: Boolean +) + +@Serializable +data class VerifyPhoneCodeRequest( + val challengeId: String, + val phoneNumber: String, + val code: String, + val displayName: String? = null +) + +@Serializable +data class RefreshSessionRequest( + val refreshToken: String +) + +@Serializable +data class AuthSessionDto( + val accessToken: String, + val refreshToken: String, + val accessTokenExpiresAt: String, + val user: UserSummaryDto +) + +@Serializable +data class SendMessageRequest( + val text: String, + val replyToMessageId: String? = null, + val topicId: String? = null, + val hasProtectedContent: Boolean? = null, + val ttlSeconds: Int? = null +) + +@Serializable +data class UpdateMessageRequest( + val text: String +) + +@Serializable +data class UpdateMessageReceiptRequest( + val messageId: String +) + +@Serializable +data class ForwardMessageRequest( + val targetChatId: String +) + +@Serializable +data class SetMessageReactionRequest( + val emoji: String +) + +@Serializable +data class RegisterPushDeviceRequest( + val platform: PushPlatform, + val installationId: String, + val deviceToken: String, + val deviceName: String? = null, + val notificationsEnabled: Boolean +) + +@Serializable +data class AndroidAppReleaseDto( + val versionCode: Int, + val versionName: String, + val downloadPath: String, + val publishedAt: String, + val notes: String? = null, + val isRequired: Boolean = false, + val minimumSupportedVersionCode: Int? = null +) + +@Serializable +data class ArgusManifestDto( + val release: ArgusReleaseDto +) + +@Serializable +data class ArgusReleaseDto( + val id: String, + val version: String, + val downloadPath: String, + val originalFileName: String? = null, + val packageSizeBytes: Long? = null, + val publishedAt: String, + val releaseNotes: String? = null +) + +@Serializable +data class ResolveContactsRequest( + val phoneNumbers: List +) + +@Serializable +data class ContactMatchDto( + val phoneNumber: String, + val user: UserSummaryDto +) + +@Serializable +data class StoryDto( + val id: String, + val author: UserSummaryDto, + val text: String, + val attachments: List = emptyList(), + val visibility: StoryVisibility = StoryVisibility.Everyone, + val hasProtectedContent: Boolean = false, + val createdAt: String, + val expiresAt: String, + val deletedAt: String? = null, + val viewCount: Int = 0, + val viewedByMe: Boolean = false +) + +@Serializable +data class CreateStoryRequest( + val text: String? = null, + val visibility: StoryVisibility = StoryVisibility.Everyone, + val hasProtectedContent: Boolean = false, + val ttlSeconds: Int = 86_400 +) + +@Serializable +data class StoryViewDto( + val storyId: String, + val viewer: UserSummaryDto, + val viewedAt: String +) + +@Serializable +data class UpdateMyProfileRequest( + val displayName: String, + val about: String? = null +) + +@Serializable +data class PrivacySettingsDto( + val phoneNumberVisibility: String = "contacts", + val lastSeenVisibility: String = "contacts", + val profilePhotoVisibility: String = "everyone", + val blockedUserIds: List = emptyList(), + val alwaysAllowUserIds: List = emptyList(), + val neverAllowUserIds: List = emptyList(), + val passcodeLockEnabled: Boolean = false, + val showMessagePreview: Boolean = true, + val updatedAt: String +) + +@Serializable +data class UpdatePrivacySettingsRequest( + val phoneNumberVisibility: String, + val lastSeenVisibility: String, + val profilePhotoVisibility: String, + val blockedUserIds: List? = null, + val alwaysAllowUserIds: List? = null, + val neverAllowUserIds: List? = null, + val passcodeLockEnabled: Boolean, + val showMessagePreview: Boolean +) + +@Serializable +data class UserSessionDto( + val id: String, + val createdAt: String, + val lastSeenAt: String, + val isCurrent: Boolean, + val deviceName: String +) + +@Serializable +data class BotCommandDto( + val command: String, + val description: String +) + +@Serializable +data class BotSummaryDto( + val id: String, + val userId: String, + val username: String, + val displayName: String, + val about: String? = null, + val isEnabled: Boolean, + val createdAt: String, + val commands: List = emptyList() +) + +@Serializable +data class CreateBotRequest( + val username: String, + val displayName: String, + val about: String? = null +) + +@Serializable +data class UpdateBotRequest( + val displayName: String, + val about: String? = null, + val isEnabled: Boolean +) + +@Serializable +data class CreatedBotDto( + val bot: BotSummaryDto, + val accessToken: String +) + +@Serializable +data class RegenerateBotTokenResponseDto( + val accessToken: String +) + +@Serializable +data class SetBotCommandsRequest( + val commands: List +) + +@Serializable +data class OutgoingCallDto( + val callId: String, + val chatId: String, + val peer: UserSummaryDto, + val mediaType: CallMediaType +) + +@Serializable +data class IncomingCallDto( + val callId: String, + val chatId: String, + val caller: UserSummaryDto, + val mediaType: CallMediaType +) + +@Serializable +data class CallConnectedDto( + val callId: String, + val chatId: String, + val connectedAt: String, + val mediaType: CallMediaType, + val iceServers: List = emptyList(), + val shouldCreateOffer: Boolean = false +) + +@Serializable +data class CallEndedDto( + val callId: String, + val chatId: String, + val reason: String, + val mediaType: CallMediaType +) + +@Serializable +data class CallIceServerDto( + val urls: List, + val username: String? = null, + val credential: String? = null +) + +@Serializable +data class CallOfferDto( + val callId: String, + val type: String, + val sdp: String +) + +@Serializable +data class CallAnswerDto( + val callId: String, + val type: String, + val sdp: String +) + +@Serializable +data class CallIceCandidateDto( + val callId: String, + val candidate: String, + val sdpMid: String? = null, + val sdpMLineIndex: Int +) + +data class DownloadedAttachmentFile( + val fileName: String, + val contentType: String, + val fileSizeBytes: Long, + val localPath: String +) diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/network/ApiClient.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/network/ApiClient.kt new file mode 100644 index 00000000..332a9c28 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/network/ApiClient.kt @@ -0,0 +1,1390 @@ +package com.seven.ikar.kotlin.core.network + +import com.seven.ikar.kotlin.core.model.AndroidAppReleaseDto +import com.seven.ikar.kotlin.core.model.AddChatMembersRequest +import com.seven.ikar.kotlin.core.model.ArgusManifestDto +import com.seven.ikar.kotlin.core.model.AttachmentDto +import com.seven.ikar.kotlin.core.model.AuthSessionDto +import com.seven.ikar.kotlin.core.model.BotSummaryDto +import com.seven.ikar.kotlin.core.model.BotCommandDto +import com.seven.ikar.kotlin.core.model.ChatDetailsDto +import com.seven.ikar.kotlin.core.model.ChatFolderDto +import com.seven.ikar.kotlin.core.model.ChatInfoDto +import com.seven.ikar.kotlin.core.model.ChatMessagesPageDto +import com.seven.ikar.kotlin.core.model.ChatSearchPageDto +import com.seven.ikar.kotlin.core.model.ChatSearchResultDto +import com.seven.ikar.kotlin.core.model.ChatStateRequest +import com.seven.ikar.kotlin.core.model.ChatSummaryDto +import com.seven.ikar.kotlin.core.model.ChatInviteLinkDto +import com.seven.ikar.kotlin.core.model.ChatJoinRequestDto +import com.seven.ikar.kotlin.core.model.ChatTopicDto +import com.seven.ikar.kotlin.core.model.CreateChatInviteLinkRequest +import com.seven.ikar.kotlin.core.model.ContactMatchDto +import com.seven.ikar.kotlin.core.model.CreateBotRequest +import com.seven.ikar.kotlin.core.model.CreateChannelRequest +import com.seven.ikar.kotlin.core.model.CreateChatTopicRequest +import com.seven.ikar.kotlin.core.model.CreateStoryRequest +import com.seven.ikar.kotlin.core.model.CreatedBotDto +import com.seven.ikar.kotlin.core.model.CreateDirectChatRequest +import com.seven.ikar.kotlin.core.model.CreateGroupChatRequest +import com.seven.ikar.kotlin.core.model.DownloadedAttachmentFile +import com.seven.ikar.kotlin.core.model.ForwardMessageRequest +import com.seven.ikar.kotlin.core.model.MessageDto +import com.seven.ikar.kotlin.core.model.MessageSearchPageDto +import com.seven.ikar.kotlin.core.model.ModerationLogDto +import com.seven.ikar.kotlin.core.model.PhoneCodeChallengeDto +import com.seven.ikar.kotlin.core.model.PrivacySettingsDto +import com.seven.ikar.kotlin.core.model.RegenerateBotTokenResponseDto +import com.seven.ikar.kotlin.core.model.RequestPhoneCodeRequest +import com.seven.ikar.kotlin.core.model.RegisterPushDeviceRequest +import com.seven.ikar.kotlin.core.model.RefreshSessionRequest +import com.seven.ikar.kotlin.core.model.ResolveChatJoinRequestRequest +import com.seven.ikar.kotlin.core.model.ResolveContactsRequest +import com.seven.ikar.kotlin.core.model.SendMessageRequest +import com.seven.ikar.kotlin.core.model.SetMessageReactionRequest +import com.seven.ikar.kotlin.core.model.SetBotCommandsRequest +import com.seven.ikar.kotlin.core.model.StoryDto +import com.seven.ikar.kotlin.core.model.StoryViewDto +import com.seven.ikar.kotlin.core.model.StoryVisibility +import com.seven.ikar.kotlin.core.model.UpdateBotRequest +import com.seven.ikar.kotlin.core.model.UpdateChatMemberPermissionsRequest +import com.seven.ikar.kotlin.core.model.UpdateMessageRequest +import com.seven.ikar.kotlin.core.model.UpdateMessageReceiptRequest +import com.seven.ikar.kotlin.core.model.UpdateMyProfileRequest +import com.seven.ikar.kotlin.core.model.UpdatePrivacySettingsRequest +import com.seven.ikar.kotlin.core.model.UserSessionDto +import com.seven.ikar.kotlin.core.model.UserSummaryDto +import com.seven.ikar.kotlin.core.model.VerifyPhoneCodeRequest +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import kotlinx.serialization.SerializationException +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.jsonObject +import kotlinx.serialization.json.jsonPrimitive +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.MultipartBody +import okhttp3.OkHttpClient +import okhttp3.RequestBody +import okhttp3.Request +import okhttp3.RequestBody.Companion.toRequestBody +import okio.BufferedSink +import java.io.File +import java.io.IOException +import java.io.InputStream +import java.net.URLEncoder +import java.nio.charset.StandardCharsets + +class ApiException(val statusCode: Int, override val message: String) : RuntimeException(message) + +class UploadFileSource( + val fileName: String, + val contentType: String?, + val contentLength: Long = -1L, + private val onBytesWritten: ((Long) -> Unit)? = null, + private val openStream: () -> InputStream +) { + fun asRequestBody(): RequestBody { + val mediaType = contentType?.toMediaTypeOrNull() ?: "application/octet-stream".toMediaType() + return object : RequestBody() { + override fun contentType() = mediaType + override fun contentLength(): Long = this@UploadFileSource.contentLength.takeIf { it >= 0L } ?: -1L + + override fun writeTo(sink: BufferedSink) { + openStream().use { input -> + val buffer = ByteArray(DEFAULT_BUFFER_SIZE) + var bytesWritten = 0L + while (true) { + val read = input.read(buffer) + if (read < 0) { + return + } + sink.write(buffer, 0, read) + bytesWritten += read + onBytesWritten?.invoke(bytesWritten) + } + } + } + } + } +} + +class ApiClient( + private val httpClientProvider: () -> OkHttpClient, + private val json: Json, + private val clientVersionProvider: ClientVersionProvider +) { + constructor( + httpClient: OkHttpClient, + json: Json, + clientVersionProvider: ClientVersionProvider + ) : this({ httpClient }, json, clientVersionProvider) + + private val httpClient: OkHttpClient + get() = httpClientProvider() + + suspend fun requestPhoneCode(phoneNumber: String): PhoneCodeChallengeDto = + executeJsonRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/auth/request-code")) + .post( + json.encodeToString( + RequestPhoneCodeRequest.serializer(), + RequestPhoneCodeRequest(phoneNumber = phoneNumber) + ).toRequestBody(JSON) + ) + .withClientVersionHeaders() + .build(), + PhoneCodeChallengeDto.serializer() + ) + + suspend fun verifyPhoneCode( + challengeId: String, + phoneNumber: String, + code: String, + displayName: String? + ): AuthSessionDto = + executeJsonRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/auth/verify-code")) + .post( + json.encodeToString( + VerifyPhoneCodeRequest.serializer(), + VerifyPhoneCodeRequest( + challengeId = challengeId, + phoneNumber = phoneNumber, + code = code, + displayName = displayName?.takeIf { it.isNotBlank() } + ) + ).toRequestBody(JSON) + ) + .withClientVersionHeaders() + .build(), + AuthSessionDto.serializer() + ) + + suspend fun refreshSession(refreshToken: String): AuthSessionDto = + executeJsonRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/auth/refresh")) + .post( + json.encodeToString( + RefreshSessionRequest.serializer(), + RefreshSessionRequest(refreshToken) + ).toRequestBody(JSON) + ) + .withClientVersionHeaders() + .build(), + AuthSessionDto.serializer() + ) + + suspend fun getChats(accessToken: String): List = + executeJsonRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/chats")) + .get() + .withBearer(accessToken) + .withClientVersionHeaders() + .build(), + kotlinx.serialization.builtins.ListSerializer(ChatSummaryDto.serializer()) + ) + + suspend fun getChatFolders(accessToken: String): List = + executeJsonRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/chats/folders")) + .get() + .withBearer(accessToken) + .withClientVersionHeaders() + .build(), + kotlinx.serialization.builtins.ListSerializer(ChatFolderDto.serializer()) + ) + + suspend fun searchChats(accessToken: String, query: String, filter: String? = null, limit: Int = 50): List = + searchChatsPage( + accessToken = accessToken, + query = query, + filter = filter, + limit = limit + ).results + + suspend fun searchChatsPage( + accessToken: String, + query: String, + filter: String? = null, + type: String? = null, + page: Int = 1, + limit: Int = 50, + dateFrom: String? = null, + dateTo: String? = null, + author: String? = null + ): ChatSearchPageDto = + executeJsonRequest( + Request.Builder() + .url( + ServerConfig.absoluteMessengerUrl( + buildSearchPath( + basePath = "/api/chats/search/page", + query = query, + filter = filter, + type = type, + page = page, + limit = limit, + dateFrom = dateFrom, + dateTo = dateTo, + author = author + ) + ) + ) + .get() + .withBearer(accessToken) + .withClientVersionHeaders() + .build(), + ChatSearchPageDto.serializer() + ) + + suspend fun getChat(chatId: String, accessToken: String): ChatDetailsDto = + executeJsonRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/chats/$chatId")) + .get() + .withBearer(accessToken) + .withClientVersionHeaders() + .build(), + ChatDetailsDto.serializer() + ) + + suspend fun getChatInfo(accessToken: String, chatId: String): ChatInfoDto = + executeJsonRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/chats/$chatId/info")) + .get() + .withBearer(accessToken) + .withClientVersionHeaders() + .build(), + ChatInfoDto.serializer() + ) + + suspend fun getChatInviteLinks(accessToken: String, chatId: String): List = + executeJsonRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/chats/$chatId/invite-links")) + .get() + .withBearer(accessToken) + .withClientVersionHeaders() + .build(), + kotlinx.serialization.builtins.ListSerializer(ChatInviteLinkDto.serializer()) + ) + + suspend fun createChatInviteLink( + accessToken: String, + chatId: String, + title: String? = null, + createsJoinRequest: Boolean = false + ): ChatInviteLinkDto = + executeJsonRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/chats/$chatId/invite-links")) + .post( + json.encodeToString( + CreateChatInviteLinkRequest.serializer(), + CreateChatInviteLinkRequest(title = title?.takeIf { it.isNotBlank() }, createsJoinRequest = createsJoinRequest) + ).toRequestBody(JSON) + ) + .withBearer(accessToken) + .withClientVersionHeaders() + .build(), + ChatInviteLinkDto.serializer() + ) + + suspend fun revokeChatInviteLink(accessToken: String, chatId: String, inviteLinkId: String) = + executeUnitRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/chats/$chatId/invite-links/$inviteLinkId")) + .delete() + .withBearer(accessToken) + .withClientVersionHeaders() + .build() + ) + + suspend fun joinChatByInviteLink(accessToken: String, token: String): ChatDetailsDto = + executeJsonRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/chats/join/${encodeQuery(token)}")) + .post("".toRequestBody(null)) + .withBearer(accessToken) + .withClientVersionHeaders() + .build(), + ChatDetailsDto.serializer() + ) + + suspend fun getChatJoinRequests(accessToken: String, chatId: String): List = + executeJsonRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/chats/$chatId/join-requests")) + .get() + .withBearer(accessToken) + .withClientVersionHeaders() + .build(), + kotlinx.serialization.builtins.ListSerializer(ChatJoinRequestDto.serializer()) + ) + + suspend fun resolveChatJoinRequest( + accessToken: String, + chatId: String, + joinRequestId: String, + approve: Boolean + ): ChatJoinRequestDto = + executeJsonRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/chats/$chatId/join-requests/$joinRequestId")) + .post( + json.encodeToString( + ResolveChatJoinRequestRequest.serializer(), + ResolveChatJoinRequestRequest(approve = approve) + ).toRequestBody(JSON) + ) + .withBearer(accessToken) + .withClientVersionHeaders() + .build(), + ChatJoinRequestDto.serializer() + ) + + suspend fun getChatTopics(accessToken: String, chatId: String): List = + executeJsonRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/chats/$chatId/topics")) + .get() + .withBearer(accessToken) + .withClientVersionHeaders() + .build(), + kotlinx.serialization.builtins.ListSerializer(ChatTopicDto.serializer()) + ) + + suspend fun createChatTopic(accessToken: String, chatId: String, title: String, icon: String? = null): ChatTopicDto = + executeJsonRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/chats/$chatId/topics")) + .post( + json.encodeToString( + CreateChatTopicRequest.serializer(), + CreateChatTopicRequest(title = title, icon = icon?.takeIf { it.isNotBlank() }) + ).toRequestBody(JSON) + ) + .withBearer(accessToken) + .withClientVersionHeaders() + .build(), + ChatTopicDto.serializer() + ) + + suspend fun getChatMessagesPage( + accessToken: String, + chatId: String, + beforeMessageId: String, + limit: Int = 50 + ): ChatMessagesPageDto = + executeJsonRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/chats/$chatId/messages?beforeMessageId=$beforeMessageId&limit=$limit")) + .get() + .withBearer(accessToken) + .withClientVersionHeaders() + .build(), + ChatMessagesPageDto.serializer() + ) + + suspend fun searchChatMessages( + accessToken: String, + chatId: String, + query: String, + filter: String? = null, + limit: Int = 50 + ): List = + searchChatMessagesPage( + accessToken = accessToken, + chatId = chatId, + query = query, + filter = filter, + limit = limit + ).messages + + suspend fun searchChatMessagesPage( + accessToken: String, + chatId: String, + query: String, + filter: String? = null, + type: String? = null, + page: Int = 1, + limit: Int = 50, + dateFrom: String? = null, + dateTo: String? = null, + author: String? = null + ): MessageSearchPageDto = + executeJsonRequest( + Request.Builder() + .url( + ServerConfig.absoluteMessengerUrl( + buildSearchPath( + basePath = "/api/chats/$chatId/messages/search/page", + query = query, + filter = filter, + type = type, + page = page, + limit = limit, + dateFrom = dateFrom, + dateTo = dateTo, + author = author + ) + ) + ) + .get() + .withBearer(accessToken) + .withClientVersionHeaders() + .build(), + MessageSearchPageDto.serializer() + ) + + suspend fun updateChatState(accessToken: String, chatId: String, request: ChatStateRequest): ChatSummaryDto = + executeJsonRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/chats/$chatId/state")) + .put( + json.encodeToString( + ChatStateRequest.serializer(), + request + ).toRequestBody(JSON) + ) + .withBearer(accessToken) + .withClientVersionHeaders() + .build(), + ChatSummaryDto.serializer() + ) + + suspend fun updateChatMemberPermissions( + accessToken: String, + chatId: String, + memberUserId: String, + request: UpdateChatMemberPermissionsRequest + ): ChatDetailsDto = + executeJsonRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/chats/$chatId/members/$memberUserId/permissions")) + .put( + json.encodeToString( + UpdateChatMemberPermissionsRequest.serializer(), + request + ).toRequestBody(JSON) + ) + .withBearer(accessToken) + .withClientVersionHeaders() + .build(), + ChatDetailsDto.serializer() + ) + + suspend fun addChatMembers( + accessToken: String, + chatId: String, + request: AddChatMembersRequest + ): ChatDetailsDto = + executeJsonRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/chats/$chatId/members")) + .post( + json.encodeToString( + AddChatMembersRequest.serializer(), + request + ).toRequestBody(JSON) + ) + .withBearer(accessToken) + .withClientVersionHeaders() + .build(), + ChatDetailsDto.serializer() + ) + + suspend fun getChatModerationLog(accessToken: String, chatId: String, limit: Int = 100): List = + executeJsonRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/chats/$chatId/moderation-log?limit=$limit")) + .get() + .withBearer(accessToken) + .withClientVersionHeaders() + .build(), + kotlinx.serialization.builtins.ListSerializer(ModerationLogDto.serializer()) + ) + + suspend fun deleteChat(accessToken: String, chatId: String, forEveryone: Boolean) = + executeUnitRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/chats/$chatId?forEveryone=$forEveryone")) + .delete() + .withBearer(accessToken) + .withClientVersionHeaders() + .build() + ) + + suspend fun sendMessage( + chatId: String, + text: String, + accessToken: String, + replyToMessageId: String? = null, + topicId: String? = null, + hasProtectedContent: Boolean? = null, + ttlSeconds: Int? = null + ): MessageDto = + executeJsonRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/chats/$chatId/messages")) + .post( + json.encodeToString( + SendMessageRequest.serializer(), + SendMessageRequest( + text = text, + replyToMessageId = replyToMessageId, + topicId = topicId, + hasProtectedContent = hasProtectedContent, + ttlSeconds = ttlSeconds + ) + ).toRequestBody(JSON) + ) + .withBearer(accessToken) + .withClientVersionHeaders() + .build(), + MessageDto.serializer() + ) + + suspend fun getBotCommands(accessToken: String, userId: String): List = + executeJsonRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/users/$userId/bot-commands")) + .get() + .withBearer(accessToken) + .withClientVersionHeaders() + .build(), + kotlinx.serialization.builtins.ListSerializer(BotCommandDto.serializer()) + ) + + suspend fun clearChatHistory(accessToken: String, chatId: String) = + executeUnitRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/chats/$chatId/history")) + .delete() + .withBearer(accessToken) + .withClientVersionHeaders() + .build() + ) + + suspend fun updateMessage(accessToken: String, chatId: String, messageId: String, text: String): MessageDto = + executeJsonRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/chats/$chatId/messages/$messageId")) + .put( + json.encodeToString( + UpdateMessageRequest.serializer(), + UpdateMessageRequest(text) + ).toRequestBody(JSON) + ) + .withBearer(accessToken) + .withClientVersionHeaders() + .build(), + MessageDto.serializer() + ) + + suspend fun deleteMessage(accessToken: String, chatId: String, messageId: String): MessageDto = + executeJsonRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/chats/$chatId/messages/$messageId")) + .delete() + .withBearer(accessToken) + .withClientVersionHeaders() + .build(), + MessageDto.serializer() + ) + + suspend fun pinMessage(accessToken: String, chatId: String, messageId: String): MessageDto = + executeJsonRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/chats/$chatId/messages/$messageId/pin")) + .put("".toRequestBody(null)) + .withBearer(accessToken) + .withClientVersionHeaders() + .build(), + MessageDto.serializer() + ) + + suspend fun unpinMessage(accessToken: String, chatId: String, messageId: String): MessageDto = + executeJsonRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/chats/$chatId/messages/$messageId/pin")) + .delete() + .withBearer(accessToken) + .withClientVersionHeaders() + .build(), + MessageDto.serializer() + ) + + suspend fun uploadAttachment( + accessToken: String, + chatId: String, + text: String?, + replyToMessageId: String?, + file: UploadFileSource + ): MessageDto = withContext(Dispatchers.IO) { + val multipart = MultipartBody.Builder() + .setType(MultipartBody.FORM) + .apply { + text?.takeIf { it.isNotBlank() }?.let { addFormDataPart("text", it) } + replyToMessageId?.takeIf { it.isNotBlank() }?.let { addFormDataPart("replyToMessageId", it) } + addFormDataPart("file", file.fileName, file.asRequestBody()) + } + .build() + + executeJsonRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/chats/$chatId/attachments")) + .post(multipart) + .withBearer(accessToken) + .withClientVersionHeaders() + .build(), + MessageDto.serializer() + ) + } + + suspend fun uploadAttachmentAlbum( + accessToken: String, + chatId: String, + text: String?, + replyToMessageId: String?, + files: List + ): MessageDto = withContext(Dispatchers.IO) { + check(files.isNotEmpty()) { "At least one file is required." } + + val multipart = MultipartBody.Builder() + .setType(MultipartBody.FORM) + .apply { + text?.takeIf { it.isNotBlank() }?.let { addFormDataPart("text", it) } + replyToMessageId?.takeIf { it.isNotBlank() }?.let { addFormDataPart("replyToMessageId", it) } + files.forEach { file -> + addFormDataPart("files", file.fileName, file.asRequestBody()) + } + } + .build() + + executeJsonRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/chats/$chatId/attachments/album")) + .post(multipart) + .withBearer(accessToken) + .withClientVersionHeaders() + .build(), + MessageDto.serializer() + ) + } + + suspend fun acknowledgeDelivered(accessToken: String, chatId: String, messageId: String) = + executeUnitRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/chats/$chatId/messages/delivered")) + .post( + json.encodeToString( + UpdateMessageReceiptRequest.serializer(), + UpdateMessageReceiptRequest(messageId) + ).toRequestBody(JSON) + ) + .withBearer(accessToken) + .withClientVersionHeaders() + .build() + ) + + suspend fun acknowledgeRead(accessToken: String, chatId: String, messageId: String) = + executeUnitRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/chats/$chatId/messages/read")) + .post( + json.encodeToString( + UpdateMessageReceiptRequest.serializer(), + UpdateMessageReceiptRequest(messageId) + ).toRequestBody(JSON) + ) + .withBearer(accessToken) + .withClientVersionHeaders() + .build() + ) + + suspend fun setMessageReaction(accessToken: String, chatId: String, messageId: String, emoji: String): MessageDto = + executeJsonRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/chats/$chatId/messages/$messageId/reaction")) + .put( + json.encodeToString( + SetMessageReactionRequest.serializer(), + SetMessageReactionRequest(emoji = emoji) + ).toRequestBody(JSON) + ) + .withBearer(accessToken) + .withClientVersionHeaders() + .build(), + MessageDto.serializer() + ) + + suspend fun downloadAttachmentTo( + accessToken: String, + attachment: AttachmentDto, + targetFile: File, + onProgress: ((bytesRead: Long, totalBytes: Long) -> Unit)? = null + ): DownloadedAttachmentFile = + withContext(Dispatchers.IO) { + val request = Request.Builder() + .url(ServerConfig.absoluteMessengerUrl(attachment.downloadPath)) + .get() + .withBearer(accessToken) + .withClientVersionHeaders() + .build() + + try { + httpClient.newCall(request).execute().use { response -> + if (!response.isSuccessful) { + throw ApiException(response.code, formatApiErrorMessage(response.code, response.body?.string().orEmpty())) + } + + val body = response.body ?: throw ApiException(response.code, "Empty attachment response.") + val totalBytes = body.contentLength() + .takeIf { it >= 0L } + ?: attachment.fileSizeBytes.takeIf { it >= 0L } + ?: -1L + targetFile.parentFile?.mkdirs() + body.byteStream().use { input -> + targetFile.outputStream().use { output -> + val buffer = ByteArray(DEFAULT_BUFFER_SIZE) + var bytesRead = 0L + while (true) { + val read = input.read(buffer) + if (read < 0) { + break + } + output.write(buffer, 0, read) + bytesRead += read + onProgress?.invoke(bytesRead, totalBytes) + } + } + } + + DownloadedAttachmentFile( + fileName = attachment.fileName, + contentType = body.contentType()?.toString() + ?: response.header("Content-Type") + ?: attachment.contentType, + fileSizeBytes = targetFile.length(), + localPath = targetFile.absolutePath + ) + } + } catch (error: IOException) { + throw ApiException(-1, networkErrorMessage()) + } + } + + suspend fun getStories(accessToken: String): List = + executeJsonRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/stories")) + .get() + .withBearer(accessToken) + .withClientVersionHeaders() + .build(), + kotlinx.serialization.builtins.ListSerializer(StoryDto.serializer()) + ) + + suspend fun getStory(accessToken: String, storyId: String): StoryDto = + executeJsonRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/stories/$storyId")) + .get() + .withBearer(accessToken) + .withClientVersionHeaders() + .build(), + StoryDto.serializer() + ) + + suspend fun createStory( + accessToken: String, + text: String, + visibility: StoryVisibility, + hasProtectedContent: Boolean, + ttlSeconds: Int + ): StoryDto = + executeJsonRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/stories")) + .post( + json.encodeToString( + CreateStoryRequest.serializer(), + CreateStoryRequest( + text = text.takeIf { it.isNotBlank() }, + visibility = visibility, + hasProtectedContent = hasProtectedContent, + ttlSeconds = ttlSeconds + ) + ).toRequestBody(JSON) + ) + .withBearer(accessToken) + .withClientVersionHeaders() + .build(), + StoryDto.serializer() + ) + + suspend fun createMediaStory( + accessToken: String, + text: String?, + visibility: StoryVisibility, + hasProtectedContent: Boolean, + ttlSeconds: Int, + files: List + ): StoryDto = withContext(Dispatchers.IO) { + val multipart = MultipartBody.Builder() + .setType(MultipartBody.FORM) + .apply { + text?.takeIf { it.isNotBlank() }?.let { addFormDataPart("text", it) } + addFormDataPart("visibility", visibility.wireValue.toString()) + addFormDataPart("hasProtectedContent", hasProtectedContent.toString()) + addFormDataPart("ttlSeconds", ttlSeconds.toString()) + files.forEach { file -> + addFormDataPart("files", file.fileName, file.asRequestBody()) + } + } + .build() + + executeJsonRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/stories/media")) + .post(multipart) + .withBearer(accessToken) + .withClientVersionHeaders() + .build(), + StoryDto.serializer() + ) + } + + suspend fun deleteStory(accessToken: String, storyId: String) = + executeUnitRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/stories/$storyId")) + .delete() + .withBearer(accessToken) + .withClientVersionHeaders() + .build() + ) + + suspend fun getStoryViews(accessToken: String, storyId: String): List = + executeJsonRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/stories/$storyId/views")) + .get() + .withBearer(accessToken) + .withClientVersionHeaders() + .build(), + kotlinx.serialization.builtins.ListSerializer(StoryViewDto.serializer()) + ) + + suspend fun getMe(accessToken: String): UserSummaryDto = + executeJsonRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/users/me")) + .get() + .withBearer(accessToken) + .withClientVersionHeaders() + .build(), + UserSummaryDto.serializer() + ) + + suspend fun getUser(accessToken: String, userId: String): UserSummaryDto = + executeJsonRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/users/$userId")) + .get() + .withBearer(accessToken) + .withClientVersionHeaders() + .build(), + UserSummaryDto.serializer() + ) + + suspend fun updateMyProfile(accessToken: String, displayName: String, about: String?): UserSummaryDto = + executeJsonRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/users/me")) + .put( + json.encodeToString( + UpdateMyProfileRequest.serializer(), + UpdateMyProfileRequest(displayName = displayName, about = about?.takeIf { it.isNotBlank() }) + ).toRequestBody(JSON) + ) + .withBearer(accessToken) + .withClientVersionHeaders() + .build(), + UserSummaryDto.serializer() + ) + + suspend fun uploadMyAvatar( + accessToken: String, + file: UploadFileSource + ): UserSummaryDto = withContext(Dispatchers.IO) { + val multipart = MultipartBody.Builder() + .setType(MultipartBody.FORM) + .addFormDataPart("file", file.fileName, file.asRequestBody()) + .build() + + val request = Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/users/me/avatar")) + .post(multipart) + .withBearer(accessToken) + .withClientVersionHeaders() + .build() + + executeJsonRequest(request, UserSummaryDto.serializer()) + } + + suspend fun deleteMyAvatar(accessToken: String): UserSummaryDto = + executeJsonRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/users/me/avatar")) + .delete() + .withBearer(accessToken) + .withClientVersionHeaders() + .build(), + UserSummaryDto.serializer() + ) + + suspend fun getMyPrivacySettings(accessToken: String): PrivacySettingsDto = + executeJsonRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/users/me/privacy")) + .get() + .withBearer(accessToken) + .withClientVersionHeaders() + .build(), + PrivacySettingsDto.serializer() + ) + + suspend fun updateMyPrivacySettings(accessToken: String, request: UpdatePrivacySettingsRequest): PrivacySettingsDto = + executeJsonRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/users/me/privacy")) + .put( + json.encodeToString( + UpdatePrivacySettingsRequest.serializer(), + request + ).toRequestBody(JSON) + ) + .withBearer(accessToken) + .withClientVersionHeaders() + .build(), + PrivacySettingsDto.serializer() + ) + + suspend fun getMySessions(accessToken: String): List = + executeJsonRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/users/me/sessions")) + .get() + .withBearer(accessToken) + .withClientVersionHeaders() + .build(), + kotlinx.serialization.builtins.ListSerializer(UserSessionDto.serializer()) + ) + + suspend fun revokeMySession(accessToken: String, sessionId: String) = + executeUnitRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/users/me/sessions/$sessionId")) + .delete() + .withBearer(accessToken) + .withClientVersionHeaders() + .build() + ) + + suspend fun searchUsers(accessToken: String, query: String): List = + executeJsonRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/users/search?q=${java.net.URLEncoder.encode(query, Charsets.UTF_8.name())}")) + .get() + .withBearer(accessToken) + .withClientVersionHeaders() + .build(), + kotlinx.serialization.builtins.ListSerializer(UserSummaryDto.serializer()) + ) + + suspend fun resolveContacts(accessToken: String, phoneNumbers: List): List = + executeJsonRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/users/contacts/resolve")) + .post( + json.encodeToString( + ResolveContactsRequest.serializer(), + ResolveContactsRequest(phoneNumbers) + ).toRequestBody(JSON) + ) + .withBearer(accessToken) + .withClientVersionHeaders() + .build(), + kotlinx.serialization.builtins.ListSerializer(ContactMatchDto.serializer()) + ) + + suspend fun createDirectChat(accessToken: String, userId: String): ChatDetailsDto = + executeJsonRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/chats/direct")) + .post( + json.encodeToString( + CreateDirectChatRequest.serializer(), + CreateDirectChatRequest(userId) + ).toRequestBody(JSON) + ) + .withBearer(accessToken) + .withClientVersionHeaders() + .build(), + ChatDetailsDto.serializer() + ) + + suspend fun createGroupChat(accessToken: String, title: String, memberIds: List): ChatDetailsDto = + executeJsonRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/chats/group")) + .post( + json.encodeToString( + CreateGroupChatRequest.serializer(), + CreateGroupChatRequest(title, memberIds) + ).toRequestBody(JSON) + ) + .withBearer(accessToken) + .withClientVersionHeaders() + .build(), + ChatDetailsDto.serializer() + ) + + suspend fun createChannel( + accessToken: String, + title: String, + memberIds: List, + description: String? = null, + publicUsername: String? = null, + createInviteLink: Boolean = false, + channelSignaturesEnabled: Boolean = false + ): ChatDetailsDto = + executeJsonRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/chats/channel")) + .post( + json.encodeToString( + CreateChannelRequest.serializer(), + CreateChannelRequest( + title = title, + memberIds = memberIds, + description = description?.takeIf { it.isNotBlank() }, + publicUsername = publicUsername?.takeIf { it.isNotBlank() }, + createInviteLink = createInviteLink, + channelSignaturesEnabled = channelSignaturesEnabled + ) + ).toRequestBody(JSON) + ) + .withBearer(accessToken) + .withClientVersionHeaders() + .build(), + ChatDetailsDto.serializer() + ) + + suspend fun subscribeToChannel(accessToken: String, chatId: String): ChatDetailsDto = + executeJsonRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/chats/$chatId/subscribe")) + .post("".toRequestBody(null)) + .withBearer(accessToken) + .withClientVersionHeaders() + .build(), + ChatDetailsDto.serializer() + ) + + suspend fun unsubscribeFromChannel(accessToken: String, chatId: String) = + executeUnitRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/chats/$chatId/subscribe")) + .delete() + .withBearer(accessToken) + .withClientVersionHeaders() + .build() + ) + + suspend fun forwardMessage( + accessToken: String, + sourceChatId: String, + messageId: String, + targetChatId: String + ): MessageDto = + executeJsonRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/chats/$sourceChatId/messages/$messageId/forward")) + .post( + json.encodeToString( + ForwardMessageRequest.serializer(), + ForwardMessageRequest(targetChatId) + ).toRequestBody(JSON) + ) + .withBearer(accessToken) + .withClientVersionHeaders() + .build(), + MessageDto.serializer() + ) + + suspend fun getMyBots(accessToken: String): List = + executeJsonRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/bots/mine")) + .get() + .withBearer(accessToken) + .withClientVersionHeaders() + .build(), + kotlinx.serialization.builtins.ListSerializer(BotSummaryDto.serializer()) + ) + + suspend fun getBot(accessToken: String, botId: String): BotSummaryDto = + executeJsonRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/bots/$botId")) + .get() + .withBearer(accessToken) + .withClientVersionHeaders() + .build(), + BotSummaryDto.serializer() + ) + + suspend fun createBot(accessToken: String, username: String, displayName: String, about: String?): CreatedBotDto = + executeJsonRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/bots")) + .post( + json.encodeToString( + CreateBotRequest.serializer(), + CreateBotRequest(username, displayName, about?.takeIf { it.isNotBlank() }) + ).toRequestBody(JSON) + ) + .withBearer(accessToken) + .withClientVersionHeaders() + .build(), + CreatedBotDto.serializer() + ) + + suspend fun updateBot(accessToken: String, botId: String, displayName: String, about: String?, isEnabled: Boolean): BotSummaryDto = + executeJsonRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/bots/$botId")) + .put( + json.encodeToString( + UpdateBotRequest.serializer(), + UpdateBotRequest(displayName, about?.takeIf { it.isNotBlank() }, isEnabled) + ).toRequestBody(JSON) + ) + .withBearer(accessToken) + .withClientVersionHeaders() + .build(), + BotSummaryDto.serializer() + ) + + suspend fun setBotCommands(accessToken: String, botId: String, commands: List): BotSummaryDto = + executeJsonRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/bots/$botId/commands")) + .put( + json.encodeToString( + SetBotCommandsRequest.serializer(), + SetBotCommandsRequest(commands) + ).toRequestBody(JSON) + ) + .withBearer(accessToken) + .withClientVersionHeaders() + .build(), + BotSummaryDto.serializer() + ) + + suspend fun regenerateBotToken(accessToken: String, botId: String): RegenerateBotTokenResponseDto = + executeJsonRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/bots/$botId/regenerate-token")) + .post(ByteArray(0).toRequestBody(null, 0, 0)) + .withBearer(accessToken) + .withClientVersionHeaders() + .build(), + RegenerateBotTokenResponseDto.serializer() + ) + + suspend fun deleteBot(accessToken: String, botId: String) = + executeUnitRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/bots/$botId")) + .delete() + .withBearer(accessToken) + .withClientVersionHeaders() + .build() + ) + + suspend fun registerPushDevice(accessToken: String, request: RegisterPushDeviceRequest) = + executeUnitRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/push/devices")) + .post(json.encodeToString(RegisterPushDeviceRequest.serializer(), request).toRequestBody(JSON)) + .withBearer(accessToken) + .withClientVersionHeaders() + .build() + ) + + suspend fun unregisterPushDevice(accessToken: String, installationId: String) = + executeUnitRequest( + Request.Builder() + .url(ServerConfig.absoluteMessengerUrl("/api/push/devices/${installationId.trim()}")) + .delete() + .withBearer(accessToken) + .withClientVersionHeaders() + .build() + ) + + suspend fun getLatestAndroidRelease(): AndroidAppReleaseDto { + val manifest = executeJsonRequest( + Request.Builder() + .url(ServerConfig.absoluteArgusUrl(ServerConfig.AndroidManifestPath)) + .get() + .withClientVersionHeaders() + .build(), + ArgusManifestDto.serializer() + ) + + val version = manifest.release.version + val plusIndex = version.lastIndexOf('+') + val versionName = if (plusIndex > 0) version.substring(0, plusIndex) else version + val versionCode = version.substringAfterLast('+', "0").toIntOrNull() ?: 0 + + return AndroidAppReleaseDto( + versionCode = versionCode, + versionName = versionName, + downloadPath = ServerConfig.absoluteArgusUrl(manifest.release.downloadPath), + publishedAt = manifest.release.publishedAt, + notes = manifest.release.releaseNotes, + isRequired = true, + minimumSupportedVersionCode = versionCode + ) + } + + private suspend fun executeJsonRequest(request: Request, serializer: kotlinx.serialization.KSerializer): T = + withContext(Dispatchers.IO) { + try { + httpClient.newCall(request).execute().use { response -> + val body = response.body?.string().orEmpty() + if (!response.isSuccessful) { + throw ApiException(response.code, formatApiErrorMessage(response.code, body)) + } + + return@withContext try { + json.decodeFromString(serializer, body) + } catch (error: SerializationException) { + throw ApiException(response.code, "Failed to decode server response: ${error.message}") + } + } + } catch (error: IOException) { + throw ApiException(-1, networkErrorMessage()) + } + } + + private suspend fun executeUnitRequest(request: Request) = + withContext(Dispatchers.IO) { + try { + httpClient.newCall(request).execute().use { response -> + val body = response.body?.string().orEmpty() + if (!response.isSuccessful) { + throw ApiException(response.code, formatApiErrorMessage(response.code, body)) + } + } + } catch (error: IOException) { + throw ApiException(-1, networkErrorMessage()) + } + } + + private fun formatApiErrorMessage(statusCode: Int, responseBody: String): String { + val trimmedBody = responseBody.trim() + val problemDetailsMessage = trimmedBody + .takeIf { it.startsWith("{") && it.endsWith("}") } + ?.let(::parseProblemDetailsMessage) + ?.takeIf { it.isNotBlank() } + + return when { + !problemDetailsMessage.isNullOrBlank() -> problemDetailsMessage + trimmedBody.startsWith("{") && trimmedBody.endsWith("}") -> defaultApiErrorMessage(statusCode) + trimmedBody.isNotBlank() -> trimmedBody + else -> defaultApiErrorMessage(statusCode) + } + } + + private fun parseProblemDetailsMessage(responseBody: String): String? = runCatching { + val jsonObject = json.parseToJsonElement(responseBody).jsonObject + val detail = jsonObject["detail"]?.jsonPrimitive?.content?.trim().orEmpty() + val title = jsonObject["title"]?.jsonPrimitive?.content?.trim().orEmpty() + when { + detail.isNotBlank() -> detail + title.isNotBlank() && title != "Unauthorized" -> title + else -> null + } + }.getOrNull() + + private fun defaultApiErrorMessage(statusCode: Int): String = when (statusCode) { + 400 -> "Некорректный запрос." + 401 -> "Ошибка авторизации." + 403 -> "Доступ запрещён." + 404 -> "Ничего не найдено." + 409 -> "Конфликт данных." + 429 -> "Слишком много запросов." + in 500..599 -> "Ошибка сервера." + else -> "HTTP $statusCode" + } + + private fun networkErrorMessage(): String = + "Не удалось подключиться к серверу. Проверьте интернет и попробуйте ещё раз." + + private fun Request.Builder.withBearer(accessToken: String): Request.Builder = + header("Authorization", "Bearer $accessToken") + + private fun Request.Builder.withClientVersionHeaders(): Request.Builder = + header("X-Ikar-Client-Platform", clientVersionProvider.platform) + .header("X-Ikar-Client-Version-Code", clientVersionProvider.versionCode) + .header("X-Ikar-Client-Version-Name", clientVersionProvider.versionName) + + private fun buildSearchPath( + basePath: String, + query: String, + filter: String?, + type: String?, + page: Int, + limit: Int, + dateFrom: String?, + dateTo: String?, + author: String? + ): String { + val queryParts = mutableListOf( + "q=${encodeQuery(query)}", + "page=${page.coerceAtLeast(1)}", + "limit=${limit.coerceIn(1, 100)}" + ) + filter?.takeIf { it.isNotBlank() }?.let { queryParts += "filter=${encodeQuery(it)}" } + type?.takeIf { it.isNotBlank() }?.let { queryParts += "type=${encodeQuery(it)}" } + dateFrom?.takeIf { it.isNotBlank() }?.let { queryParts += "dateFrom=${encodeQuery(it)}" } + dateTo?.takeIf { it.isNotBlank() }?.let { queryParts += "dateTo=${encodeQuery(it)}" } + author?.takeIf { it.isNotBlank() }?.let { queryParts += "author=${encodeQuery(it)}" } + return "$basePath?${queryParts.joinToString("&")}" + } + + private fun encodeQuery(value: String): String = + URLEncoder.encode(value, StandardCharsets.UTF_8.toString()) + + companion object { + private val JSON = "application/json; charset=utf-8".toMediaType() + } +} + +data class ClientVersionProvider( + val platform: String = "android", + val versionCode: String, + val versionName: String +) diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/network/ServerConfig.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/network/ServerConfig.kt new file mode 100644 index 00000000..183d8af2 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/network/ServerConfig.kt @@ -0,0 +1,39 @@ +package com.seven.ikar.kotlin.core.network + +object ServerConfig { + const val MessengerBaseUrl = "https://ikar.kusoft.xyz" + const val ArgusBaseUrl = "https://argus.kusoft.xyz" + const val AndroidAppSlug = "ikar-android" + const val AndroidAppPlatform = "android" + const val AndroidUpdateChannel = "stable" + const val AndroidManifestPath = "/api/apps/" + AndroidAppSlug + "/manifest?platform=" + AndroidAppPlatform + "&channel=" + AndroidUpdateChannel + const val HubPath = "/hubs/messenger" + + fun absoluteMessengerUrl(path: String): String = buildAbsoluteUrl(MessengerBaseUrl, path) + + fun absoluteArgusUrl(path: String): String = buildAbsoluteUrl(ArgusBaseUrl, path) + + fun normalizeMediaUrl(path: String?): String? { + if (path.isNullOrBlank()) { + return null + } + + return when { + path.startsWith("http://") || path.startsWith("https://") -> path + path.startsWith("/api/") || path.startsWith("/uploads/") -> buildAbsoluteUrl(MessengerBaseUrl, path) + else -> path + } + } + + private fun buildAbsoluteUrl(baseUrl: String, path: String): String { + if (path.startsWith("http://") || path.startsWith("https://")) { + return path + } + + return if (path.startsWith("/")) { + baseUrl + path + } else { + "$baseUrl/$path" + } + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/AndroidActiveChatState.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/AndroidActiveChatState.kt new file mode 100644 index 00000000..744f18af --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/AndroidActiveChatState.kt @@ -0,0 +1,13 @@ +package com.seven.ikar.kotlin.core.push + +import java.util.concurrent.atomic.AtomicReference + +object AndroidActiveChatState { + private val activeChatId = AtomicReference(null) + + fun setActiveChatId(chatId: String?) { + activeChatId.set(chatId?.takeIf { it.isNotBlank() }) + } + + fun getActiveChatId(): String? = activeChatId.get() +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/AndroidAppVisibilityState.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/AndroidAppVisibilityState.kt new file mode 100644 index 00000000..9ec79a60 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/AndroidAppVisibilityState.kt @@ -0,0 +1,13 @@ +package com.seven.ikar.kotlin.core.push + +import java.util.concurrent.atomic.AtomicBoolean + +object AndroidAppVisibilityState { + private val isVisible = AtomicBoolean(false) + + fun setVisible(value: Boolean) { + isVisible.set(value) + } + + fun isVisible(): Boolean = isVisible.get() +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/AndroidFirebaseOptionsLoader.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/AndroidFirebaseOptionsLoader.kt new file mode 100644 index 00000000..87b347d9 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/AndroidFirebaseOptionsLoader.kt @@ -0,0 +1,35 @@ +package com.seven.ikar.kotlin.core.push + +import android.content.Context +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.Json + +object AndroidFirebaseOptionsLoader { + private var cached: AndroidFirebaseOptions? = null + + fun tryLoad(context: Context): AndroidFirebaseOptions? { + cached?.let { return it } + + return runCatching { + context.assets.open("firebase.android.json").bufferedReader().use { reader -> + Json { ignoreUnknownKeys = true } + .decodeFromString(AndroidFirebaseOptions.serializer(), reader.readText()) + } + }.getOrNull()?.takeIf { + it.applicationId.isNotBlank() && + it.projectId.isNotBlank() && + it.apiKey.isNotBlank() && + it.senderId.isNotBlank() + }?.also { + cached = it + } + } +} + +@Serializable +data class AndroidFirebaseOptions( + val applicationId: String, + val projectId: String, + val apiKey: String, + val senderId: String +) diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/AndroidMessageNotificationSound.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/AndroidMessageNotificationSound.kt new file mode 100644 index 00000000..4732c680 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/AndroidMessageNotificationSound.kt @@ -0,0 +1,62 @@ +package com.seven.ikar.kotlin.core.push + +import android.content.Context +import android.media.AudioAttributes +import android.media.Ringtone +import android.media.RingtoneManager +import android.net.Uri +import android.os.SystemClock + +object AndroidMessageNotificationSound { + private const val DuplicateSuppressionWindowMs = 5000L + private const val MinimumGapBetweenSoundsMs = 2000L + private val playbackLock = Any() + private var lastPlayedKey: String? = null + private var lastPlayedAtMs: Long = 0L + private var activeRingtone: Ringtone? = null + + fun resolveUri(option: NotificationSoundOption): Uri? = when (option) { + NotificationSoundOption.Default -> RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION) + NotificationSoundOption.Ringtone -> RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE) + NotificationSoundOption.Alarm -> RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM) + NotificationSoundOption.Silent -> null + } + + fun resolveAudioAttributes(option: NotificationSoundOption): AudioAttributes? = when (option) { + NotificationSoundOption.Default -> notificationAudioAttributes(AudioAttributes.USAGE_NOTIFICATION) + NotificationSoundOption.Ringtone -> notificationAudioAttributes(AudioAttributes.USAGE_NOTIFICATION_RINGTONE) + NotificationSoundOption.Alarm -> notificationAudioAttributes(AudioAttributes.USAGE_ALARM) + NotificationSoundOption.Silent -> null + } + + fun play(context: Context, option: NotificationSoundOption, dedupeKey: String? = null) { + val soundUri = resolveUri(option) ?: return + val audioAttributes = resolveAudioAttributes(option) ?: return + val now = SystemClock.elapsedRealtime() + synchronized(playbackLock) { + if (now - lastPlayedAtMs < MinimumGapBetweenSoundsMs) { + return + } + if (dedupeKey != null && dedupeKey == lastPlayedKey && now - lastPlayedAtMs < DuplicateSuppressionWindowMs) { + return + } + + runCatching { + activeRingtone?.stop() + RingtoneManager.getRingtone(context.applicationContext, soundUri)?.apply { + this.audioAttributes = audioAttributes + play() + activeRingtone = this + } + } + lastPlayedKey = dedupeKey + lastPlayedAtMs = now + } + } + + private fun notificationAudioAttributes(usage: Int): AudioAttributes = + AudioAttributes.Builder() + .setUsage(usage) + .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) + .build() +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/AndroidNotificationPermissionHelper.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/AndroidNotificationPermissionHelper.kt new file mode 100644 index 00000000..2a24a5d9 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/AndroidNotificationPermissionHelper.kt @@ -0,0 +1,35 @@ +package com.seven.ikar.kotlin.core.push + +import android.Manifest +import android.app.Activity +import android.content.Context +import android.content.pm.PackageManager +import android.os.Build +import androidx.core.app.NotificationManagerCompat +import androidx.core.content.ContextCompat + +object AndroidNotificationPermissionHelper { + const val RequestCode = 5101 + + fun areNotificationsEnabled(context: Context): Boolean { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && + ContextCompat.checkSelfPermission(context, Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED + ) { + return false + } + + return NotificationManagerCompat.from(context).areNotificationsEnabled() + } + + fun requestIfNeeded(activity: Activity) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) { + return + } + + if (ContextCompat.checkSelfPermission(activity, Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED) { + return + } + + activity.requestPermissions(arrayOf(Manifest.permission.POST_NOTIFICATIONS), RequestCode) + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/AndroidPushBootstrapper.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/AndroidPushBootstrapper.kt new file mode 100644 index 00000000..03e0d452 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/AndroidPushBootstrapper.kt @@ -0,0 +1,150 @@ +package com.seven.ikar.kotlin.core.push + +import android.app.NotificationChannel +import android.app.NotificationManager +import android.content.Context +import android.os.Build +import com.google.firebase.FirebaseApp +import com.google.firebase.FirebaseOptions + +object AndroidPushBootstrapper { + private const val MessageDefaultChannelId = "ikar_kotlin_messages_default_v2" + private const val MessageRingtoneChannelId = "ikar_kotlin_messages_ringtone_v2" + private const val MessageAlarmChannelId = "ikar_kotlin_messages_alarm_v2" + private const val MessageSilentChannelId = "ikar_kotlin_messages_silent_v2" + private const val UpdatesChannelId = "ikar_kotlin_updates_v1" + private const val LegacyCallsChannelId = "ikar_kotlin_calls_v1" + private const val CallsChannelId = "ikar_kotlin_calls_v2" + + fun tryInitialize(context: Context): Boolean { + if (tryGetExistingApp() != null) { + ensureChannels(context) + return true + } + + val options = AndroidFirebaseOptionsLoader.tryLoad(context) ?: return false + val firebaseOptions = FirebaseOptions.Builder() + .setApplicationId(options.applicationId) + .setProjectId(options.projectId) + .setApiKey(options.apiKey) + .setGcmSenderId(options.senderId) + .build() + + return runCatching { + FirebaseApp.initializeApp(context, firebaseOptions) + }.getOrNull()?.let { + ensureChannels(context) + true + } ?: false + } + + fun messageChannelId(soundOption: NotificationSoundOption): String = when (soundOption) { + NotificationSoundOption.Default -> MessageDefaultChannelId + NotificationSoundOption.Ringtone -> MessageRingtoneChannelId + NotificationSoundOption.Alarm -> MessageAlarmChannelId + NotificationSoundOption.Silent -> MessageSilentChannelId + } + + fun updatesChannelId(): String = UpdatesChannelId + + fun callsChannelId(): String = CallsChannelId + + private fun ensureChannels(context: Context) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { + return + } + + val manager = context.getSystemService(Context.NOTIFICATION_SERVICE) as? NotificationManager ?: return + if (manager.getNotificationChannel(LegacyCallsChannelId) != null) { + manager.deleteNotificationChannel(LegacyCallsChannelId) + } + + ensureMessageChannel( + manager = manager, + channelId = MessageDefaultChannelId, + channelName = "Сообщения", + soundOption = NotificationSoundOption.Default + ) + ensureMessageChannel( + manager = manager, + channelId = MessageRingtoneChannelId, + channelName = "Сообщения (рингтон)", + soundOption = NotificationSoundOption.Ringtone + ) + ensureMessageChannel( + manager = manager, + channelId = MessageAlarmChannelId, + channelName = "Сообщения (сигнал)", + soundOption = NotificationSoundOption.Alarm + ) + ensureMessageChannel( + manager = manager, + channelId = MessageSilentChannelId, + channelName = "Сообщения (без звука)", + soundOption = NotificationSoundOption.Silent + ) + + if (manager.getNotificationChannel(UpdatesChannelId) == null) { + manager.createNotificationChannel( + NotificationChannel( + UpdatesChannelId, + "Обновления", + NotificationManager.IMPORTANCE_HIGH + ).apply { + description = "Уведомления о новых версиях приложения." + setSound( + AndroidMessageNotificationSound.resolveUri(NotificationSoundOption.Default), + AndroidMessageNotificationSound.resolveAudioAttributes(NotificationSoundOption.Default) + ) + enableVibration(true) + } + ) + } + + if (manager.getNotificationChannel(CallsChannelId) == null) { + manager.createNotificationChannel( + NotificationChannel( + CallsChannelId, + "Звонки", + NotificationManager.IMPORTANCE_HIGH + ).apply { + description = "Уведомления о входящих звонках." + setSound( + AndroidMessageNotificationSound.resolveUri(NotificationSoundOption.Ringtone), + AndroidMessageNotificationSound.resolveAudioAttributes(NotificationSoundOption.Ringtone) + ) + enableVibration(true) + } + ) + } + } + + private fun ensureMessageChannel( + manager: NotificationManager, + channelId: String, + channelName: String, + soundOption: NotificationSoundOption + ) { + if (manager.getNotificationChannel(channelId) != null) { + return + } + + manager.createNotificationChannel( + NotificationChannel( + channelId, + channelName, + NotificationManager.IMPORTANCE_HIGH + ).apply { + description = "Уведомления о новых сообщениях." + setSound( + AndroidMessageNotificationSound.resolveUri(soundOption), + AndroidMessageNotificationSound.resolveAudioAttributes(soundOption) + ) + enableVibration(soundOption != NotificationSoundOption.Silent) + } + ) + } + + private fun tryGetExistingApp(): FirebaseApp? = + runCatching { FirebaseApp.getInstance() }.getOrNull() +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/AndroidPushSettings.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/AndroidPushSettings.kt new file mode 100644 index 00000000..37618c66 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/AndroidPushSettings.kt @@ -0,0 +1,413 @@ +package com.seven.ikar.kotlin.core.push + +import android.content.Context +import android.util.Base64 +import java.util.UUID + +class AndroidPushSettings(context: Context) { + private val preferences = context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_PRIVATE) + + fun getInstallationId(): String { + val existing = preferences.getString(KEY_INSTALLATION_ID, null) + if (!existing.isNullOrBlank()) { + return existing + } + + val generated = UUID.randomUUID().toString().replace("-", "") + preferences.edit().putString(KEY_INSTALLATION_ID, generated).apply() + return generated + } + + fun getDeviceToken(): String? = preferences.getString(KEY_DEVICE_TOKEN, null) + + fun setDeviceToken(token: String?) { + preferences.edit().putString(KEY_DEVICE_TOKEN, token).apply() + } + + fun areNotificationsEnabled(): Boolean = + preferences.getBoolean(KEY_NOTIFICATIONS_ENABLED, true) + + fun setNotificationsEnabled(enabled: Boolean) { + preferences.edit().putBoolean(KEY_NOTIFICATIONS_ENABLED, enabled).apply() + } + + fun getMessageSound(): NotificationSoundOption = + getEnum(KEY_MESSAGE_SOUND, NotificationSoundOption.Default) + + fun setMessageSound(value: NotificationSoundOption) { + setEnum(KEY_MESSAGE_SOUND, value) + } + + fun getPrivateChatsEnabled(): Boolean = + preferences.getBoolean(KEY_PRIVATE_CHATS_ENABLED, true) + + fun setPrivateChatsEnabled(enabled: Boolean) { + preferences.edit().putBoolean(KEY_PRIVATE_CHATS_ENABLED, enabled).apply() + } + + fun getGroupsEnabled(): Boolean = + preferences.getBoolean(KEY_GROUPS_ENABLED, true) + + fun setGroupsEnabled(enabled: Boolean) { + preferences.edit().putBoolean(KEY_GROUPS_ENABLED, enabled).apply() + } + + fun getChannelsEnabled(): Boolean = + preferences.getBoolean(KEY_CHANNELS_ENABLED, false) + + fun setChannelsEnabled(enabled: Boolean) { + preferences.edit().putBoolean(KEY_CHANNELS_ENABLED, enabled).apply() + } + + fun getStoriesEnabled(): Boolean = + preferences.getBoolean(KEY_STORIES_ENABLED, false) + + fun setStoriesEnabled(enabled: Boolean) { + preferences.edit().putBoolean(KEY_STORIES_ENABLED, enabled).apply() + } + + fun getReactionsEnabled(): Boolean = + preferences.getBoolean(KEY_REACTIONS_ENABLED, true) + + fun setReactionsEnabled(enabled: Boolean) { + preferences.edit().putBoolean(KEY_REACTIONS_ENABLED, enabled).apply() + } + + fun getCallVibrationEnabled(): Boolean = + preferences.getBoolean(KEY_CALL_VIBRATION_ENABLED, true) + + fun setCallVibrationEnabled(enabled: Boolean) { + preferences.edit().putBoolean(KEY_CALL_VIBRATION_ENABLED, enabled).apply() + } + + fun getCallRingtone(): NotificationSoundOption = + getEnum(KEY_CALL_RINGTONE, NotificationSoundOption.Default) + + fun setCallRingtone(value: NotificationSoundOption) { + setEnum(KEY_CALL_RINGTONE, value) + } + + fun getShowBadgeEnabled(): Boolean = + preferences.getBoolean(KEY_SHOW_BADGE, true) + + fun setShowBadgeEnabled(enabled: Boolean) { + preferences.edit().putBoolean(KEY_SHOW_BADGE, enabled).apply() + } + + fun getIncludeMutedChatsInBadge(): Boolean = + preferences.getBoolean(KEY_INCLUDE_MUTED_CHATS_IN_BADGE, true) + + fun setIncludeMutedChatsInBadge(enabled: Boolean) { + preferences.edit().putBoolean(KEY_INCLUDE_MUTED_CHATS_IN_BADGE, enabled).apply() + } + + fun getCountMessagesInBadge(): Boolean = + preferences.getBoolean(KEY_COUNT_MESSAGES_IN_BADGE, true) + + fun setCountMessagesInBadge(enabled: Boolean) { + preferences.edit().putBoolean(KEY_COUNT_MESSAGES_IN_BADGE, enabled).apply() + } + + fun getInAppSoundEnabled(): Boolean = + preferences.getBoolean(KEY_IN_APP_SOUND_ENABLED, true) + + fun setInAppSoundEnabled(enabled: Boolean) { + preferences.edit().putBoolean(KEY_IN_APP_SOUND_ENABLED, enabled).apply() + } + + fun getInAppVibrationEnabled(): Boolean = + preferences.getBoolean(KEY_IN_APP_VIBRATION_ENABLED, true) + + fun setInAppVibrationEnabled(enabled: Boolean) { + preferences.edit().putBoolean(KEY_IN_APP_VIBRATION_ENABLED, enabled).apply() + } + + fun getInAppShowTextEnabled(): Boolean = + preferences.getBoolean(KEY_IN_APP_SHOW_TEXT_ENABLED, true) + + fun setInAppShowTextEnabled(enabled: Boolean) { + preferences.edit().putBoolean(KEY_IN_APP_SHOW_TEXT_ENABLED, enabled).apply() + } + + fun getSoundInActiveChatEnabled(): Boolean = + preferences.getBoolean(KEY_SOUND_IN_ACTIVE_CHAT_ENABLED, true) + + fun setSoundInActiveChatEnabled(enabled: Boolean) { + preferences.edit().putBoolean(KEY_SOUND_IN_ACTIVE_CHAT_ENABLED, enabled).apply() + } + + fun getPopupWindowsEnabled(): Boolean = + preferences.getBoolean(KEY_POPUP_WINDOWS_ENABLED, false) + + fun setPopupWindowsEnabled(enabled: Boolean) { + preferences.edit().putBoolean(KEY_POPUP_WINDOWS_ENABLED, enabled).apply() + } + + fun getContactJoinedEnabled(): Boolean = + preferences.getBoolean(KEY_CONTACT_JOINED_ENABLED, false) + + fun setContactJoinedEnabled(enabled: Boolean) { + preferences.edit().putBoolean(KEY_CONTACT_JOINED_ENABLED, enabled).apply() + } + + fun getPinnedMessagesEnabled(): Boolean = + preferences.getBoolean(KEY_PINNED_MESSAGES_ENABLED, true) + + fun setPinnedMessagesEnabled(enabled: Boolean) { + preferences.edit().putBoolean(KEY_PINNED_MESSAGES_ENABLED, enabled).apply() + } + + fun getRestartOnCloseEnabled(): Boolean = + preferences.getBoolean(KEY_RESTART_ON_CLOSE_ENABLED, false) + + fun setRestartOnCloseEnabled(enabled: Boolean) { + preferences.edit().putBoolean(KEY_RESTART_ON_CLOSE_ENABLED, enabled).apply() + } + + fun getBackgroundConnectionEnabled(): Boolean = + preferences.getBoolean(KEY_BACKGROUND_CONNECTION_ENABLED, false) + + fun setBackgroundConnectionEnabled(enabled: Boolean) { + preferences.edit().putBoolean(KEY_BACKGROUND_CONNECTION_ENABLED, enabled).apply() + } + + fun getRepeatInterval(): NotificationRepeatIntervalOption { + val rawValue = preferences.getInt(KEY_REPEAT_INTERVAL, NotificationRepeatIntervalOption.OneHour.minutes) + return NotificationRepeatIntervalOption.entries.firstOrNull { it.minutes == rawValue } + ?: NotificationRepeatIntervalOption.OneHour + } + + fun setRepeatInterval(value: NotificationRepeatIntervalOption) { + preferences.edit().putInt(KEY_REPEAT_INTERVAL, value.minutes).apply() + } + + fun loadSnapshot(): NotificationSettingsSnapshot = + NotificationSettingsSnapshot( + notificationsEnabled = areNotificationsEnabled(), + messageSound = getMessageSound(), + privateChatsEnabled = getPrivateChatsEnabled(), + groupsEnabled = getGroupsEnabled(), + channelsEnabled = getChannelsEnabled(), + storiesEnabled = getStoriesEnabled(), + reactionsEnabled = getReactionsEnabled(), + callVibrationEnabled = getCallVibrationEnabled(), + callRingtone = getCallRingtone(), + showBadge = getShowBadgeEnabled(), + includeMutedChatsInBadge = getIncludeMutedChatsInBadge(), + countMessagesInBadge = getCountMessagesInBadge(), + inAppSoundEnabled = getInAppSoundEnabled(), + inAppVibrationEnabled = getInAppVibrationEnabled(), + inAppShowTextEnabled = getInAppShowTextEnabled(), + soundInActiveChatEnabled = getSoundInActiveChatEnabled(), + popupWindowsEnabled = getPopupWindowsEnabled(), + contactJoinedEnabled = getContactJoinedEnabled(), + pinnedMessagesEnabled = getPinnedMessagesEnabled(), + restartOnCloseEnabled = getRestartOnCloseEnabled(), + backgroundConnectionEnabled = getBackgroundConnectionEnabled(), + repeatInterval = getRepeatInterval() + ) + + fun saveSnapshot(snapshot: NotificationSettingsSnapshot) { + setNotificationsEnabled(snapshot.notificationsEnabled) + setMessageSound(snapshot.messageSound) + setPrivateChatsEnabled(snapshot.privateChatsEnabled) + setGroupsEnabled(snapshot.groupsEnabled) + setChannelsEnabled(snapshot.channelsEnabled) + setStoriesEnabled(snapshot.storiesEnabled) + setReactionsEnabled(snapshot.reactionsEnabled) + setCallVibrationEnabled(snapshot.callVibrationEnabled) + setCallRingtone(snapshot.callRingtone) + setShowBadgeEnabled(snapshot.showBadge) + setIncludeMutedChatsInBadge(snapshot.includeMutedChatsInBadge) + setCountMessagesInBadge(snapshot.countMessagesInBadge) + setInAppSoundEnabled(snapshot.inAppSoundEnabled) + setInAppVibrationEnabled(snapshot.inAppVibrationEnabled) + setInAppShowTextEnabled(snapshot.inAppShowTextEnabled) + setSoundInActiveChatEnabled(snapshot.soundInActiveChatEnabled) + setPopupWindowsEnabled(snapshot.popupWindowsEnabled) + setContactJoinedEnabled(snapshot.contactJoinedEnabled) + setPinnedMessagesEnabled(snapshot.pinnedMessagesEnabled) + setRestartOnCloseEnabled(snapshot.restartOnCloseEnabled) + setBackgroundConnectionEnabled(snapshot.backgroundConnectionEnabled) + setRepeatInterval(snapshot.repeatInterval) + } + + fun loadChatNotificationSnapshot(chatId: String): ChatNotificationSettingsSnapshot = + ChatNotificationSettingsSnapshot( + notificationsEnabled = getNullableBoolean(chatPreferenceKey(chatId, KEY_CHAT_NOTIFICATIONS_ENABLED)), + messageSound = getNullableEnum( + chatPreferenceKey(chatId, KEY_CHAT_MESSAGE_SOUND), + NotificationSoundOption.Default + ), + showMessagePreview = getNullableBoolean(chatPreferenceKey(chatId, KEY_CHAT_SHOW_MESSAGE_PREVIEW)), + popupWindowsEnabled = getNullableBoolean(chatPreferenceKey(chatId, KEY_CHAT_POPUP_WINDOWS_ENABLED)), + soundInActiveChatEnabled = getNullableBoolean(chatPreferenceKey(chatId, KEY_CHAT_SOUND_IN_ACTIVE_CHAT_ENABLED)) + ) + + fun saveChatNotificationSnapshot(chatId: String, snapshot: ChatNotificationSettingsSnapshot) { + preferences.edit().apply { + putNullableBoolean(chatPreferenceKey(chatId, KEY_CHAT_NOTIFICATIONS_ENABLED), snapshot.notificationsEnabled) + putNullableEnum(chatPreferenceKey(chatId, KEY_CHAT_MESSAGE_SOUND), snapshot.messageSound) + putNullableBoolean(chatPreferenceKey(chatId, KEY_CHAT_SHOW_MESSAGE_PREVIEW), snapshot.showMessagePreview) + putNullableBoolean(chatPreferenceKey(chatId, KEY_CHAT_POPUP_WINDOWS_ENABLED), snapshot.popupWindowsEnabled) + putNullableBoolean(chatPreferenceKey(chatId, KEY_CHAT_SOUND_IN_ACTIVE_CHAT_ENABLED), snapshot.soundInActiveChatEnabled) + apply() + } + } + + fun resetChatNotificationPreferences(chatId: String) { + val prefix = chatPreferencePrefix(chatId) + val keys = preferences.all.keys.filter { it.startsWith(prefix) } + preferences.edit().apply { + keys.forEach(::remove) + apply() + } + } + + fun resetAllChatNotificationPreferences() { + val keys = preferences.all.keys.filter { it.startsWith(KEY_CHAT_NOTIFICATION_PREFIX) } + preferences.edit().apply { + keys.forEach(::remove) + apply() + } + } + + fun createDefaultSnapshot(): NotificationSettingsSnapshot = + NotificationSettingsSnapshot( + notificationsEnabled = true, + messageSound = NotificationSoundOption.Default, + privateChatsEnabled = true, + groupsEnabled = true, + channelsEnabled = false, + storiesEnabled = false, + reactionsEnabled = true, + callVibrationEnabled = true, + callRingtone = NotificationSoundOption.Default, + showBadge = true, + includeMutedChatsInBadge = true, + countMessagesInBadge = true, + inAppSoundEnabled = true, + inAppVibrationEnabled = true, + inAppShowTextEnabled = true, + soundInActiveChatEnabled = true, + popupWindowsEnabled = false, + contactJoinedEnabled = false, + pinnedMessagesEnabled = true, + restartOnCloseEnabled = false, + backgroundConnectionEnabled = false, + repeatInterval = NotificationRepeatIntervalOption.OneHour + ) + + fun resetNotificationPreferences() { + val chatKeys = preferences.all.keys.filter { it.startsWith(KEY_CHAT_NOTIFICATION_PREFIX) } + preferences.edit().apply { + remove(KEY_NOTIFICATIONS_ENABLED) + remove(KEY_MESSAGE_SOUND) + remove(KEY_PRIVATE_CHATS_ENABLED) + remove(KEY_GROUPS_ENABLED) + remove(KEY_CHANNELS_ENABLED) + remove(KEY_STORIES_ENABLED) + remove(KEY_REACTIONS_ENABLED) + remove(KEY_CALL_VIBRATION_ENABLED) + remove(KEY_CALL_RINGTONE) + remove(KEY_SHOW_BADGE) + remove(KEY_INCLUDE_MUTED_CHATS_IN_BADGE) + remove(KEY_COUNT_MESSAGES_IN_BADGE) + remove(KEY_IN_APP_SOUND_ENABLED) + remove(KEY_IN_APP_VIBRATION_ENABLED) + remove(KEY_IN_APP_SHOW_TEXT_ENABLED) + remove(KEY_SOUND_IN_ACTIVE_CHAT_ENABLED) + remove(KEY_POPUP_WINDOWS_ENABLED) + remove(KEY_CONTACT_JOINED_ENABLED) + remove(KEY_PINNED_MESSAGES_ENABLED) + remove(KEY_RESTART_ON_CLOSE_ENABLED) + remove(KEY_BACKGROUND_CONNECTION_ENABLED) + remove(KEY_REPEAT_INTERVAL) + chatKeys.forEach(::remove) + apply() + } + } + + private fun > getEnum(key: String, defaultValue: T): T { + val rawValue = preferences.getString(key, defaultValue.name).orEmpty() + @Suppress("UNCHECKED_CAST") + return defaultValue.declaringJavaClass.enumConstants + ?.firstOrNull { it.name == rawValue } as? T + ?: defaultValue + } + + private fun > setEnum(key: String, value: T) { + preferences.edit().putString(key, value.name).apply() + } + + private fun getNullableBoolean(key: String): Boolean? = + if (preferences.contains(key)) preferences.getBoolean(key, true) else null + + private fun android.content.SharedPreferences.Editor.putNullableBoolean(key: String, value: Boolean?) { + if (value == null) { + remove(key) + } else { + putBoolean(key, value) + } + } + + private fun > getNullableEnum(key: String, defaultValue: T): T? { + if (!preferences.contains(key)) { + return null + } + return getEnum(key, defaultValue) + } + + private fun > android.content.SharedPreferences.Editor.putNullableEnum(key: String, value: T?) { + if (value == null) { + remove(key) + } else { + putString(key, value.name) + } + } + + private fun chatPreferenceKey(chatId: String, key: String): String = + "${chatPreferencePrefix(chatId)}.$key" + + private fun chatPreferencePrefix(chatId: String): String { + val encodedChatId = Base64.encodeToString( + chatId.toByteArray(Charsets.UTF_8), + Base64.NO_WRAP or Base64.URL_SAFE + ) + return "$KEY_CHAT_NOTIFICATION_PREFIX$encodedChatId" + } + + companion object { + private const val PREFERENCES_NAME = "ikar_kotlin_push" + private const val KEY_INSTALLATION_ID = "installation_id" + private const val KEY_DEVICE_TOKEN = "device_token" + private const val KEY_NOTIFICATIONS_ENABLED = "notifications_enabled" + private const val KEY_MESSAGE_SOUND = "notification_sound" + private const val KEY_PRIVATE_CHATS_ENABLED = "notification_private_chats_enabled" + private const val KEY_GROUPS_ENABLED = "notification_groups_enabled" + private const val KEY_CHANNELS_ENABLED = "notification_channels_enabled" + private const val KEY_STORIES_ENABLED = "notification_stories_enabled" + private const val KEY_REACTIONS_ENABLED = "notification_reactions_enabled" + private const val KEY_CALL_VIBRATION_ENABLED = "notification_call_vibration_enabled" + private const val KEY_CALL_RINGTONE = "notification_call_ringtone" + private const val KEY_SHOW_BADGE = "notification_show_badge_enabled" + private const val KEY_INCLUDE_MUTED_CHATS_IN_BADGE = "notification_include_muted_chats_in_badge" + private const val KEY_COUNT_MESSAGES_IN_BADGE = "notification_count_messages_in_badge" + private const val KEY_IN_APP_SOUND_ENABLED = "notification_in_app_sound_enabled" + private const val KEY_IN_APP_VIBRATION_ENABLED = "notification_in_app_vibration_enabled" + private const val KEY_IN_APP_SHOW_TEXT_ENABLED = "notification_in_app_show_text_enabled" + private const val KEY_SOUND_IN_ACTIVE_CHAT_ENABLED = "notification_sound_in_active_chat_enabled" + private const val KEY_POPUP_WINDOWS_ENABLED = "notification_popup_windows_enabled" + private const val KEY_CONTACT_JOINED_ENABLED = "notification_contact_joined_enabled" + private const val KEY_PINNED_MESSAGES_ENABLED = "notification_pinned_messages_enabled" + private const val KEY_RESTART_ON_CLOSE_ENABLED = "notification_restart_on_close_enabled" + private const val KEY_BACKGROUND_CONNECTION_ENABLED = "notification_background_connection_enabled" + private const val KEY_REPEAT_INTERVAL = "notification_repeat_interval_minutes" + private const val KEY_CHAT_NOTIFICATION_PREFIX = "chat_notification." + private const val KEY_CHAT_NOTIFICATIONS_ENABLED = "notifications_enabled" + private const val KEY_CHAT_MESSAGE_SOUND = "message_sound" + private const val KEY_CHAT_SHOW_MESSAGE_PREVIEW = "show_message_preview" + private const val KEY_CHAT_POPUP_WINDOWS_ENABLED = "popup_windows_enabled" + private const val KEY_CHAT_SOUND_IN_ACTIVE_CHAT_ENABLED = "sound_in_active_chat_enabled" + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/FirebaseTokenProvider.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/FirebaseTokenProvider.kt new file mode 100644 index 00000000..181c87b3 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/FirebaseTokenProvider.kt @@ -0,0 +1,18 @@ +package com.seven.ikar.kotlin.core.push + +import android.content.Context +import com.google.android.gms.tasks.Tasks +import com.google.firebase.messaging.FirebaseMessaging +import java.util.concurrent.TimeUnit + +object FirebaseTokenProvider { + fun tryGetToken(context: Context): String? { + if (!AndroidPushBootstrapper.tryInitialize(context)) { + return null + } + + return runCatching { + Tasks.await(FirebaseMessaging.getInstance().token, 20, TimeUnit.SECONDS) + }.getOrNull() + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/IkarFirebaseMessagingService.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/IkarFirebaseMessagingService.kt new file mode 100644 index 00000000..54ccfa7b --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/IkarFirebaseMessagingService.kt @@ -0,0 +1,48 @@ +package com.seven.ikar.kotlin.core.push + +import android.util.Log +import com.google.firebase.messaging.FirebaseMessagingService +import com.google.firebase.messaging.RemoteMessage +import com.seven.ikar.kotlin.app.IkarNativeApp +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch + +class IkarFirebaseMessagingService : FirebaseMessagingService() { + override fun onNewToken(token: String) { + super.onNewToken(token) + val app = applicationContext as? IkarNativeApp ?: return + CoroutineScope(Dispatchers.IO).launch { + runCatching { + app.container.pushRegistrationManager.onTokenRefreshedAsync(token) + }.onFailure { error -> + Log.e(LOG_TAG, "OnNewToken failed", error) + } + } + } + + override fun onMessageReceived(message: RemoteMessage) { + super.onMessageReceived(message) + runCatching { + val data = message.data.orEmpty() + if (data.isNotEmpty()) { + PushNotificationDisplayService.show(this, data) + return + } + + PushNotificationDisplayService.show( + this, + mapOf( + PushDataKeys.Title to (message.notification?.title ?: "ИКАР"), + PushDataKeys.Body to (message.notification?.body ?: "Новое сообщение") + ) + ) + }.onFailure { error -> + Log.e(LOG_TAG, "OnMessageReceived failed", error) + } + } + + companion object { + private const val LOG_TAG = "IkarKotlinFcm" + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/IncomingCallFullScreenSetupHelper.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/IncomingCallFullScreenSetupHelper.kt new file mode 100644 index 00000000..afd7603f --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/IncomingCallFullScreenSetupHelper.kt @@ -0,0 +1,104 @@ +package com.seven.ikar.kotlin.core.push + +import android.Manifest +import android.app.NotificationManager +import android.content.Context +import android.content.Intent +import android.content.pm.PackageManager +import android.net.Uri +import android.os.Build +import android.provider.Settings +import androidx.core.app.NotificationManagerCompat +import androidx.core.content.ContextCompat + +sealed interface IncomingCallFullScreenSetupResult { + data object Ready : IncomingCallFullScreenSetupResult + data object NeedsPostNotificationsPermission : IncomingCallFullScreenSetupResult + data class NeedsSystemSettings( + val detail: String, + val intent: Intent + ) : IncomingCallFullScreenSetupResult +} + +object IncomingCallFullScreenSetupHelper { + fun evaluate(context: Context): IncomingCallFullScreenSetupResult { + AndroidPushBootstrapper.tryInitialize(context) + + if ( + Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && + ContextCompat.checkSelfPermission(context, Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED + ) { + return IncomingCallFullScreenSetupResult.NeedsPostNotificationsPermission + } + + if (!NotificationManagerCompat.from(context).areNotificationsEnabled()) { + return IncomingCallFullScreenSetupResult.NeedsSystemSettings( + detail = "Для полноэкранного входящего звонка Android требует включённые уведомления для Икар.", + intent = buildAppNotificationsIntent(context) + ) + } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + val notificationManager = context.getSystemService(NotificationManager::class.java) + val callsChannel = notificationManager?.getNotificationChannel(AndroidPushBootstrapper.callsChannelId()) + if (callsChannel != null && callsChannel.importance < NotificationManager.IMPORTANCE_HIGH) { + return IncomingCallFullScreenSetupResult.NeedsSystemSettings( + detail = "Для полноэкранного входящего звонка Android требует высокий приоритет канала «Звонки».", + intent = buildCallsChannelIntent(context) + ) + } + } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { + val notificationManager = context.getSystemService(NotificationManager::class.java) + val canUseFullScreenIntent = notificationManager?.canUseFullScreenIntent() == true + if (!canUseFullScreenIntent) { + return IncomingCallFullScreenSetupResult.NeedsSystemSettings( + detail = "Для полноэкранного входящего звонка Android требует разрешить полноэкранный вызов для Икар.", + intent = buildFullScreenIntentSettingsIntent(context) + ) + } + } + + return IncomingCallFullScreenSetupResult.Ready + } + + private fun buildAppNotificationsIntent(context: Context): Intent = + resolveSettingsIntent( + context = context, + primary = Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS).apply { + putExtra(Settings.EXTRA_APP_PACKAGE, context.packageName) + putExtra("android.provider.extra.APP_PACKAGE", context.packageName) + data = Uri.parse("package:${context.packageName}") + } + ) + + private fun buildCallsChannelIntent(context: Context): Intent = + resolveSettingsIntent( + context = context, + primary = Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS).apply { + putExtra(Settings.EXTRA_APP_PACKAGE, context.packageName) + putExtra(Settings.EXTRA_CHANNEL_ID, AndroidPushBootstrapper.callsChannelId()) + } + ) + + private fun buildFullScreenIntentSettingsIntent(context: Context): Intent = + resolveSettingsIntent( + context = context, + primary = Intent(Settings.ACTION_MANAGE_APP_USE_FULL_SCREEN_INTENT).apply { + data = Uri.parse("package:${context.packageName}") + } + ) + + private fun resolveSettingsIntent(context: Context, primary: Intent): Intent { + val packageManager = context.packageManager + if (primary.resolveActivity(packageManager) != null) { + return primary.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + } + + return Intent( + Settings.ACTION_APPLICATION_DETAILS_SETTINGS, + Uri.parse("package:${context.packageName}") + ).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/IncomingCallInviteStore.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/IncomingCallInviteStore.kt new file mode 100644 index 00000000..5acfebb8 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/IncomingCallInviteStore.kt @@ -0,0 +1,100 @@ +package com.seven.ikar.kotlin.core.push + +import android.content.Intent +import com.seven.ikar.kotlin.core.model.CallMediaType +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow + +data class PendingIncomingCallInvite( + val callId: String, + val chatId: String, + val callerId: String, + val callerDisplayName: String, + val callerPhoneNumber: String?, + val mediaType: CallMediaType, + val requestId: Long = System.nanoTime() +) + +class IncomingCallInviteStore { + private val _pendingInvite = MutableStateFlow(null) + val pendingInvite: StateFlow = _pendingInvite.asStateFlow() + + fun setPending(invite: PendingIncomingCallInvite?) { + _pendingInvite.value = invite + } + + fun clear(requestId: Long? = null) { + val current = _pendingInvite.value ?: return + if (requestId == null || current.requestId == requestId) { + _pendingInvite.value = null + } + } + + fun clearByCallId(callId: String?) { + val normalizedCallId = callId?.takeIf { it.isNotBlank() } ?: return + if (_pendingInvite.value?.callId == normalizedCallId) { + _pendingInvite.value = null + } + } +} + +fun PendingIncomingCallInvite.applyToIntent(intent: Intent): Intent = + intent.apply { + putExtra(PushDataKeys.Kind, if (mediaType == CallMediaType.Video) PushDataKinds.VideoCallInvite else PushDataKinds.AudioCallInvite) + putExtra(PushDataKeys.CallId, callId) + putExtra(PushDataKeys.ChatId, chatId) + putExtra(PushDataKeys.SenderId, callerId) + putExtra(PushDataKeys.SenderName, callerDisplayName) + putExtra(PushDataKeys.SenderPhoneNumber, callerPhoneNumber) + putExtra(PushDataKeys.CallMediaType, mediaType.name) + } + +fun pendingIncomingCallInviteFromMap(data: Map): PendingIncomingCallInvite? = + pendingIncomingCallInviteFromReader(data::get) + +fun pendingIncomingCallInviteFromIntent(intent: Intent): PendingIncomingCallInvite? = + pendingIncomingCallInviteFromReader(intent::getStringExtra) + +fun endedCallIdFromMap(data: Map): String? = + endedCallIdFromReader(data::get) + +fun endedCallIdFromIntent(intent: Intent): String? = + endedCallIdFromReader(intent::getStringExtra) + +private fun pendingIncomingCallInviteFromReader(readValue: (String) -> String?): PendingIncomingCallInvite? { + val kind = readValue(PushDataKeys.Kind) + if (kind != PushDataKinds.AudioCallInvite && kind != PushDataKinds.VideoCallInvite) { + return null + } + + val callId = readValue(PushDataKeys.CallId).orEmpty() + val chatId = readValue(PushDataKeys.ChatId).orEmpty() + val callerId = readValue(PushDataKeys.SenderId).orEmpty() + val callerName = readValue(PushDataKeys.SenderName).orEmpty() + if (callId.isBlank() || chatId.isBlank() || callerId.isBlank() || callerName.isBlank()) { + return null + } + + return PendingIncomingCallInvite( + callId = callId, + chatId = chatId, + callerId = callerId, + callerDisplayName = callerName, + callerPhoneNumber = readValue(PushDataKeys.SenderPhoneNumber), + mediaType = when { + kind == PushDataKinds.VideoCallInvite -> CallMediaType.Video + readValue(PushDataKeys.CallMediaType) == CallMediaType.Video.name -> CallMediaType.Video + else -> CallMediaType.Audio + } + ) +} + +private fun endedCallIdFromReader(readValue: (String) -> String?): String? { + val kind = readValue(PushDataKeys.Kind) + if (kind != PushDataKinds.AudioCallEnded && kind != PushDataKinds.VideoCallEnded) { + return null + } + + return readValue(PushDataKeys.CallId)?.takeIf { it.isNotBlank() } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/IncomingCallNotificationManager.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/IncomingCallNotificationManager.kt new file mode 100644 index 00000000..af955c85 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/IncomingCallNotificationManager.kt @@ -0,0 +1,111 @@ +package com.seven.ikar.kotlin.core.push + +import android.app.KeyguardManager +import android.app.PendingIntent +import android.content.Context +import android.content.Intent +import android.os.Build +import android.os.PowerManager +import androidx.core.app.NotificationCompat +import androidx.core.app.NotificationManagerCompat +import androidx.core.app.Person +import com.seven.ikar.kotlin.feature.call.IncomingCallActivity + +object IncomingCallNotificationManager { + fun showIncomingCall(context: Context, invite: PendingIncomingCallInvite) { + val notificationId = notificationIdFor(invite.callId) + val contentIntent = IncomingCallActivity.createLaunchIntent(context, invite) + val contentPendingIntent = PendingIntent.getActivity( + context, + notificationId, + contentIntent, + pendingIntentFlags(updateCurrent = true) + ) + val answerPendingIntent = PendingIntent.getActivity( + context, + notificationId + 1, + IncomingCallActivity.createLaunchIntent(context, invite, autoAccept = true), + pendingIntentFlags(updateCurrent = true) + ) + val declinePendingIntent = PendingIntent.getBroadcast( + context, + notificationId + 2, + invite.applyToIntent( + Intent(context, NotificationActionReceiver::class.java).apply { + action = NotificationAction.DeclineIncomingCallAction + } + ), + pendingIntentFlags(updateCurrent = true) + ) + + val title = invite.callerDisplayName + val body = if (invite.mediaType == com.seven.ikar.kotlin.core.model.CallMediaType.Video) { + "Видеозвонок в Икар" + } else { + "Аудиозвонок в Икар" + } + + val useFullScreenIntent = shouldUseFullScreenIntent(context) + val notificationBuilder = NotificationCompat.Builder(context, AndroidPushBootstrapper.callsChannelId()) + .setSmallIcon(android.R.drawable.sym_call_incoming) + .setContentTitle(title) + .setContentText(body) + .setCategory(NotificationCompat.CATEGORY_CALL) + .setPriority(NotificationCompat.PRIORITY_MAX) + .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) + .setOngoing(true) + .setAutoCancel(false) + .setContentIntent(contentPendingIntent) + if (useFullScreenIntent) { + notificationBuilder + .setColorized(true) + .setStyle( + NotificationCompat.CallStyle.forIncomingCall( + Person.Builder().setName(invite.callerDisplayName).build(), + declinePendingIntent, + answerPendingIntent + ) + ) + notificationBuilder.setFullScreenIntent(contentPendingIntent, true) + } else { + notificationBuilder + .setStyle(NotificationCompat.BigTextStyle().bigText(body)) + .addAction(android.R.drawable.ic_menu_close_clear_cancel, "Отклонить", declinePendingIntent) + .addAction(android.R.drawable.sym_call_incoming, "Принять", answerPendingIntent) + } + + NotificationManagerCompat.from(context).notify(notificationId, notificationBuilder.build()) + } + + fun cancelIncomingCall(context: Context, callId: String?) { + val normalizedCallId = callId?.takeIf { it.isNotBlank() } ?: return + NotificationManagerCompat.from(context).cancel(notificationIdFor(normalizedCallId)) + } + + fun openIncomingCallScreen( + context: Context, + invite: PendingIncomingCallInvite, + autoAccept: Boolean = false + ) { + context.startActivity(IncomingCallActivity.createLaunchIntent(context, invite, autoAccept)) + } + + private fun shouldUseFullScreenIntent(context: Context): Boolean { + val keyguardManager = context.getSystemService(Context.KEYGUARD_SERVICE) as? KeyguardManager + val powerManager = context.getSystemService(Context.POWER_SERVICE) as? PowerManager + val isKeyguardLocked = keyguardManager?.isKeyguardLocked == true + val isInteractive = powerManager?.isInteractive ?: true + return isKeyguardLocked || !isInteractive + } + + private fun notificationIdFor(callId: String): Int = callId.hashCode() + + private fun pendingIntentFlags(updateCurrent: Boolean): Int { + val mutableFlags = if (updateCurrent) PendingIntent.FLAG_UPDATE_CURRENT else 0 + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + mutableFlags or PendingIntent.FLAG_IMMUTABLE + } else { + mutableFlags + } + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/IncomingPushNavigationStore.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/IncomingPushNavigationStore.kt new file mode 100644 index 00000000..6d394d67 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/IncomingPushNavigationStore.kt @@ -0,0 +1,38 @@ +package com.seven.ikar.kotlin.core.push + +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow + +data class PendingPushNavigation( + val chatId: String, + val messageId: String?, + val requestId: Long = System.nanoTime() +) + +class IncomingPushNavigationStore { + private val _pendingNavigation = MutableStateFlow(null) + val pendingNavigation: StateFlow = _pendingNavigation.asStateFlow() + + fun setPendingChat(chatId: String?, messageId: String?) { + val normalizedChatId = chatId?.takeIf { it.isNotBlank() } ?: run { + _pendingNavigation.value = null + return + } + _pendingNavigation.value = PendingPushNavigation( + chatId = normalizedChatId, + messageId = messageId?.takeIf { it.isNotBlank() } + ) + } + + fun setPendingChatId(chatId: String?) { + setPendingChat(chatId = chatId, messageId = null) + } + + fun clear(requestId: Long? = null) { + val current = _pendingNavigation.value ?: return + if (requestId == null || current.requestId == requestId) { + _pendingNavigation.value = null + } + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/InitialCallPermissionPromptStore.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/InitialCallPermissionPromptStore.kt new file mode 100644 index 00000000..2b33cf69 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/InitialCallPermissionPromptStore.kt @@ -0,0 +1,18 @@ +package com.seven.ikar.kotlin.core.push + +import android.content.Context + +class InitialCallPermissionPromptStore(context: Context) { + private val preferences = context.getSharedPreferences(PreferencesName, Context.MODE_PRIVATE) + + fun wasPrompted(): Boolean = preferences.getBoolean(WasPromptedKey, false) + + fun markPrompted() { + preferences.edit().putBoolean(WasPromptedKey, true).apply() + } + + private companion object { + const val PreferencesName = "ikar_kotlin_initial_call_permission_prompt" + const val WasPromptedKey = "wasPrompted" + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/NotificationActionReceiver.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/NotificationActionReceiver.kt new file mode 100644 index 00000000..d9284d68 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/NotificationActionReceiver.kt @@ -0,0 +1,95 @@ +package com.seven.ikar.kotlin.core.push + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import androidx.core.app.NotificationManagerCompat +import com.seven.ikar.kotlin.app.IkarNativeApp +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch + +class NotificationActionReceiver : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + val pendingResult = goAsync() + CoroutineScope(Dispatchers.IO).launch { + try { + handleIntent(context, intent) + } finally { + pendingResult.finish() + } + } + } + + private suspend fun handleIntent(context: Context, intent: Intent) { + val action = intent.action.orEmpty() + when (action) { + NotificationAction.MarkReadAction -> handleMarkRead(context, intent) + NotificationAction.AcceptIncomingCallAction -> handleAcceptIncomingCall(context, intent) + NotificationAction.DeclineIncomingCallAction -> handleDeclineIncomingCall(context, intent) + } + } + + private suspend fun handleMarkRead(context: Context, intent: Intent) { + val chatId = intent.getStringExtra(PushDataKeys.ChatId).orEmpty() + val messageId = intent.getStringExtra(PushDataKeys.MessageId).orEmpty() + val notificationId = intent.getIntExtra(NotificationAction.NotificationIdExtra, Int.MIN_VALUE) + if (chatId.isBlank() || messageId.isBlank()) { + return + } + + val app = context.applicationContext as? IkarNativeApp ?: return + runCatching { + app.container.executeAuthorized { session -> + app.container.apiClient.acknowledgeRead( + accessToken = session.accessToken, + chatId = chatId, + messageId = messageId + ) + } + }.onSuccess { + if (notificationId != Int.MIN_VALUE) { + NotificationManagerCompat.from(context).cancel(notificationId) + } + } + } + + private fun handleAcceptIncomingCall(context: Context, intent: Intent) { + val invite = pendingIncomingCallInviteFromIntent(intent) ?: return + val app = context.applicationContext as? IkarNativeApp ?: return + if (app.container.sessionStore.read() == null) { + return + } + + app.container.incomingCallInviteStore.clearByCallId(invite.callId) + IncomingCallNotificationManager.cancelIncomingCall(context, invite.callId) + IncomingCallNotificationManager.openIncomingCallScreen(context, invite, autoAccept = true) + } + + private fun handleDeclineIncomingCall(context: Context, intent: Intent) { + val invite = pendingIncomingCallInviteFromIntent(intent) ?: return + val app = context.applicationContext as? IkarNativeApp ?: return + if (app.container.sessionStore.read() == null) { + return + } + + app.container.incomingCallInviteStore.clearByCallId(invite.callId) + app.container.callManager.presentIncomingCallInvite( + callId = invite.callId, + chatId = invite.chatId, + callerId = invite.callerId, + callerDisplayName = invite.callerDisplayName, + callerPhoneNumber = invite.callerPhoneNumber, + mediaType = invite.mediaType + ) + IncomingCallNotificationManager.cancelIncomingCall(context, invite.callId) + app.container.callManager.declineCurrentCall() + } +} + +object NotificationAction { + const val MarkReadAction = "com.seven.ikar.kotlin.NOTIFICATION_MARK_READ" + const val AcceptIncomingCallAction = "com.seven.ikar.kotlin.NOTIFICATION_ACCEPT_INCOMING_CALL" + const val DeclineIncomingCallAction = "com.seven.ikar.kotlin.NOTIFICATION_DECLINE_INCOMING_CALL" + const val NotificationIdExtra = "notificationId" +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/NotificationPreferences.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/NotificationPreferences.kt new file mode 100644 index 00000000..8bb2c353 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/NotificationPreferences.kt @@ -0,0 +1,83 @@ +package com.seven.ikar.kotlin.core.push + +enum class NotificationSoundOption { + Default, + Ringtone, + Alarm, + Silent +} + +enum class NotificationRepeatIntervalOption(val minutes: Int) { + Off(0), + FifteenMinutes(15), + ThirtyMinutes(30), + OneHour(60), + TwoHours(120) +} + +data class NotificationSoundChoice( + val value: NotificationSoundOption, + val title: String +) + +data class NotificationRepeatIntervalChoice( + val value: NotificationRepeatIntervalOption, + val title: String +) + +data class NotificationSettingsSnapshot( + val notificationsEnabled: Boolean, + val messageSound: NotificationSoundOption, + val privateChatsEnabled: Boolean, + val groupsEnabled: Boolean, + val channelsEnabled: Boolean, + val storiesEnabled: Boolean, + val reactionsEnabled: Boolean, + val callVibrationEnabled: Boolean, + val callRingtone: NotificationSoundOption, + val showBadge: Boolean, + val includeMutedChatsInBadge: Boolean, + val countMessagesInBadge: Boolean, + val inAppSoundEnabled: Boolean, + val inAppVibrationEnabled: Boolean, + val inAppShowTextEnabled: Boolean, + val soundInActiveChatEnabled: Boolean, + val popupWindowsEnabled: Boolean, + val contactJoinedEnabled: Boolean, + val pinnedMessagesEnabled: Boolean, + val restartOnCloseEnabled: Boolean, + val backgroundConnectionEnabled: Boolean, + val repeatInterval: NotificationRepeatIntervalOption +) + +data class ChatNotificationSettingsSnapshot( + val notificationsEnabled: Boolean? = null, + val messageSound: NotificationSoundOption? = null, + val showMessagePreview: Boolean? = null, + val popupWindowsEnabled: Boolean? = null, + val soundInActiveChatEnabled: Boolean? = null +) + +object NotificationPreferenceCatalog { + val messageSoundChoices: List = listOf( + NotificationSoundChoice(NotificationSoundOption.Default, "По умолчанию"), + NotificationSoundChoice(NotificationSoundOption.Ringtone, "Рингтон"), + NotificationSoundChoice(NotificationSoundOption.Alarm, "Сигнал"), + NotificationSoundChoice(NotificationSoundOption.Silent, "Без звука") + ) + + val callRingtoneChoices: List = listOf( + NotificationSoundChoice(NotificationSoundOption.Default, "По умолчанию"), + NotificationSoundChoice(NotificationSoundOption.Ringtone, "Рингтон"), + NotificationSoundChoice(NotificationSoundOption.Alarm, "Сигнал"), + NotificationSoundChoice(NotificationSoundOption.Silent, "Без звука") + ) + + val repeatChoices: List = listOf( + NotificationRepeatIntervalChoice(NotificationRepeatIntervalOption.Off, "Выключен"), + NotificationRepeatIntervalChoice(NotificationRepeatIntervalOption.FifteenMinutes, "15 минут"), + NotificationRepeatIntervalChoice(NotificationRepeatIntervalOption.ThirtyMinutes, "30 минут"), + NotificationRepeatIntervalChoice(NotificationRepeatIntervalOption.OneHour, "1 час"), + NotificationRepeatIntervalChoice(NotificationRepeatIntervalOption.TwoHours, "2 часа") + ) +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/PushData.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/PushData.kt new file mode 100644 index 00000000..53de1934 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/PushData.kt @@ -0,0 +1,29 @@ +package com.seven.ikar.kotlin.core.push + +object PushDataKeys { + const val Kind = "kind" + const val CallId = "callId" + const val ChatId = "chatId" + const val ChatType = "chatType" + const val MessageId = "messageId" + const val Title = "title" + const val Body = "body" + const val SenderId = "senderId" + const val SenderName = "senderName" + const val SenderPhoneNumber = "senderPhoneNumber" + const val ReactionEmoji = "reactionEmoji" + const val CallAction = "callAction" + const val CallMediaType = "callMediaType" + const val VersionCode = "versionCode" + const val VersionName = "versionName" +} + +object PushDataKinds { + const val ChatMessage = "chat_message" + const val MessageReaction = "message_reaction" + const val AudioCallInvite = "audio_call_invite" + const val VideoCallInvite = "video_call_invite" + const val AudioCallEnded = "audio_call_ended" + const val VideoCallEnded = "video_call_ended" + const val AppUpdateAvailable = "app_update_available" +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/PushNotificationDisplayService.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/PushNotificationDisplayService.kt new file mode 100644 index 00000000..9b539118 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/PushNotificationDisplayService.kt @@ -0,0 +1,333 @@ +package com.seven.ikar.kotlin.core.push + +import android.Manifest +import android.app.PendingIntent +import android.content.Context +import android.content.Intent +import android.content.pm.PackageManager +import android.os.Build +import androidx.core.app.NotificationCompat +import androidx.core.app.NotificationManagerCompat +import androidx.core.content.ContextCompat +import com.seven.ikar.kotlin.MainActivity +import com.seven.ikar.kotlin.app.IkarNativeApp +import com.seven.ikar.kotlin.core.contacts.PhoneNumberNormalizer + +object PushNotificationDisplayService { + fun show(context: Context, data: Map) { + val settings = AndroidPushSettings(context) + if (!settings.areNotificationsEnabled()) { + return + } + if (!AndroidNotificationPermissionHelper.areNotificationsEnabled(context)) { + return + } + + AndroidPushBootstrapper.tryInitialize(context) + + val kind = data[PushDataKeys.Kind].orEmpty() + val app = context.applicationContext as? IkarNativeApp + when (kind) { + PushDataKinds.AudioCallInvite, + PushDataKinds.VideoCallInvite -> { + val invite = pendingIncomingCallInviteFromMap(data)?.withResolvedContactDisplayName(context) ?: return + if (app?.container?.sessionStore?.read() == null) { + return + } + + if (AndroidAppVisibilityState.isVisible()) { + app.container.callManager.presentIncomingCallInvite( + callId = invite.callId, + chatId = invite.chatId, + callerId = invite.callerId, + callerDisplayName = invite.callerDisplayName, + callerPhoneNumber = invite.callerPhoneNumber, + mediaType = invite.mediaType + ) + } else { + app.container.incomingCallInviteStore.setPending(invite) + IncomingCallNotificationManager.showIncomingCall(context, invite) + } + return + } + + PushDataKinds.AudioCallEnded, + PushDataKinds.VideoCallEnded -> { + val callId = endedCallIdFromMap(data) + app?.container?.incomingCallInviteStore?.clearByCallId(callId) + app?.container?.callManager?.dismissCallIfMatches(callId) + IncomingCallNotificationManager.cancelIncomingCall(context, callId) + return + } + } + + val isChatMessage = kind == PushDataKinds.ChatMessage + val isMessageReaction = kind == PushDataKinds.MessageReaction + val isChatNotification = isChatMessage || isMessageReaction + val chatId = data[PushDataKeys.ChatId].orEmpty() + val chatNotificationSettings = if (isChatNotification && chatId.isNotBlank()) { + settings.loadChatNotificationSnapshot(chatId) + } else { + null + } + if (isChatNotification && chatNotificationSettings?.notificationsEnabled == false) { + return + } + val hideMessagePreview = isChatNotification && + (app?.container?.privacyRuntimeSettings?.loadSnapshot()?.showMessagePreview == false || + chatNotificationSettings?.showMessagePreview == false) + val isAppVisible = AndroidAppVisibilityState.isVisible() + val isActiveChatVisible = isChatNotification && + isAppVisible && + chatId == AndroidActiveChatState.getActiveChatId() + + if (isActiveChatVisible) { + val soundInActiveChatEnabled = chatNotificationSettings?.soundInActiveChatEnabled + ?: settings.getSoundInActiveChatEnabled() + if (soundInActiveChatEnabled) { + val messageSound = chatNotificationSettings?.messageSound ?: settings.getMessageSound() + val activeChatSound = when (messageSound) { + NotificationSoundOption.Silent -> NotificationSoundOption.Silent + else -> NotificationSoundOption.Default + } + AndroidMessageNotificationSound.play( + context = context, + option = activeChatSound, + dedupeKey = data[PushDataKeys.MessageId] + ?: listOfNotNull( + data[PushDataKeys.ChatId], + data[PushDataKeys.Title], + data[PushDataKeys.Body] + ).joinToString(separator = "|").takeIf { it.isNotBlank() } + ) + } + return + } + + val popupWindowsEnabled = chatNotificationSettings?.popupWindowsEnabled ?: settings.getPopupWindowsEnabled() + if (isChatNotification && isAppVisible && !popupWindowsEnabled) { + return + } + + val senderContactDisplayName = if (isChatNotification) { + resolveContactDisplayName(context, data[PushDataKeys.SenderPhoneNumber]) + } else { + null + } + val fallbackTitle = data[PushDataKeys.Title].orEmpty().ifBlank { + when (kind) { + PushDataKinds.AppUpdateAvailable -> "Доступно обновление Икар" + PushDataKinds.AudioCallInvite -> "Входящий аудиозвонок" + PushDataKinds.VideoCallInvite -> "Входящий видеозвонок" + else -> "ИКАР" + } + } + + val chatType = data[PushDataKeys.ChatType].orEmpty() + val title = if (isChatNotification && chatType.equals(ChatTypeDirect, ignoreCase = true)) { + senderContactDisplayName ?: fallbackTitle + } else { + fallbackTitle + } + + val fallbackBody = data[PushDataKeys.Body].orEmpty().ifBlank { + when (kind) { + PushDataKinds.AppUpdateAvailable -> "Откройте приложение, чтобы установить обновление." + PushDataKinds.AudioCallInvite -> "Откройте приложение, чтобы ответить на звонок." + PushDataKinds.VideoCallInvite -> "Откройте приложение, чтобы ответить на звонок." + PushDataKinds.MessageReaction -> GenericNewReactionText + else -> "Новое сообщение" + } + } + val rawBody = if (isChatNotification && chatType.equals(ChatTypeGroup, ignoreCase = true)) { + prefixSenderName( + body = fallbackBody, + senderDisplayName = senderContactDisplayName ?: data[PushDataKeys.SenderName] + ) + } else { + fallbackBody + } + val showInAppText = chatNotificationSettings?.showMessagePreview ?: settings.getInAppShowTextEnabled() + val body = if (isChatNotification && isAppVisible && !showInAppText) { + if (isMessageReaction) GenericNewReactionText else GenericNewMessageText + } else { + rawBody + } + + val notificationTitle = if (hideMessagePreview) "Икар" else title + val notificationBody = if (hideMessagePreview) { + if (isMessageReaction) GenericNewReactionText else GenericNewMessageText + } else { + body + } + + val effectiveMessageSound = when { + !isChatNotification -> NotificationSoundOption.Default + isAppVisible && !settings.getInAppSoundEnabled() -> NotificationSoundOption.Silent + else -> chatNotificationSettings?.messageSound ?: settings.getMessageSound() + } + + val channelId = when (kind) { + PushDataKinds.AppUpdateAvailable -> AndroidPushBootstrapper.updatesChannelId() + PushDataKinds.AudioCallInvite, + PushDataKinds.VideoCallInvite -> AndroidPushBootstrapper.callsChannelId() + else -> AndroidPushBootstrapper.messageChannelId(effectiveMessageSound) + } + + val intent = Intent(context, MainActivity::class.java).apply { + addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP or Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK) + data.forEach { (key, value) -> putExtra(key, value) } + } + + val notificationId = ((if (isMessageReaction) "reaction:${data[PushDataKeys.MessageId].orEmpty()}" else data[PushDataKeys.MessageId]) + ?: data[PushDataKeys.CallId] + ?: data[PushDataKeys.VersionCode] + ?: System.currentTimeMillis().toString()).hashCode() + + val flags = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE + } else { + PendingIntent.FLAG_UPDATE_CURRENT + } + + val pendingIntent = PendingIntent.getActivity(context, notificationId, intent, flags) + val replyPendingIntent = PendingIntent.getActivity( + context, + notificationId + 1, + intent, + flags + ) + val markReadPendingIntent = PendingIntent.getBroadcast( + context, + notificationId + 2, + Intent(context, NotificationActionReceiver::class.java).apply { + action = NotificationAction.MarkReadAction + putExtra(PushDataKeys.ChatId, data[PushDataKeys.ChatId]) + putExtra(PushDataKeys.MessageId, data[PushDataKeys.MessageId]) + putExtra(NotificationAction.NotificationIdExtra, notificationId) + }, + flags + ) + val priority = when (kind) { + PushDataKinds.AudioCallInvite, + PushDataKinds.VideoCallInvite, + PushDataKinds.AppUpdateAvailable -> NotificationCompat.PRIORITY_HIGH + else -> NotificationCompat.PRIORITY_HIGH + } + + val category = when (kind) { + PushDataKinds.AudioCallInvite, + PushDataKinds.VideoCallInvite -> NotificationCompat.CATEGORY_CALL + else -> NotificationCompat.CATEGORY_MESSAGE + } + + val notificationBuilder = NotificationCompat.Builder(context, channelId) + .setSmallIcon(android.R.drawable.sym_def_app_icon) + .setContentTitle(notificationTitle) + .setContentText(notificationBody) + .setStyle(NotificationCompat.BigTextStyle().bigText(notificationBody)) + .setContentIntent(pendingIntent) + .setAutoCancel(true) + .setPriority(priority) + .setCategory(category) + + if (hideMessagePreview) { + val publicNotificationBody = if (isMessageReaction) GenericNewReactionText else GenericNewMessageText + val publicVersion = NotificationCompat.Builder(context, channelId) + .setSmallIcon(android.R.drawable.sym_def_app_icon) + .setContentTitle("Икар") + .setContentText(publicNotificationBody) + .setPriority(priority) + .setCategory(category) + .build() + notificationBuilder + .setVisibility(NotificationCompat.VISIBILITY_PRIVATE) + .setPublicVersion(publicVersion) + } + + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { + val soundUri = AndroidMessageNotificationSound.resolveUri(effectiveMessageSound) + if (soundUri != null) { + notificationBuilder.setSound(soundUri) + } else { + notificationBuilder.setSilent(true) + } + } else if (effectiveMessageSound == NotificationSoundOption.Silent) { + notificationBuilder.setSilent(true) + } + + if (isChatMessage && + !data[PushDataKeys.ChatId].isNullOrBlank() && + !data[PushDataKeys.MessageId].isNullOrBlank() + ) { + notificationBuilder + .addAction(android.R.drawable.ic_menu_send, "Ответить", replyPendingIntent) + .addAction(android.R.drawable.ic_menu_view, "Отметить как прочитанное", markReadPendingIntent) + } + + NotificationManagerCompat.from(context).notify(notificationId, notificationBuilder.build()) + } + + private const val GenericNewMessageText = "\u041d\u043e\u0432\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435" + private const val GenericNewReactionText = "\u041d\u043e\u0432\u0430\u044f \u0440\u0435\u0430\u043a\u0446\u0438\u044f" + private const val ChatTypeDirect = "Direct" + private const val ChatTypeGroup = "Group" + private const val ContactNameCacheTtlMillis = 5 * 60 * 1000L + private val contactNameCacheLock = Any() + + @Volatile + private var contactNameCache: ContactNameCache? = null + + private fun PendingIncomingCallInvite.withResolvedContactDisplayName(context: Context): PendingIncomingCallInvite { + val contactName = resolveContactDisplayName(context, callerPhoneNumber) ?: return this + return copy(callerDisplayName = contactName) + } + + private fun resolveContactDisplayName(context: Context, phoneNumber: String?): String? { + val normalizedPhoneNumber = PhoneNumberNormalizer.normalize(phoneNumber) ?: return null + return loadContactNamesByPhone(context)[normalizedPhoneNumber]?.takeIf { it.isNotBlank() } + } + + private fun loadContactNamesByPhone(context: Context): Map { + if (!hasContactsPermission(context)) { + return emptyMap() + } + + val now = System.currentTimeMillis() + contactNameCache + ?.takeIf { now - it.loadedAtMillis < ContactNameCacheTtlMillis } + ?.let { return it.namesByPhone } + + return synchronized(contactNameCacheLock) { + contactNameCache + ?.takeIf { now - it.loadedAtMillis < ContactNameCacheTtlMillis } + ?.let { return@synchronized it.namesByPhone } + + val app = context.applicationContext as? IkarNativeApp ?: return@synchronized emptyMap() + val namesByPhone = runCatching { + app.container.contactDiscoveryService + .getContacts() + .associate { contact -> contact.normalizedPhoneNumber to contact.displayName } + }.getOrDefault(emptyMap()) + + contactNameCache = ContactNameCache(now, namesByPhone) + namesByPhone + } + } + + private fun hasContactsPermission(context: Context): Boolean = + ContextCompat.checkSelfPermission( + context, + Manifest.permission.READ_CONTACTS + ) == PackageManager.PERMISSION_GRANTED + + private fun prefixSenderName(body: String, senderDisplayName: String?): String { + val name = senderDisplayName?.trim().takeUnless { it.isNullOrBlank() } ?: return body + return if (body.startsWith("$name:")) body else "$name: $body" + } + + private data class ContactNameCache( + val loadedAtMillis: Long, + val namesByPhone: Map + ) +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/PushRegistrationManager.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/PushRegistrationManager.kt new file mode 100644 index 00000000..d23159d9 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/PushRegistrationManager.kt @@ -0,0 +1,82 @@ +package com.seven.ikar.kotlin.core.push + +import android.content.Context +import android.os.Build +import com.seven.ikar.kotlin.core.model.PushPlatform +import com.seven.ikar.kotlin.core.model.RegisterPushDeviceRequest +import com.seven.ikar.kotlin.core.network.ApiClient +import com.seven.ikar.kotlin.core.session.AuthorizedSessionManager +import com.seven.ikar.kotlin.core.session.SessionStore +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext + +class PushRegistrationManager( + private val context: Context, + private val apiClient: ApiClient, + private val sessionStore: SessionStore, + private val authorizedSessionManager: AuthorizedSessionManager, + private val settings: AndroidPushSettings +) { + suspend fun initializeAsync() = withContext(Dispatchers.IO) { + AndroidPushBootstrapper.tryInitialize(context) + } + + suspend fun registerCurrentDeviceAsync() = withContext(Dispatchers.IO) { + if (!AndroidPushBootstrapper.tryInitialize(context)) { + return@withContext + } + + val token = settings.getDeviceToken().takeUnless { it.isNullOrBlank() } + ?: FirebaseTokenProvider.tryGetToken(context) + ?: return@withContext + + settings.setDeviceToken(token) + + val request = RegisterPushDeviceRequest( + platform = PushPlatform.Android, + installationId = settings.getInstallationId(), + deviceToken = token, + deviceName = buildDeviceName(), + notificationsEnabled = settings.areNotificationsEnabled() && + AndroidNotificationPermissionHelper.areNotificationsEnabled(context) + ) + + if (sessionStore.read() == null) { + return@withContext + } + + authorizedSessionManager.executeAuthorized { session -> + apiClient.registerPushDevice( + accessToken = session.accessToken, + request = request + ) + } + } + + suspend fun unregisterCurrentDeviceAsync() = withContext(Dispatchers.IO) { + if (sessionStore.read() == null) { + return@withContext + } + + authorizedSessionManager.executeAuthorized { session -> + apiClient.unregisterPushDevice( + accessToken = session.accessToken, + installationId = settings.getInstallationId() + ) + } + } + + suspend fun onTokenRefreshedAsync(token: String) = withContext(Dispatchers.IO) { + if (token.isBlank()) { + return@withContext + } + + settings.setDeviceToken(token) + if (sessionStore.read() != null) { + runCatching { registerCurrentDeviceAsync() } + } + } + + private fun buildDeviceName(): String = + "${Build.MANUFACTURER ?: "Android"} ${Build.MODEL ?: "device"}".trim() +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/realtime/RealtimeDtos.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/realtime/RealtimeDtos.kt new file mode 100644 index 00000000..7697e86a --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/realtime/RealtimeDtos.kt @@ -0,0 +1,332 @@ +package com.seven.ikar.kotlin.core.realtime + +import com.seven.ikar.kotlin.core.model.AndroidAppReleaseDto +import com.seven.ikar.kotlin.core.model.AttachmentDto +import com.seven.ikar.kotlin.core.model.AttachmentKind +import com.seven.ikar.kotlin.core.model.ChatSummaryDto +import com.seven.ikar.kotlin.core.model.ChatType +import com.seven.ikar.kotlin.core.model.CallAnswerDto +import com.seven.ikar.kotlin.core.model.CallConnectedDto +import com.seven.ikar.kotlin.core.model.CallEndedDto +import com.seven.ikar.kotlin.core.model.CallIceCandidateDto +import com.seven.ikar.kotlin.core.model.CallIceServerDto +import com.seven.ikar.kotlin.core.model.CallMediaType +import com.seven.ikar.kotlin.core.model.CallOfferDto +import com.seven.ikar.kotlin.core.model.IncomingCallDto +import com.seven.ikar.kotlin.core.model.MessageDeliveryState +import com.seven.ikar.kotlin.core.model.MessageDto +import com.seven.ikar.kotlin.core.model.MessageReactionDto +import com.seven.ikar.kotlin.core.model.MessageReplyDto +import com.seven.ikar.kotlin.core.model.OutgoingCallDto +import com.seven.ikar.kotlin.core.model.UserSummaryDto + +data class RealtimeUserSummaryDto( + val id: String, + val username: String, + val displayName: String, + val isOnline: Boolean, + val phoneNumber: String? = null, + val lastSeenAt: String? = null, + val about: String? = null, + val avatarPath: String? = null, + val isBot: Boolean = false +) + +data class RealtimeAttachmentDto( + val id: String, + val fileName: String, + val contentType: String, + val fileSizeBytes: Long, + val downloadPath: String, + val kind: Int, + val sortOrder: Int = 0 +) + +data class RealtimeMessageDto( + val id: String, + val chatId: String, + val chatType: Int, + val sender: RealtimeUserSummaryDto, + val text: String, + val attachments: List = emptyList(), + val sentAt: String, + val editedAt: String? = null, + val deletedAt: String? = null, + val deliveryState: Int, + val forwardedFromDisplayName: String? = null, + val replyTo: RealtimeMessageReplyDto? = null, + val pinnedAt: String? = null, + val pinnedBy: RealtimeUserSummaryDto? = null, + val mediaAlbumId: String? = null, + val reactions: List = emptyList(), + val hasProtectedContent: Boolean = false, + val expiresAt: String? = null, + val ttlSeconds: Int? = null, + val postedAsChannel: Boolean = false, + val displayAuthorName: String? = null, + val viewCount: Int? = null +) + +data class RealtimeMessageReplyDto( + val messageId: String, + val senderId: String, + val senderDisplayName: String, + val previewText: String +) + +data class RealtimeMessageReactionDto( + val emoji: String, + val count: Int, + val isMine: Boolean +) + +data class RealtimeChatSummaryDto( + val id: String, + val title: String, + val type: Int, + val secondaryText: String? = null, + val lastActivityAt: String? = null, + val lastMessagePreview: String? = null, + val participants: List = emptyList(), + val canSendMessages: Boolean = true, + val unreadCount: Int = 0, + val isPinned: Boolean = false, + val isArchived: Boolean = false, + val isMuted: Boolean = false, + val folderKey: String? = null, + val hasProtectedContent: Boolean = false, + val defaultMessageTtlSeconds: Int? = null, + val lastMessageAttachment: RealtimeAttachmentDto? = null, + val subscriberCount: Int = 0, + val adminCount: Int = 0, + val isSubscribed: Boolean = false, + val canSubscribe: Boolean = false, + val canManageChannel: Boolean = false, + val canPostAsChannel: Boolean = false, + val publicUsername: String? = null, + val linkedDiscussionChatId: String? = null, + val channelSignaturesEnabled: Boolean = false +) + +data class RealtimeOutgoingCallDto( + val callId: String, + val chatId: String, + val peer: RealtimeUserSummaryDto, + val mediaType: Int +) + +data class RealtimeIncomingCallDto( + val callId: String, + val chatId: String, + val caller: RealtimeUserSummaryDto, + val mediaType: Int +) + +data class RealtimeCallConnectedDto( + val callId: String, + val chatId: String, + val connectedAt: String, + val mediaType: Int, + val iceServers: List = emptyList(), + val shouldCreateOffer: Boolean = false +) + +data class RealtimeCallEndedDto( + val callId: String, + val chatId: String, + val reason: String, + val mediaType: Int +) + +data class RealtimeCallIceServerDto( + val urls: List, + val username: String? = null, + val credential: String? = null +) + +data class RealtimeCallOfferDto( + val callId: String, + val type: String, + val sdp: String +) + +data class RealtimeCallAnswerDto( + val callId: String, + val type: String, + val sdp: String +) + +data class RealtimeCallIceCandidateDto( + val callId: String, + val candidate: String, + val sdpMid: String? = null, + val sdpMLineIndex: Int +) + +fun RealtimeUserSummaryDto.toCore(): UserSummaryDto = UserSummaryDto( + id = id, + username = username, + displayName = displayName, + isOnline = isOnline, + phoneNumber = phoneNumber, + lastSeenAt = lastSeenAt, + about = about, + avatarPath = avatarPath, + isBot = isBot +) + +fun RealtimeAttachmentDto.toCore(): AttachmentDto = AttachmentDto( + id = id, + fileName = fileName, + contentType = contentType, + fileSizeBytes = fileSizeBytes, + downloadPath = downloadPath, + kind = AttachmentKind.fromWireValue(kind), + sortOrder = sortOrder +) + +fun RealtimeMessageDto.toCore(): MessageDto = MessageDto( + id = id, + chatId = chatId, + chatType = ChatType.fromWireValue(chatType), + sender = sender.toCore(), + text = text, + attachments = attachments.map { it.toCore() }, + sentAt = sentAt, + editedAt = editedAt, + deletedAt = deletedAt, + deliveryState = MessageDeliveryState.fromWireValue(deliveryState), + forwardedFromDisplayName = forwardedFromDisplayName, + replyTo = replyTo?.toCore(), + pinnedAt = pinnedAt, + pinnedBy = pinnedBy?.toCore(), + mediaAlbumId = mediaAlbumId, + reactions = reactions.map { it.toCore() }, + hasProtectedContent = hasProtectedContent, + expiresAt = expiresAt, + ttlSeconds = ttlSeconds, + postedAsChannel = postedAsChannel, + displayAuthorName = displayAuthorName, + viewCount = viewCount +) + +fun RealtimeMessageReplyDto.toCore(): MessageReplyDto = MessageReplyDto( + messageId = messageId, + senderId = senderId, + senderDisplayName = senderDisplayName, + previewText = previewText +) + +fun RealtimeMessageReactionDto.toCore(): MessageReactionDto = MessageReactionDto( + emoji = emoji, + count = count, + isMine = isMine +) + +fun RealtimeChatSummaryDto.toCore(): ChatSummaryDto = ChatSummaryDto( + id = id, + title = title, + type = ChatType.fromWireValue(type), + secondaryText = secondaryText, + lastActivityAt = lastActivityAt, + lastMessagePreview = lastMessagePreview, + participants = participants.map { it.toCore() }, + canSendMessages = canSendMessages, + unreadCount = unreadCount, + isPinned = isPinned, + isArchived = isArchived, + isMuted = isMuted, + folderKey = folderKey, + hasProtectedContent = hasProtectedContent, + defaultMessageTtlSeconds = defaultMessageTtlSeconds, + lastMessageAttachment = lastMessageAttachment?.toCore(), + subscriberCount = subscriberCount, + adminCount = adminCount, + isSubscribed = isSubscribed, + canSubscribe = canSubscribe, + canManageChannel = canManageChannel, + canPostAsChannel = canPostAsChannel, + publicUsername = publicUsername, + linkedDiscussionChatId = linkedDiscussionChatId, + channelSignaturesEnabled = channelSignaturesEnabled +) + +fun RealtimeOutgoingCallDto.toCore(): OutgoingCallDto = OutgoingCallDto( + callId = callId, + chatId = chatId, + peer = peer.toCore(), + mediaType = CallMediaType.fromWireValue(mediaType) +) + +fun RealtimeIncomingCallDto.toCore(): IncomingCallDto = IncomingCallDto( + callId = callId, + chatId = chatId, + caller = caller.toCore(), + mediaType = CallMediaType.fromWireValue(mediaType) +) + +fun RealtimeCallConnectedDto.toCore(): CallConnectedDto = CallConnectedDto( + callId = callId, + chatId = chatId, + connectedAt = connectedAt, + mediaType = CallMediaType.fromWireValue(mediaType), + iceServers = iceServers.map { it.toCore() }, + shouldCreateOffer = shouldCreateOffer +) + +fun RealtimeCallEndedDto.toCore(): CallEndedDto = CallEndedDto( + callId = callId, + chatId = chatId, + reason = reason, + mediaType = CallMediaType.fromWireValue(mediaType) +) + +fun RealtimeCallIceServerDto.toCore(): CallIceServerDto = CallIceServerDto( + urls = urls, + username = username, + credential = credential +) + +fun CallIceServerDto.toRealtime(): RealtimeCallIceServerDto = RealtimeCallIceServerDto( + urls = urls, + username = username, + credential = credential +) + +fun RealtimeCallOfferDto.toCore(): CallOfferDto = CallOfferDto( + callId = callId, + type = type, + sdp = sdp +) + +fun CallOfferDto.toRealtime(): RealtimeCallOfferDto = RealtimeCallOfferDto( + callId = callId, + type = type, + sdp = sdp +) + +fun RealtimeCallAnswerDto.toCore(): CallAnswerDto = CallAnswerDto( + callId = callId, + type = type, + sdp = sdp +) + +fun CallAnswerDto.toRealtime(): RealtimeCallAnswerDto = RealtimeCallAnswerDto( + callId = callId, + type = type, + sdp = sdp +) + +fun RealtimeCallIceCandidateDto.toCore(): CallIceCandidateDto = CallIceCandidateDto( + callId = callId, + candidate = candidate, + sdpMid = sdpMid, + sdpMLineIndex = sdpMLineIndex +) + +fun CallIceCandidateDto.toRealtime(): RealtimeCallIceCandidateDto = RealtimeCallIceCandidateDto( + callId = callId, + candidate = candidate, + sdpMid = sdpMid, + sdpMLineIndex = sdpMLineIndex +) diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/realtime/RealtimeService.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/realtime/RealtimeService.kt new file mode 100644 index 00000000..ca13e58b --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/realtime/RealtimeService.kt @@ -0,0 +1,297 @@ +package com.seven.ikar.kotlin.core.realtime + +import com.microsoft.signalr.HubConnection +import com.microsoft.signalr.HubConnectionBuilder +import com.seven.ikar.kotlin.core.model.AndroidAppReleaseDto +import com.seven.ikar.kotlin.core.model.CallAnswerDto +import com.seven.ikar.kotlin.core.model.CallConnectedDto +import com.seven.ikar.kotlin.core.model.CallEndedDto +import com.seven.ikar.kotlin.core.model.CallIceCandidateDto +import com.seven.ikar.kotlin.core.model.CallMediaType +import com.seven.ikar.kotlin.core.model.CallOfferDto +import com.seven.ikar.kotlin.core.model.ChatSummaryDto +import com.seven.ikar.kotlin.core.model.IncomingCallDto +import com.seven.ikar.kotlin.core.model.MessageDto +import com.seven.ikar.kotlin.core.model.OutgoingCallDto +import com.seven.ikar.kotlin.core.model.TypingIndicatorDto +import com.seven.ikar.kotlin.core.network.ClientVersionProvider +import com.seven.ikar.kotlin.core.network.ServerConfig +import io.reactivex.rxjava3.core.Single +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.SharedFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.launch +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock +import java.net.URLEncoder +import java.nio.charset.StandardCharsets + +enum class RealtimeConnectionStage { + Disconnected, + Connecting, + Connected, + Reconnecting +} + +class RealtimeService( + private val clientVersionProvider: ClientVersionProvider +) { + private val scope = CoroutineScope(SupervisorJob() + Dispatchers.IO) + private val mutex = Mutex() + private var connection: HubConnection? = null + private var accessToken: String? = null + private var reconnectJob: Job? = null + + private val _stage = MutableStateFlow(RealtimeConnectionStage.Disconnected) + val stage: StateFlow = _stage + + private val _messagesCreated = MutableSharedFlow(extraBufferCapacity = 32) + val messagesCreated: SharedFlow = _messagesCreated + + private val _messagesUpdated = MutableSharedFlow(extraBufferCapacity = 32) + val messagesUpdated: SharedFlow = _messagesUpdated + + private val _typingChanged = MutableSharedFlow(extraBufferCapacity = 64) + val typingChanged: SharedFlow = _typingChanged + + private val _chatCreated = MutableSharedFlow(extraBufferCapacity = 16) + val chatCreated: SharedFlow = _chatCreated + + private val _chatsChanged = MutableSharedFlow(extraBufferCapacity = 8) + val chatsChanged: SharedFlow = _chatsChanged + + private val _appUpdateAvailable = MutableSharedFlow(extraBufferCapacity = 8) + val appUpdateAvailable: SharedFlow = _appUpdateAvailable + + private val _incomingCall = MutableSharedFlow(extraBufferCapacity = 8) + val incomingCall: SharedFlow = _incomingCall + + private val _callConnected = MutableSharedFlow(extraBufferCapacity = 8) + val callConnected: SharedFlow = _callConnected + + private val _callEnded = MutableSharedFlow(extraBufferCapacity = 8) + val callEnded: SharedFlow = _callEnded + + private val _callOffer = MutableSharedFlow(extraBufferCapacity = 16) + val callOffer: SharedFlow = _callOffer + + private val _callAnswer = MutableSharedFlow(extraBufferCapacity = 16) + val callAnswer: SharedFlow = _callAnswer + + private val _callIceCandidate = MutableSharedFlow(extraBufferCapacity = 32) + val callIceCandidate: SharedFlow = _callIceCandidate + + fun connect(accessToken: String) { + this.accessToken = accessToken + scope.launch { + ensureConnected() + } + } + + suspend fun ensureConnected(accessToken: String) { + this.accessToken = accessToken + ensureConnected() + check(_stage.value == RealtimeConnectionStage.Connected) { + "Realtime hub is not connected." + } + } + + fun disconnect() { + scope.launch { + mutex.withLock { + accessToken = null + reconnectJob?.cancel() + reconnectJob = null + connection?.stop()?.blockingAwait() + connection = null + _stage.value = RealtimeConnectionStage.Disconnected + } + } + } + + fun startCall(chatId: String, mediaType: CallMediaType): OutgoingCallDto { + val activeConnection = requireConnectedConnection() + return if (mediaType == CallMediaType.Audio) { + activeConnection.invoke(RealtimeOutgoingCallDto::class.java, "StartCall", chatId).blockingGet().toCore() + } else { + activeConnection.invoke(RealtimeOutgoingCallDto::class.java, "StartMediaCall", chatId, mediaType.wireValue).blockingGet().toCore() + } + } + + fun acceptCall(callId: String) { + requireConnectedConnection().invoke("AcceptCall", callId).blockingAwait() + } + + fun declineCall(callId: String) { + requireConnectedConnection().invoke("DeclineCall", callId).blockingAwait() + } + + fun endCall(callId: String) { + requireConnectedConnection().invoke("EndCall", callId).blockingAwait() + } + + fun sendCallOffer(payload: CallOfferDto) { + requireConnectedConnection().send("SendCallOffer", payload.toRealtime()) + } + + fun sendCallAnswer(payload: CallAnswerDto) { + requireConnectedConnection().send("SendCallAnswer", payload.toRealtime()) + } + + fun sendCallIceCandidate(payload: CallIceCandidateDto) { + requireConnectedConnection().send("SendCallIceCandidate", payload.toRealtime()) + } + + fun sendTyping(chatId: String, isTyping: Boolean) { + requireConnectedConnection().send("SendTyping", chatId, isTyping) + } + + private suspend fun ensureConnected() { + mutex.withLock { + val current = connection + if (current != null && current.connectionState == com.microsoft.signalr.HubConnectionState.CONNECTED) { + return + } + + if (accessToken.isNullOrBlank()) { + _stage.value = RealtimeConnectionStage.Disconnected + return + } + + _stage.value = if (current == null) { + RealtimeConnectionStage.Connecting + } else { + RealtimeConnectionStage.Reconnecting + } + + val newConnection = buildConnection(accessToken!!) + connection = newConnection + runCatching { + newConnection.start().blockingAwait() + }.onSuccess { + _stage.value = RealtimeConnectionStage.Connected + }.onFailure { + if (connection == newConnection) { + connection = null + } + runCatching { newConnection.stop().blockingAwait() } + _stage.value = RealtimeConnectionStage.Disconnected + scheduleReconnect() + } + } + } + + private fun buildConnection(accessToken: String): HubConnection { + val hubUrl = buildHubUrl() + val hub = HubConnectionBuilder.create(hubUrl) + .withAccessTokenProvider(Single.defer { Single.just(accessToken) }) + .withHeader("X-Ikar-Client-Platform", clientVersionProvider.platform) + .withHeader("X-Ikar-Client-Version-Code", clientVersionProvider.versionCode) + .withHeader("X-Ikar-Client-Version-Name", clientVersionProvider.versionName) + .build() + + hub.on("MessageCreated", { payload: RealtimeMessageDto -> + scope.launch { _messagesCreated.emit(payload.toCore()) } + }, RealtimeMessageDto::class.java) + + hub.on("MessageUpdated", { payload: RealtimeMessageDto -> + scope.launch { _messagesUpdated.emit(payload.toCore()) } + }, RealtimeMessageDto::class.java) + + hub.on("TypingChanged", { payload: TypingIndicatorDto -> + scope.launch { _typingChanged.emit(payload) } + }, TypingIndicatorDto::class.java) + + hub.on("ChatCreated", { payload: RealtimeChatSummaryDto -> + scope.launch { _chatCreated.emit(payload.toCore()) } + }, RealtimeChatSummaryDto::class.java) + + hub.on("ChatsChanged", { + scope.launch { _chatsChanged.emit(Unit) } + }) + + hub.on("AppUpdateAvailable", { payload: AndroidAppReleaseDto -> + scope.launch { _appUpdateAvailable.emit(payload) } + }, AndroidAppReleaseDto::class.java) + + hub.on("IncomingCall", { payload: RealtimeIncomingCallDto -> + scope.launch { _incomingCall.emit(payload.toCore()) } + }, RealtimeIncomingCallDto::class.java) + + hub.on("CallConnected", { payload: RealtimeCallConnectedDto -> + scope.launch { _callConnected.emit(payload.toCore()) } + }, RealtimeCallConnectedDto::class.java) + + hub.on("CallEnded", { payload: RealtimeCallEndedDto -> + scope.launch { _callEnded.emit(payload.toCore()) } + }, RealtimeCallEndedDto::class.java) + + hub.on("CallOffer", { payload: RealtimeCallOfferDto -> + scope.launch { _callOffer.emit(payload.toCore()) } + }, RealtimeCallOfferDto::class.java) + + hub.on("CallAnswer", { payload: RealtimeCallAnswerDto -> + scope.launch { _callAnswer.emit(payload.toCore()) } + }, RealtimeCallAnswerDto::class.java) + + hub.on("CallIceCandidate", { payload: RealtimeCallIceCandidateDto -> + scope.launch { _callIceCandidate.emit(payload.toCore()) } + }, RealtimeCallIceCandidateDto::class.java) + + hub.onClosed { + _stage.value = RealtimeConnectionStage.Disconnected + if (!accessToken.isNullOrBlank()) { + scheduleReconnect() + } + } + + return hub + } + + private fun scheduleReconnect() { + if (accessToken.isNullOrBlank()) { + return + } + + if (reconnectJob?.isActive == true) { + return + } + + reconnectJob = scope.launch { + while (accessToken != null) { + delay(5_000) + ensureConnected() + if (_stage.value == RealtimeConnectionStage.Connected) { + return@launch + } + } + } + } + + private fun buildHubUrl(): String { + val query = listOf( + "clientPlatform=${encode(clientVersionProvider.platform)}", + "clientVersionCode=${encode(clientVersionProvider.versionCode)}", + "clientVersionName=${encode(clientVersionProvider.versionName)}" + ).joinToString("&") + return "${ServerConfig.absoluteMessengerUrl(ServerConfig.HubPath)}?$query" + } + + private fun encode(value: String): String = + URLEncoder.encode(value, StandardCharsets.UTF_8.toString()) + + private fun requireConnectedConnection(): HubConnection { + val activeConnection = connection + check(activeConnection != null && activeConnection.connectionState == com.microsoft.signalr.HubConnectionState.CONNECTED) { + "Realtime hub is not connected." + } + + return activeConnection + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/session/AuthorizedSessionManager.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/session/AuthorizedSessionManager.kt new file mode 100644 index 00000000..304fd3f8 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/session/AuthorizedSessionManager.kt @@ -0,0 +1,40 @@ +package com.seven.ikar.kotlin.core.session + +import com.seven.ikar.kotlin.core.model.AuthSessionDto +import com.seven.ikar.kotlin.core.network.ApiClient +import com.seven.ikar.kotlin.core.network.ApiException +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock + +class AuthorizedSessionManager( + private val apiClient: ApiClient, + private val sessionStore: SessionStore +) { + private val refreshMutex = Mutex() + + suspend fun executeAuthorized(block: suspend (AuthSessionDto) -> T): T { + val session = sessionStore.read() ?: throw IllegalStateException("Сессия не найдена.") + return try { + block(session) + } catch (error: ApiException) { + if (error.statusCode != 401) { + throw error + } + + val refreshedSession = refreshSessionAfterUnauthorized(session) + block(refreshedSession) + } + } + + suspend fun refreshSessionAfterUnauthorized(failedSession: AuthSessionDto): AuthSessionDto = + refreshMutex.withLock { + val currentSession = sessionStore.read() ?: throw IllegalStateException("Сессия не найдена.") + if (currentSession.refreshToken != failedSession.refreshToken) { + return@withLock currentSession + } + + val refreshedSession = apiClient.refreshSession(failedSession.refreshToken) + sessionStore.save(refreshedSession) + refreshedSession + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/session/SessionStore.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/session/SessionStore.kt new file mode 100644 index 00000000..37d207fc --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/session/SessionStore.kt @@ -0,0 +1,30 @@ +package com.seven.ikar.kotlin.core.session + +import android.content.Context +import android.content.SharedPreferences +import com.seven.ikar.kotlin.core.model.AuthSessionDto +import kotlinx.serialization.json.Json + +class SessionStore(context: Context, private val json: Json) { + private val preferences: SharedPreferences = + context.getSharedPreferences("ikar_kotlin_session", Context.MODE_PRIVATE) + + fun read(): AuthSessionDto? { + val raw = preferences.getString(KEY_SESSION, null) ?: return null + return runCatching { json.decodeFromString(raw) }.getOrNull() + } + + fun save(session: AuthSessionDto) { + preferences.edit() + .putString(KEY_SESSION, json.encodeToString(AuthSessionDto.serializer(), session)) + .apply() + } + + fun clear() { + preferences.edit().remove(KEY_SESSION).apply() + } + + companion object { + private const val KEY_SESSION = "session" + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/settings/AndroidAppSettings.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/settings/AndroidAppSettings.kt new file mode 100644 index 00000000..aed81640 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/settings/AndroidAppSettings.kt @@ -0,0 +1,140 @@ +package com.seven.ikar.kotlin.core.settings + +import android.content.Context +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow + +enum class AppThemeMode { + System, + Light, + Dark, + Auto +} + +enum class AppLanguageMode { + System, + Russian, + English +} + +enum class AppProxyType { + Socks5, + MtProto, + Http +} + +data class AppSettingsSnapshot( + val autoDownloadPhotos: Boolean = true, + val autoDownloadVideosOnWifi: Boolean = false, + val autoDownloadFilesOnWifi: Boolean = false, + val saveMediaToGallery: Boolean = false, + val lowDataCalls: Boolean = false, + val keepMediaDays: Int = 30, + val maxCacheMb: Int = 512, + val themeMode: AppThemeMode = AppThemeMode.System, + val accentColorName: String = "Telegram Blue", + val animatedBackgrounds: Boolean = true, + val largeEmoji: Boolean = true, + val languageMode: AppLanguageMode = AppLanguageMode.System, + val proxyEnabled: Boolean = false, + val proxyType: AppProxyType = AppProxyType.Socks5, + val proxyHost: String = "", + val proxyPort: Int = 1080, + val proxySecret: String = "" +) + +class AndroidAppSettings(context: Context) { + private val preferences = context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_PRIVATE) + private val _snapshot = MutableStateFlow(loadSnapshot()) + val snapshot: StateFlow = _snapshot.asStateFlow() + + fun loadSnapshot(): AppSettingsSnapshot = + AppSettingsSnapshot( + autoDownloadPhotos = preferences.getBoolean(KEY_AUTO_DOWNLOAD_PHOTOS, true), + autoDownloadVideosOnWifi = preferences.getBoolean(KEY_AUTO_DOWNLOAD_VIDEOS_ON_WIFI, false), + autoDownloadFilesOnWifi = preferences.getBoolean(KEY_AUTO_DOWNLOAD_FILES_ON_WIFI, false), + saveMediaToGallery = preferences.getBoolean(KEY_SAVE_MEDIA_TO_GALLERY, false), + lowDataCalls = preferences.getBoolean(KEY_LOW_DATA_CALLS, false), + keepMediaDays = preferences.getInt(KEY_KEEP_MEDIA_DAYS, 30).coerceIn(1, 365), + maxCacheMb = preferences.getInt(KEY_MAX_CACHE_MB, 512).coerceIn(64, 8192), + themeMode = getEnum(KEY_THEME_MODE, AppThemeMode.System), + accentColorName = preferences.getString(KEY_ACCENT_COLOR_NAME, "Telegram Blue").orEmpty() + .ifBlank { "Telegram Blue" }, + animatedBackgrounds = preferences.getBoolean(KEY_ANIMATED_BACKGROUNDS, true), + largeEmoji = preferences.getBoolean(KEY_LARGE_EMOJI, true), + languageMode = getEnum(KEY_LANGUAGE_MODE, AppLanguageMode.System), + proxyEnabled = preferences.getBoolean(KEY_PROXY_ENABLED, false), + proxyType = getEnum(KEY_PROXY_TYPE, AppProxyType.Socks5), + proxyHost = preferences.getString(KEY_PROXY_HOST, "").orEmpty(), + proxyPort = preferences.getInt(KEY_PROXY_PORT, 1080).coerceIn(1, 65_535), + proxySecret = preferences.getString(KEY_PROXY_SECRET, "").orEmpty() + ) + + fun update(transform: (AppSettingsSnapshot) -> AppSettingsSnapshot) { + saveSnapshot(transform(_snapshot.value)) + } + + fun saveSnapshot(snapshot: AppSettingsSnapshot) { + val sanitized = snapshot.copy( + keepMediaDays = snapshot.keepMediaDays.coerceIn(1, 365), + maxCacheMb = snapshot.maxCacheMb.coerceIn(64, 8192), + proxyPort = snapshot.proxyPort.coerceIn(1, 65_535) + ) + preferences.edit().apply { + putBoolean(KEY_AUTO_DOWNLOAD_PHOTOS, sanitized.autoDownloadPhotos) + putBoolean(KEY_AUTO_DOWNLOAD_VIDEOS_ON_WIFI, sanitized.autoDownloadVideosOnWifi) + putBoolean(KEY_AUTO_DOWNLOAD_FILES_ON_WIFI, sanitized.autoDownloadFilesOnWifi) + putBoolean(KEY_SAVE_MEDIA_TO_GALLERY, sanitized.saveMediaToGallery) + putBoolean(KEY_LOW_DATA_CALLS, sanitized.lowDataCalls) + putInt(KEY_KEEP_MEDIA_DAYS, sanitized.keepMediaDays) + putInt(KEY_MAX_CACHE_MB, sanitized.maxCacheMb) + putString(KEY_THEME_MODE, sanitized.themeMode.name) + putString(KEY_ACCENT_COLOR_NAME, sanitized.accentColorName) + putBoolean(KEY_ANIMATED_BACKGROUNDS, sanitized.animatedBackgrounds) + putBoolean(KEY_LARGE_EMOJI, sanitized.largeEmoji) + putString(KEY_LANGUAGE_MODE, sanitized.languageMode.name) + putBoolean(KEY_PROXY_ENABLED, sanitized.proxyEnabled) + putString(KEY_PROXY_TYPE, sanitized.proxyType.name) + putString(KEY_PROXY_HOST, sanitized.proxyHost) + putInt(KEY_PROXY_PORT, sanitized.proxyPort) + putString(KEY_PROXY_SECRET, sanitized.proxySecret) + apply() + } + _snapshot.value = sanitized + } + + fun reset() { + preferences.edit().clear().apply() + _snapshot.value = AppSettingsSnapshot() + } + + private fun > getEnum(key: String, defaultValue: T): T { + val rawValue = preferences.getString(key, defaultValue.name).orEmpty() + @Suppress("UNCHECKED_CAST") + return defaultValue.declaringJavaClass.enumConstants + ?.firstOrNull { it.name == rawValue } as? T + ?: defaultValue + } + + companion object { + private const val PREFERENCES_NAME = "ikar_kotlin_app_settings" + private const val KEY_AUTO_DOWNLOAD_PHOTOS = "auto_download_photos" + private const val KEY_AUTO_DOWNLOAD_VIDEOS_ON_WIFI = "auto_download_videos_on_wifi" + private const val KEY_AUTO_DOWNLOAD_FILES_ON_WIFI = "auto_download_files_on_wifi" + private const val KEY_SAVE_MEDIA_TO_GALLERY = "save_media_to_gallery" + private const val KEY_LOW_DATA_CALLS = "low_data_calls" + private const val KEY_KEEP_MEDIA_DAYS = "keep_media_days" + private const val KEY_MAX_CACHE_MB = "max_cache_mb" + private const val KEY_THEME_MODE = "theme_mode" + private const val KEY_ACCENT_COLOR_NAME = "accent_color_name" + private const val KEY_ANIMATED_BACKGROUNDS = "animated_backgrounds" + private const val KEY_LARGE_EMOJI = "large_emoji" + private const val KEY_LANGUAGE_MODE = "language_mode" + private const val KEY_PROXY_ENABLED = "proxy_enabled" + private const val KEY_PROXY_TYPE = "proxy_type" + private const val KEY_PROXY_HOST = "proxy_host" + private const val KEY_PROXY_PORT = "proxy_port" + private const val KEY_PROXY_SECRET = "proxy_secret" + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/settings/AndroidChatSettings.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/settings/AndroidChatSettings.kt new file mode 100644 index 00000000..e46d8413 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/settings/AndroidChatSettings.kt @@ -0,0 +1,177 @@ +package com.seven.ikar.kotlin.core.settings + +import android.content.Context +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow + +enum class ChatListLayoutOption { + TwoLine, + ThreeLine +} + +enum class ChatSwipeLeftActionOption { + Delete, + Archive, + Mute, + Read +} + +enum class ChatDistanceUnitOption { + Automatic, + Kilometers, + Miles +} + +const val DEFAULT_CHAT_WALLPAPER_PRESET_ID = "mint_field" + +data class ChatSettingsSnapshot( + val messageTextSizeSp: Int = 18, + val bubbleCornerRadiusDp: Int = 11, + val selectedWallpaperPresetId: String = DEFAULT_CHAT_WALLPAPER_PRESET_ID, + val customWallpaperUri: String? = null, + val useCustomWallpaper: Boolean = false, + val chatListLayout: ChatListLayoutOption = ChatListLayoutOption.TwoLine, + val swipeLeftAction: ChatSwipeLeftActionOption = ChatSwipeLeftActionOption.Delete, + val autoNightThemeEnabled: Boolean = false, + val inAppBrowserEnabled: Boolean = true, + val animationsEnabled: Boolean = true, + val mediaTapToBrowseEnabled: Boolean = true, + val raiseToListenEnabled: Boolean = true, + val raiseToTalkEnabled: Boolean = false, + val pauseMusicOnRecordEnabled: Boolean = true, + val pauseMusicOnPlaybackEnabled: Boolean = false, + val directShareEnabled: Boolean = true, + val showSensitiveContentEnabled: Boolean = false, + val sendByEnterEnabled: Boolean = false, + val distanceUnit: ChatDistanceUnitOption = ChatDistanceUnitOption.Automatic +) + +class AndroidChatSettings(context: Context) { + private val preferences = context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_PRIVATE) + private val _snapshot = MutableStateFlow(loadSnapshot()) + val snapshot: StateFlow = _snapshot.asStateFlow() + + fun loadSnapshot(): ChatSettingsSnapshot = + ChatSettingsSnapshot( + messageTextSizeSp = preferences.getInt(KEY_MESSAGE_TEXT_SIZE_SP, DEFAULT_MESSAGE_TEXT_SIZE_SP) + .coerceIn(14, 26), + bubbleCornerRadiusDp = preferences.getInt(KEY_BUBBLE_CORNER_RADIUS_DP, DEFAULT_BUBBLE_CORNER_RADIUS_DP) + .coerceIn(4, 24), + selectedWallpaperPresetId = preferences + .getString(KEY_SELECTED_WALLPAPER_PRESET_ID, DEFAULT_CHAT_WALLPAPER_PRESET_ID) + .orEmpty() + .ifBlank { DEFAULT_CHAT_WALLPAPER_PRESET_ID }, + customWallpaperUri = preferences.getString(KEY_CUSTOM_WALLPAPER_URI, null), + useCustomWallpaper = preferences.getBoolean(KEY_USE_CUSTOM_WALLPAPER, false), + chatListLayout = getEnum(KEY_CHAT_LIST_LAYOUT, ChatListLayoutOption.TwoLine), + swipeLeftAction = getEnum(KEY_SWIPE_LEFT_ACTION, ChatSwipeLeftActionOption.Delete), + autoNightThemeEnabled = preferences.getBoolean(KEY_AUTO_NIGHT_THEME_ENABLED, false), + inAppBrowserEnabled = preferences.getBoolean(KEY_IN_APP_BROWSER_ENABLED, true), + animationsEnabled = preferences.getBoolean(KEY_ANIMATIONS_ENABLED, true), + mediaTapToBrowseEnabled = preferences.getBoolean(KEY_MEDIA_TAP_TO_BROWSE_ENABLED, true), + raiseToListenEnabled = preferences.getBoolean(KEY_RAISE_TO_LISTEN_ENABLED, true), + raiseToTalkEnabled = preferences.getBoolean(KEY_RAISE_TO_TALK_ENABLED, false), + pauseMusicOnRecordEnabled = preferences.getBoolean(KEY_PAUSE_MUSIC_ON_RECORD_ENABLED, true), + pauseMusicOnPlaybackEnabled = preferences.getBoolean(KEY_PAUSE_MUSIC_ON_PLAYBACK_ENABLED, false), + directShareEnabled = preferences.getBoolean(KEY_DIRECT_SHARE_ENABLED, true), + showSensitiveContentEnabled = preferences.getBoolean(KEY_SHOW_SENSITIVE_CONTENT_ENABLED, false), + sendByEnterEnabled = preferences.getBoolean(KEY_SEND_BY_ENTER_ENABLED, false), + distanceUnit = getEnum(KEY_DISTANCE_UNIT, ChatDistanceUnitOption.Automatic) + ) + + fun update(transform: (ChatSettingsSnapshot) -> ChatSettingsSnapshot) { + saveSnapshot(transform(_snapshot.value)) + } + + fun saveSnapshot(snapshot: ChatSettingsSnapshot) { + preferences.edit().apply { + putInt(KEY_MESSAGE_TEXT_SIZE_SP, snapshot.messageTextSizeSp.coerceIn(14, 26)) + putInt(KEY_BUBBLE_CORNER_RADIUS_DP, snapshot.bubbleCornerRadiusDp.coerceIn(4, 24)) + putString( + KEY_SELECTED_WALLPAPER_PRESET_ID, + snapshot.selectedWallpaperPresetId.ifBlank { DEFAULT_CHAT_WALLPAPER_PRESET_ID } + ) + putString(KEY_CUSTOM_WALLPAPER_URI, snapshot.customWallpaperUri) + putBoolean(KEY_USE_CUSTOM_WALLPAPER, snapshot.useCustomWallpaper) + putString(KEY_CHAT_LIST_LAYOUT, snapshot.chatListLayout.name) + putString(KEY_SWIPE_LEFT_ACTION, snapshot.swipeLeftAction.name) + putBoolean(KEY_AUTO_NIGHT_THEME_ENABLED, snapshot.autoNightThemeEnabled) + putBoolean(KEY_IN_APP_BROWSER_ENABLED, snapshot.inAppBrowserEnabled) + putBoolean(KEY_ANIMATIONS_ENABLED, snapshot.animationsEnabled) + putBoolean(KEY_MEDIA_TAP_TO_BROWSE_ENABLED, snapshot.mediaTapToBrowseEnabled) + putBoolean(KEY_RAISE_TO_LISTEN_ENABLED, snapshot.raiseToListenEnabled) + putBoolean(KEY_RAISE_TO_TALK_ENABLED, snapshot.raiseToTalkEnabled) + putBoolean(KEY_PAUSE_MUSIC_ON_RECORD_ENABLED, snapshot.pauseMusicOnRecordEnabled) + putBoolean(KEY_PAUSE_MUSIC_ON_PLAYBACK_ENABLED, snapshot.pauseMusicOnPlaybackEnabled) + putBoolean(KEY_DIRECT_SHARE_ENABLED, snapshot.directShareEnabled) + putBoolean(KEY_SHOW_SENSITIVE_CONTENT_ENABLED, snapshot.showSensitiveContentEnabled) + putBoolean(KEY_SEND_BY_ENTER_ENABLED, snapshot.sendByEnterEnabled) + putString(KEY_DISTANCE_UNIT, snapshot.distanceUnit.name) + apply() + } + _snapshot.value = snapshot.copy( + messageTextSizeSp = snapshot.messageTextSizeSp.coerceIn(14, 26), + bubbleCornerRadiusDp = snapshot.bubbleCornerRadiusDp.coerceIn(4, 24) + ) + } + + fun reset() { + preferences.edit().apply { + remove(KEY_MESSAGE_TEXT_SIZE_SP) + remove(KEY_BUBBLE_CORNER_RADIUS_DP) + remove(KEY_SELECTED_WALLPAPER_PRESET_ID) + remove(KEY_CUSTOM_WALLPAPER_URI) + remove(KEY_USE_CUSTOM_WALLPAPER) + remove(KEY_CHAT_LIST_LAYOUT) + remove(KEY_SWIPE_LEFT_ACTION) + remove(KEY_AUTO_NIGHT_THEME_ENABLED) + remove(KEY_IN_APP_BROWSER_ENABLED) + remove(KEY_ANIMATIONS_ENABLED) + remove(KEY_MEDIA_TAP_TO_BROWSE_ENABLED) + remove(KEY_RAISE_TO_LISTEN_ENABLED) + remove(KEY_RAISE_TO_TALK_ENABLED) + remove(KEY_PAUSE_MUSIC_ON_RECORD_ENABLED) + remove(KEY_PAUSE_MUSIC_ON_PLAYBACK_ENABLED) + remove(KEY_DIRECT_SHARE_ENABLED) + remove(KEY_SHOW_SENSITIVE_CONTENT_ENABLED) + remove(KEY_SEND_BY_ENTER_ENABLED) + remove(KEY_DISTANCE_UNIT) + apply() + } + _snapshot.value = ChatSettingsSnapshot() + } + + private fun > getEnum(key: String, defaultValue: T): T { + val rawValue = preferences.getString(key, defaultValue.name).orEmpty() + @Suppress("UNCHECKED_CAST") + return defaultValue.declaringJavaClass.enumConstants + ?.firstOrNull { it.name == rawValue } as? T + ?: defaultValue + } + + companion object { + private const val PREFERENCES_NAME = "ikar_kotlin_chat_settings" + private const val DEFAULT_MESSAGE_TEXT_SIZE_SP = 18 + private const val DEFAULT_BUBBLE_CORNER_RADIUS_DP = 11 + private const val KEY_MESSAGE_TEXT_SIZE_SP = "message_text_size_sp" + private const val KEY_BUBBLE_CORNER_RADIUS_DP = "bubble_corner_radius_dp" + private const val KEY_SELECTED_WALLPAPER_PRESET_ID = "selected_wallpaper_preset_id" + private const val KEY_CUSTOM_WALLPAPER_URI = "custom_wallpaper_uri" + private const val KEY_USE_CUSTOM_WALLPAPER = "use_custom_wallpaper" + private const val KEY_CHAT_LIST_LAYOUT = "chat_list_layout" + private const val KEY_SWIPE_LEFT_ACTION = "swipe_left_action" + private const val KEY_AUTO_NIGHT_THEME_ENABLED = "auto_night_theme_enabled" + private const val KEY_IN_APP_BROWSER_ENABLED = "in_app_browser_enabled" + private const val KEY_ANIMATIONS_ENABLED = "animations_enabled" + private const val KEY_MEDIA_TAP_TO_BROWSE_ENABLED = "media_tap_to_browse_enabled" + private const val KEY_RAISE_TO_LISTEN_ENABLED = "raise_to_listen_enabled" + private const val KEY_RAISE_TO_TALK_ENABLED = "raise_to_talk_enabled" + private const val KEY_PAUSE_MUSIC_ON_RECORD_ENABLED = "pause_music_on_record_enabled" + private const val KEY_PAUSE_MUSIC_ON_PLAYBACK_ENABLED = "pause_music_on_playback_enabled" + private const val KEY_DIRECT_SHARE_ENABLED = "direct_share_enabled" + private const val KEY_SHOW_SENSITIVE_CONTENT_ENABLED = "show_sensitive_content_enabled" + private const val KEY_SEND_BY_ENTER_ENABLED = "send_by_enter_enabled" + private const val KEY_DISTANCE_UNIT = "distance_unit" + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/settings/AndroidPrivacyRuntimeSettings.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/settings/AndroidPrivacyRuntimeSettings.kt new file mode 100644 index 00000000..1c8cf946 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/settings/AndroidPrivacyRuntimeSettings.kt @@ -0,0 +1,56 @@ +package com.seven.ikar.kotlin.core.settings + +import android.content.Context +import com.seven.ikar.kotlin.core.model.PrivacySettingsDto +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow + +data class PrivacyRuntimeSnapshot( + val passcodeLockEnabled: Boolean = false, + val showMessagePreview: Boolean = true +) + +class AndroidPrivacyRuntimeSettings(context: Context) { + private val preferences = context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_PRIVATE) + private val _snapshot = MutableStateFlow(loadSnapshot()) + val snapshot: StateFlow = _snapshot.asStateFlow() + + fun loadSnapshot(): PrivacyRuntimeSnapshot = + PrivacyRuntimeSnapshot( + passcodeLockEnabled = preferences.getBoolean(KEY_PASSCODE_LOCK_ENABLED, false), + showMessagePreview = preferences.getBoolean(KEY_SHOW_MESSAGE_PREVIEW, true) + ) + + fun saveFrom(settings: PrivacySettingsDto) { + saveSnapshot( + PrivacyRuntimeSnapshot( + passcodeLockEnabled = settings.passcodeLockEnabled, + showMessagePreview = settings.showMessagePreview + ) + ) + } + + private fun saveSnapshot(snapshot: PrivacyRuntimeSnapshot) { + preferences.edit() + .putBoolean(KEY_PASSCODE_LOCK_ENABLED, snapshot.passcodeLockEnabled) + .putBoolean(KEY_SHOW_MESSAGE_PREVIEW, snapshot.showMessagePreview) + .apply() + _snapshot.value = snapshot + } + + companion object { + private const val PREFERENCES_NAME = "ikar_kotlin_privacy_runtime" + private const val KEY_PASSCODE_LOCK_ENABLED = "passcode_lock_enabled" + private const val KEY_SHOW_MESSAGE_PREVIEW = "show_message_preview" + } +} + +class AppLockState { + private val _isLocked = MutableStateFlow(false) + val isLocked: StateFlow = _isLocked.asStateFlow() + + fun setLocked(locked: Boolean) { + _isLocked.value = locked + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/settings/AppLocaleManager.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/settings/AppLocaleManager.kt new file mode 100644 index 00000000..38bb6586 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/settings/AppLocaleManager.kt @@ -0,0 +1,28 @@ +package com.seven.ikar.kotlin.core.settings + +import android.content.Context +import android.content.res.Configuration +import android.os.LocaleList +import java.util.Locale + +object AppLocaleManager { + fun apply(context: Context, mode: AppLanguageMode) { + val locale = localeFor(mode) ?: Locale.getDefault() + Locale.setDefault(locale) + + val configuration = Configuration(context.resources.configuration) + if (mode == AppLanguageMode.System) { + configuration.setLocales(LocaleList.getDefault()) + } else { + configuration.setLocale(locale) + configuration.setLocales(LocaleList(locale)) + } + context.resources.updateConfiguration(configuration, context.resources.displayMetrics) + } + + private fun localeFor(mode: AppLanguageMode): Locale? = when (mode) { + AppLanguageMode.System -> null + AppLanguageMode.Russian -> Locale("ru", "RU") + AppLanguageMode.English -> Locale.ENGLISH + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/update/ArgusAppUpdateCache.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/update/ArgusAppUpdateCache.kt new file mode 100644 index 00000000..16365b75 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/update/ArgusAppUpdateCache.kt @@ -0,0 +1,33 @@ +package com.seven.ikar.kotlin.core.update + +import android.content.Context +import java.io.File + +internal object ArgusAppUpdateCache { + private const val DOWNLOAD_DIR_NAME = "argus-updater" + + fun buildDownloadTargetFile(context: Context, update: AvailableIkarUpdate): File = + File(downloadDir(context), update.manifest.release.originalFileName) + + fun deleteStaleDownloads(context: Context, keepFile: File) { + val keepPath = keepFile.absolutePath + downloadDir(context).listFiles() + ?.filter { it.absolutePath != keepPath } + ?.forEach { it.deleteRecursivelyQuietly() } + } + + fun deleteAllDownloads(context: Context) { + downloadDir(context).deleteRecursivelyQuietly() + } + + private fun downloadDir(context: Context): File = + File(context.cacheDir, DOWNLOAD_DIR_NAME) + + private fun File.deleteRecursivelyQuietly() { + if (!exists()) { + return + } + + runCatching { deleteRecursively() } + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/update/ArgusAppUpdateClient.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/update/ArgusAppUpdateClient.kt new file mode 100644 index 00000000..e9bb869e --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/update/ArgusAppUpdateClient.kt @@ -0,0 +1,126 @@ +package com.seven.ikar.kotlin.core.update + +import org.json.JSONObject +import java.io.File +import java.net.HttpURLConnection +import java.net.URL +import java.security.MessageDigest + +class ArgusAppUpdateClient { + fun fetchManifest(config: ArgusAppUpdateConfig): ArgusAppManifest? { + val url = buildManifestUrl(config) + val connection = openConnection(url) + + return connection.useJsonBody { statusCode, body -> + when (statusCode) { + HttpURLConnection.HTTP_OK -> parseManifest(body) + HttpURLConnection.HTTP_NOT_FOUND -> null + else -> throw IllegalStateException("Argus returned HTTP $statusCode for $url") + } + } + } + + fun downloadRelease(update: AvailableIkarUpdate, targetFile: File): File { + targetFile.parentFile?.mkdirs() + if (targetFile.exists() && sha256(targetFile).equals(update.manifest.release.sha256, ignoreCase = true)) { + return targetFile + } + + val connection = openConnection(update.downloadUrl) + connection.requestMethod = "GET" + connection.instanceFollowRedirects = true + + try { + val statusCode = connection.responseCode + if (statusCode != HttpURLConnection.HTTP_OK) { + throw IllegalStateException("Argus download failed with HTTP $statusCode") + } + + connection.inputStream.use { input -> + targetFile.outputStream().use { output -> + input.copyTo(output) + } + } + } finally { + connection.disconnect() + } + + val actualSha = sha256(targetFile) + if (!actualSha.equals(update.manifest.release.sha256, ignoreCase = true)) { + targetFile.delete() + throw IllegalStateException( + "SHA-256 mismatch. Expected ${update.manifest.release.sha256}, got $actualSha." + ) + } + + return targetFile + } + + private fun buildManifestUrl(config: ArgusAppUpdateConfig): String { + val baseUrl = config.baseUrl.trim().trimEnd('/') + val slug = config.slug.trim() + return "$baseUrl/api/apps/$slug/manifest?platform=${config.platform}&channel=${config.channel}" + } + + private fun openConnection(url: String): HttpURLConnection = + (URL(url).openConnection() as HttpURLConnection).apply { + connectTimeout = 15_000 + readTimeout = 60_000 + setRequestProperty("Accept", "application/json") + } + + private fun parseManifest(body: String): ArgusAppManifest { + val root = JSONObject(body) + val releaseJson = root.getJSONObject("release") + return ArgusAppManifest( + slug = root.getString("slug"), + name = root.getString("name"), + summary = root.getString("summary"), + description = root.getString("description"), + androidPackageName = root.optString("androidPackageName").ifBlank { null }, + repositoryUrl = root.optString("repositoryUrl").ifBlank { null }, + homepageUrl = root.optString("homepageUrl").ifBlank { null }, + release = ArgusPublishedRelease( + id = releaseJson.getString("id"), + version = releaseJson.getString("version"), + channel = releaseJson.getString("channel"), + platform = releaseJson.getString("platform"), + packageKind = releaseJson.getString("packageKind"), + androidVersionCode = releaseJson.takeIf { it.has("androidVersionCode") && !it.isNull("androidVersionCode") } + ?.getLong("androidVersionCode"), + downloadPath = releaseJson.getString("downloadPath"), + originalFileName = releaseJson.getString("originalFileName"), + contentType = releaseJson.getString("contentType"), + packageSizeBytes = releaseJson.getLong("packageSizeBytes"), + sha256 = releaseJson.getString("sha256"), + publishedAt = releaseJson.getString("publishedAt"), + notes = releaseJson.optString("notes").ifBlank { null } + ) + ) + } + + private fun HttpURLConnection.useJsonBody(block: (statusCode: Int, body: String) -> ArgusAppManifest?): ArgusAppManifest? = + try { + val statusCode = responseCode + val stream = if (statusCode >= 400) errorStream else inputStream + val body = stream?.bufferedReader()?.use { it.readText() }.orEmpty() + block(statusCode, body) + } finally { + disconnect() + } + + private fun sha256(file: File): String { + val digest = MessageDigest.getInstance("SHA-256") + file.inputStream().use { input -> + val buffer = ByteArray(DEFAULT_BUFFER_SIZE) + while (true) { + val read = input.read(buffer) + if (read <= 0) { + break + } + digest.update(buffer, 0, read) + } + } + return digest.digest().joinToString(separator = "") { byte -> "%02x".format(byte) } + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/update/ArgusAppUpdateInstaller.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/update/ArgusAppUpdateInstaller.kt new file mode 100644 index 00000000..e827b4ba --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/update/ArgusAppUpdateInstaller.kt @@ -0,0 +1,149 @@ +package com.seven.ikar.kotlin.core.update + +import android.app.PendingIntent +import android.content.Context +import android.content.Intent +import android.content.pm.PackageInfo +import android.content.pm.PackageInstaller +import android.content.pm.PackageManager +import android.os.Build +import java.io.File + +class ArgusAppUpdateInstaller(private val context: Context) { + private val preferences = ArgusAppUpdatePreferences(context) + + fun submitInstall( + packageFile: File, + update: AvailableIkarUpdate + ): AppUpdateSubmissionResult { + val expectedPackageName = update.installedApp.packageName + val expectedVersionCode = update.manifest.release.androidVersionCode + val archiveInfo = readArchiveInfo(packageFile) + ?: return reject( + expectedPackageName, + update.manifest.release.version, + expectedVersionCode, + "Android не смог прочитать скачанный APK." + ) + + if (archiveInfo.packageName != expectedPackageName) { + return reject( + expectedPackageName, + update.manifest.release.version, + expectedVersionCode, + "APK содержит пакет ${archiveInfo.packageName}, а ожидался $expectedPackageName." + ) + } + + val archiveVersionCode = archiveInfo.versionCodeCompat() + if (expectedVersionCode != null && archiveVersionCode != expectedVersionCode) { + return reject( + expectedPackageName, + update.manifest.release.version, + expectedVersionCode, + "APK содержит versionCode $archiveVersionCode, а Argus ожидал $expectedVersionCode." + ) + } + + val installer = context.packageManager.packageInstaller + val params = PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL).apply { + setAppPackageName(expectedPackageName) + setSize(packageFile.length()) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + setPackageSource(PackageInstaller.PACKAGE_SOURCE_STORE) + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + setRequireUserAction(PackageInstaller.SessionParams.USER_ACTION_REQUIRED) + } + } + + val sessionId = installer.createSession(params) + val pendingIntent = PendingIntent.getBroadcast( + context, + sessionId, + Intent(context, ArgusAppUpdateInstallerStatusReceiver::class.java).apply { + action = ACTION_PACKAGE_STATUS + putExtra(EXTRA_PACKAGE_NAME, expectedPackageName) + putExtra(EXTRA_RELEASE_VERSION, update.manifest.release.version) + if (expectedVersionCode != null) { + putExtra(EXTRA_VERSION_CODE, expectedVersionCode) + } + }, + PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_MUTABLE + ) + + var session: PackageInstaller.Session? = null + try { + session = installer.openSession(sessionId) + packageFile.inputStream().use { input -> + session.openWrite("base.apk", 0, packageFile.length()).use { output -> + input.copyTo(output) + session.fsync(output) + } + } + session.commit(pendingIntent.intentSender) + } catch (error: Exception) { + session?.abandon() + return reject( + expectedPackageName, + update.manifest.release.version, + expectedVersionCode, + error.message ?: "Android не смог отправить сессию установки." + ) + } finally { + session?.close() + } + + val message = "Запрос на установку обновления отправлен в Android." + preferences.saveInstallerEvent( + state = AppUpdateInstallerEventState.Submitted, + packageName = expectedPackageName, + releaseVersion = update.manifest.release.version, + versionCode = expectedVersionCode ?: archiveVersionCode, + detail = message + ) + return AppUpdateSubmissionResult.Submitted(message) + } + + private fun reject( + packageName: String, + releaseVersion: String, + versionCode: Long?, + message: String + ): AppUpdateSubmissionResult.Rejected { + preferences.saveInstallerEvent( + state = AppUpdateInstallerEventState.Failed, + packageName = packageName, + releaseVersion = releaseVersion, + versionCode = versionCode, + detail = message + ) + return AppUpdateSubmissionResult.Rejected(message) + } + + private fun readArchiveInfo(packageFile: File): PackageInfo? = + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + context.packageManager.getPackageArchiveInfo( + packageFile.absolutePath, + PackageManager.PackageInfoFlags.of(0) + ) + } else { + @Suppress("DEPRECATION") + context.packageManager.getPackageArchiveInfo(packageFile.absolutePath, 0) + } + + companion object { + const val ACTION_PACKAGE_STATUS = "com.seven.ikar.kotlin.PACKAGE_STATUS" + const val EXTRA_PACKAGE_NAME = "package_name" + const val EXTRA_RELEASE_VERSION = "release_version" + const val EXTRA_VERSION_CODE = "version_code" + } +} + +private fun PackageInfo.versionCodeCompat(): Long = + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + longVersionCode + } else { + @Suppress("DEPRECATION") + versionCode.toLong() + } diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/update/ArgusAppUpdateInstallerStatusReceiver.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/update/ArgusAppUpdateInstallerStatusReceiver.kt new file mode 100644 index 00000000..b8503a6b --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/update/ArgusAppUpdateInstallerStatusReceiver.kt @@ -0,0 +1,70 @@ +package com.seven.ikar.kotlin.core.update + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.pm.PackageInstaller +import android.os.Build + +class ArgusAppUpdateInstallerStatusReceiver : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + if (intent.action != ArgusAppUpdateInstaller.ACTION_PACKAGE_STATUS) { + return + } + + val preferences = ArgusAppUpdatePreferences(context) + val packageName = intent.getStringExtra(PackageInstaller.EXTRA_PACKAGE_NAME) + ?: intent.getStringExtra(ArgusAppUpdateInstaller.EXTRA_PACKAGE_NAME) + val releaseVersion = intent.getStringExtra(ArgusAppUpdateInstaller.EXTRA_RELEASE_VERSION) + val versionCode = intent.getLongExtra(ArgusAppUpdateInstaller.EXTRA_VERSION_CODE, Long.MIN_VALUE) + .takeUnless { it == Long.MIN_VALUE } + val status = intent.getIntExtra(PackageInstaller.EXTRA_STATUS, PackageInstaller.STATUS_FAILURE) + val statusMessage = intent.getStringExtra(PackageInstaller.EXTRA_STATUS_MESSAGE) + + when (status) { + PackageInstaller.STATUS_PENDING_USER_ACTION -> { + preferences.saveInstallerEvent( + state = AppUpdateInstallerEventState.ApprovalRequired, + packageName = packageName, + releaseVersion = releaseVersion, + versionCode = versionCode, + detail = statusMessage ?: "Android просит подтвердить установку обновления." + ) + + extractConfirmationIntent(intent)?.let { confirmationIntent -> + confirmationIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + context.startActivity(confirmationIntent) + } + } + + PackageInstaller.STATUS_SUCCESS -> { + preferences.saveInstallerEvent( + state = AppUpdateInstallerEventState.Installed, + packageName = packageName, + releaseVersion = releaseVersion, + versionCode = versionCode, + detail = statusMessage ?: "Обновление установлено." + ) + ArgusAppUpdateCache.deleteAllDownloads(context) + } + + else -> { + preferences.saveInstallerEvent( + state = AppUpdateInstallerEventState.Failed, + packageName = packageName, + releaseVersion = releaseVersion, + versionCode = versionCode, + detail = statusMessage ?: "Android вернул ошибку установки: $status." + ) + } + } + } + + private fun extractConfirmationIntent(intent: Intent): Intent? = + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + intent.getParcelableExtra(Intent.EXTRA_INTENT, Intent::class.java) + } else { + @Suppress("DEPRECATION") + intent.getParcelableExtra(Intent.EXTRA_INTENT) + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/update/ArgusAppUpdateManager.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/update/ArgusAppUpdateManager.kt new file mode 100644 index 00000000..a26ef040 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/update/ArgusAppUpdateManager.kt @@ -0,0 +1,101 @@ +package com.seven.ikar.kotlin.core.update + +import android.content.Context +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.provider.Settings + +class ArgusAppUpdateManager( + private val context: Context, + private val client: ArgusAppUpdateClient = ArgusAppUpdateClient(), + private val installer: ArgusAppUpdateInstaller = ArgusAppUpdateInstaller(context), + private val preferences: ArgusAppUpdatePreferences = ArgusAppUpdatePreferences(context) +) { + fun canRequestPackageInstalls(): Boolean = + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + context.packageManager.canRequestPackageInstalls() + } else { + true + } + + fun buildUnknownSourcesIntent(): Intent = + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + Intent( + Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, + Uri.parse("package:${context.packageName}") + ) + } else { + Intent(Settings.ACTION_SECURITY_SETTINGS) + } + + fun loadLastInstallerEvent(): AppUpdateInstallerEvent? = + preferences.loadLastInstallerEvent() + + fun buildDownloadTargetFile(update: AvailableIkarUpdate) = + ArgusAppUpdateCache.buildDownloadTargetFile(context, update) + + fun checkForUpdate( + config: ArgusAppUpdateConfig, + installedApp: InstalledIkarApp + ): AppUpdateCheckResult = + try { + val manifest = client.fetchManifest(config) + ?: return AppUpdateCheckResult.NotPublished( + "На сервере Argus нет совместимого релиза для ${config.slug}." + ) + + val manifestPackageName = manifest.androidPackageName?.trim() + if (manifestPackageName.isNullOrBlank()) { + return AppUpdateCheckResult.Incompatible( + "В карточке Argus не указан androidPackageName." + ) + } + + if (!manifestPackageName.equals(installedApp.packageName, ignoreCase = false)) { + return AppUpdateCheckResult.Incompatible( + "Argus отдаёт пакет $manifestPackageName, а текущее приложение имеет пакет ${installedApp.packageName}." + ) + } + + if (!manifest.release.packageKind.equals("apk", ignoreCase = true)) { + return AppUpdateCheckResult.Incompatible( + "Argus отдал packageKind=${manifest.release.packageKind}, а updater поддерживает только APK." + ) + } + + val remoteVersionCode = manifest.release.androidVersionCode + ?: return AppUpdateCheckResult.Incompatible( + "Argus не вернул androidVersionCode для релиза." + ) + + if (remoteVersionCode <= installedApp.versionCode) { + return AppUpdateCheckResult.UpToDate(manifest) + } + + AppUpdateCheckResult.UpdateAvailable( + AvailableIkarUpdate( + config = config, + installedApp = installedApp, + manifest = manifest + ) + ) + } catch (error: Exception) { + AppUpdateCheckResult.Failed( + reason = error.message ?: "Не удалось проверить наличие обновления в Argus.", + cause = error + ) + } + + fun downloadAndInstall(update: AvailableIkarUpdate): AppUpdateSubmissionResult = + try { + val targetFile = buildDownloadTargetFile(update) + ArgusAppUpdateCache.deleteStaleDownloads(context, targetFile) + val apkFile = client.downloadRelease(update, targetFile) + installer.submitInstall(apkFile, update) + } catch (error: Exception) { + AppUpdateSubmissionResult.Rejected( + error.message ?: "Не удалось скачать или запустить установку обновления." + ) + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/update/ArgusAppUpdateModels.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/update/ArgusAppUpdateModels.kt new file mode 100644 index 00000000..88d13028 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/update/ArgusAppUpdateModels.kt @@ -0,0 +1,84 @@ +package com.seven.ikar.kotlin.core.update + +data class ArgusAppUpdateConfig( + val baseUrl: String, + val slug: String, + val platform: String = "android", + val channel: String = "stable" +) + +data class InstalledIkarApp( + val packageName: String, + val versionCode: Long, + val versionName: String? +) + +data class ArgusPublishedRelease( + val id: String, + val version: String, + val channel: String, + val platform: String, + val packageKind: String, + val androidVersionCode: Long?, + val downloadPath: String, + val originalFileName: String, + val contentType: String, + val packageSizeBytes: Long, + val sha256: String, + val publishedAt: String, + val notes: String? +) + +data class ArgusAppManifest( + val slug: String, + val name: String, + val summary: String, + val description: String, + val androidPackageName: String?, + val repositoryUrl: String?, + val homepageUrl: String?, + val release: ArgusPublishedRelease +) + +data class AvailableIkarUpdate( + val config: ArgusAppUpdateConfig, + val installedApp: InstalledIkarApp, + val manifest: ArgusAppManifest +) { + val downloadUrl: String + get() = config.baseUrl.trimEnd('/') + manifest.release.downloadPath +} + +sealed interface AppUpdateCheckResult { + data class NotPublished(val reason: String) : AppUpdateCheckResult + + data class UpToDate(val manifest: ArgusAppManifest?) : AppUpdateCheckResult + + data class UpdateAvailable(val update: AvailableIkarUpdate) : AppUpdateCheckResult + + data class Incompatible(val reason: String) : AppUpdateCheckResult + + data class Failed(val reason: String, val cause: Throwable? = null) : AppUpdateCheckResult +} + +sealed interface AppUpdateSubmissionResult { + data class Submitted(val message: String) : AppUpdateSubmissionResult + + data class Rejected(val message: String) : AppUpdateSubmissionResult +} + +data class AppUpdateInstallerEvent( + val state: String, + val packageName: String?, + val releaseVersion: String?, + val versionCode: Long?, + val detail: String?, + val updatedAtEpochMillis: Long +) + +object AppUpdateInstallerEventState { + const val Submitted = "submitted" + const val ApprovalRequired = "approval_required" + const val Installed = "installed" + const val Failed = "failed" +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/update/ArgusAppUpdatePreferences.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/update/ArgusAppUpdatePreferences.kt new file mode 100644 index 00000000..4f78daca --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/update/ArgusAppUpdatePreferences.kt @@ -0,0 +1,57 @@ +package com.seven.ikar.kotlin.core.update + +import android.content.Context + +class ArgusAppUpdatePreferences(context: Context) { + private val preferences = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE) + + fun loadLastInstallerEvent(): AppUpdateInstallerEvent? { + val state = preferences.getString(KEY_INSTALLER_STATE, null) ?: return null + return AppUpdateInstallerEvent( + state = state, + packageName = preferences.getString(KEY_PACKAGE_NAME, null), + releaseVersion = preferences.getString(KEY_RELEASE_VERSION, null), + versionCode = if (preferences.contains(KEY_VERSION_CODE)) { + preferences.getLong(KEY_VERSION_CODE, 0L) + } else { + null + }, + detail = preferences.getString(KEY_DETAIL, null), + updatedAtEpochMillis = preferences.getLong(KEY_UPDATED_AT, 0L) + ) + } + + fun saveInstallerEvent( + state: String, + packageName: String?, + releaseVersion: String?, + versionCode: Long?, + detail: String?, + updatedAtEpochMillis: Long = System.currentTimeMillis() + ) { + preferences.edit() + .putString(KEY_INSTALLER_STATE, state) + .putString(KEY_PACKAGE_NAME, packageName) + .putString(KEY_RELEASE_VERSION, releaseVersion) + .putString(KEY_DETAIL, detail) + .putLong(KEY_UPDATED_AT, updatedAtEpochMillis) + .apply { + if (versionCode == null) { + remove(KEY_VERSION_CODE) + } else { + putLong(KEY_VERSION_CODE, versionCode) + } + } + .apply() + } + + private companion object { + const val PREFS_NAME = "ikar-argus-updater" + const val KEY_INSTALLER_STATE = "installer_state" + const val KEY_PACKAGE_NAME = "package_name" + const val KEY_RELEASE_VERSION = "release_version" + const val KEY_VERSION_CODE = "version_code" + const val KEY_DETAIL = "detail" + const val KEY_UPDATED_AT = "updated_at" + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/archive/AndroidArchiveFileService.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/archive/AndroidArchiveFileService.kt new file mode 100644 index 00000000..586ebf6c --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/archive/AndroidArchiveFileService.kt @@ -0,0 +1,569 @@ +package com.seven.ikar.kotlin.feature.archive + +import android.content.Context +import android.content.ContentUris +import android.content.ContentValues +import android.net.Uri +import android.os.Build +import android.os.Environment +import android.provider.MediaStore +import android.provider.OpenableColumns +import android.webkit.MimeTypeMap +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.ensureActive +import kotlinx.coroutines.withContext +import java.io.File +import java.io.IOException +import java.io.InputStream +import java.text.Normalizer +import java.time.LocalDateTime +import java.time.format.DateTimeFormatter +import java.util.zip.ZipInputStream +import kotlin.coroutines.coroutineContext + +data class ArchiveEntryPreview( + val name: String, + val isDirectory: Boolean, + val sizeBytes: Long? +) + +data class ArchiveInspectionResult( + val totalEntries: Int, + val totalFiles: Int, + val totalDirectories: Int, + val knownUncompressedBytes: Long, + val skippedUnsafeEntries: Int, + val previewEntries: List +) + +data class ArchiveExtractionOptions( + val keepFolders: Boolean = true, + val overwriteExisting: Boolean = false +) + +data class ArchiveExtractionProgress( + val processedEntries: Int, + val totalEntries: Int, + val extractedFiles: Int, + val writtenBytes: Long, + val currentEntry: String? +) + +data class ArchiveExtractionResult( + val outputDirectoryPath: String, + val processedEntries: Int, + val extractedFiles: Int, + val createdDirectories: Int, + val writtenBytes: Long, + val skippedUnsafeEntries: Int +) + +class AndroidArchiveFileService( + private val context: Context +) { + private val maxArchiveImportBytes = 512L * 1024L * 1024L + private val archiveImportsDirectory: File by lazy { + File(context.cacheDir, "archive_imports").apply { mkdirs() } + } + + suspend fun importFromUri(uri: Uri): PendingArchiveFile = withContext(Dispatchers.IO) { + val resolver = context.contentResolver + val contentType = resolver.getType(uri) ?: "application/octet-stream" + val fileName = queryDisplayName(uri)?.takeIf { it.isNotBlank() } + ?: uri.lastPathSegment?.substringAfterLast('/') + ?: "archive.zip" + if (!isSupportedZip(fileName, contentType)) { + throw IOException("Поддерживается только ZIP-архив. Этот файл не похож на ZIP.") + } + + val declaredSize = queryFileSize(uri) + if (declaredSize != null && declaredSize > maxArchiveImportBytes) { + throw IOException("Архив слишком большой: максимум 512 МБ.") + } + + val target = File( + archiveImportsDirectory, + "open_${System.currentTimeMillis()}_${sanitizeFileName(fileName)}" + ) + val copiedBytes = try { + resolver.openInputStream(uri)?.use { input -> copyToFileWithLimit(input, target) } + ?: throw IOException("Android не дал доступ к выбранному архиву.") + } catch (error: Exception) { + target.delete() + throw error + } + + PendingArchiveFile( + fileName = fileName, + contentType = contentType, + fileSizeBytes = copiedBytes, + localPath = target.absolutePath + ) + } + + suspend fun inspectZip(archive: PendingArchiveFile): ArchiveInspectionResult = withContext(Dispatchers.IO) { + requireZipFile(archive).inputStream().use { input -> + ZipInputStream(input).use { zip -> + var totalEntries = 0 + var totalFiles = 0 + var totalDirectories = 0 + var knownUncompressedBytes = 0L + var skippedUnsafeEntries = 0 + val previewEntries = mutableListOf() + + while (true) { + coroutineContext.ensureActive() + val entry = zip.nextEntry ?: break + totalEntries += 1 + val safeName = safeRelativePath(entry.name) + if (safeName == null) { + skippedUnsafeEntries += 1 + zip.closeEntry() + continue + } + + if (entry.isDirectory) { + totalDirectories += 1 + } else { + totalFiles += 1 + if (entry.size > 0) { + knownUncompressedBytes += entry.size + } + } + + if (previewEntries.size < MaxPreviewEntries) { + previewEntries += ArchiveEntryPreview( + name = safeName, + isDirectory = entry.isDirectory, + sizeBytes = entry.size.takeIf { it >= 0L } + ) + } + zip.closeEntry() + } + + ArchiveInspectionResult( + totalEntries = totalEntries, + totalFiles = totalFiles, + totalDirectories = totalDirectories, + knownUncompressedBytes = knownUncompressedBytes, + skippedUnsafeEntries = skippedUnsafeEntries, + previewEntries = previewEntries + ) + } + } + } + + suspend fun extractZip( + archive: PendingArchiveFile, + inspection: ArchiveInspectionResult?, + options: ArchiveExtractionOptions, + onProgress: (ArchiveExtractionProgress) -> Unit + ): ArchiveExtractionResult = withContext(Dispatchers.IO) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + return@withContext extractZipToDownloads(archive, inspection, options, onProgress) + } + + extractZipToAppFiles(archive, inspection, options, onProgress) + } + + private suspend fun extractZipToAppFiles( + archive: PendingArchiveFile, + inspection: ArchiveInspectionResult?, + options: ArchiveExtractionOptions, + onProgress: (ArchiveExtractionProgress) -> Unit + ): ArchiveExtractionResult { + val archiveFile = requireZipFile(archive) + val outputDirectory = createOutputDirectory(archive.fileName) + var processedEntries = 0 + var extractedFiles = 0 + var createdDirectories = 0 + var writtenBytes = 0L + var skippedUnsafeEntries = 0 + val buffer = ByteArray(DEFAULT_BUFFER_SIZE) + + archiveFile.inputStream().use { input -> + ZipInputStream(input).use { zip -> + while (true) { + coroutineContext.ensureActive() + val entry = zip.nextEntry ?: break + processedEntries += 1 + val safeName = safeRelativePath(entry.name) + if (safeName == null) { + skippedUnsafeEntries += 1 + zip.closeEntry() + continue + } + + onProgress( + ArchiveExtractionProgress( + processedEntries = processedEntries, + totalEntries = inspection?.totalEntries ?: 0, + extractedFiles = extractedFiles, + writtenBytes = writtenBytes, + currentEntry = safeName + ) + ) + + val target = resolveTargetFile(outputDirectory, safeName, entry.isDirectory, options) + if (entry.isDirectory) { + if (!target.exists() && target.mkdirs()) { + createdDirectories += 1 + } + zip.closeEntry() + continue + } + + target.parentFile?.let { parent -> + if (!parent.exists() && parent.mkdirs()) { + createdDirectories += 1 + } + } + + val writableTarget = if (options.overwriteExisting) target else uniqueFile(target) + writableTarget.outputStream().use { output -> + while (true) { + coroutineContext.ensureActive() + val read = zip.read(buffer) + if (read < 0) { + break + } + output.write(buffer, 0, read) + writtenBytes += read + } + } + extractedFiles += 1 + zip.closeEntry() + } + } + } + + return ArchiveExtractionResult( + outputDirectoryPath = outputDirectory.absolutePath, + processedEntries = processedEntries, + extractedFiles = extractedFiles, + createdDirectories = createdDirectories, + writtenBytes = writtenBytes, + skippedUnsafeEntries = skippedUnsafeEntries + ) + } + + @androidx.annotation.RequiresApi(Build.VERSION_CODES.Q) + private suspend fun extractZipToDownloads( + archive: PendingArchiveFile, + inspection: ArchiveInspectionResult?, + options: ArchiveExtractionOptions, + onProgress: (ArchiveExtractionProgress) -> Unit + ): ArchiveExtractionResult { + val archiveFile = requireZipFile(archive) + val outputRoot = createDownloadsRelativeRoot(archive.fileName) + val collection = MediaStore.Downloads.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY) + val resolver = context.contentResolver + var processedEntries = 0 + var extractedFiles = 0 + var createdDirectories = 0 + var writtenBytes = 0L + var skippedUnsafeEntries = 0 + val buffer = ByteArray(DEFAULT_BUFFER_SIZE) + + archiveFile.inputStream().use { input -> + ZipInputStream(input).use { zip -> + while (true) { + coroutineContext.ensureActive() + val entry = zip.nextEntry ?: break + processedEntries += 1 + val safeName = safeRelativePath(entry.name) + if (safeName == null) { + skippedUnsafeEntries += 1 + zip.closeEntry() + continue + } + + onProgress( + ArchiveExtractionProgress( + processedEntries = processedEntries, + totalEntries = inspection?.totalEntries ?: 0, + extractedFiles = extractedFiles, + writtenBytes = writtenBytes, + currentEntry = safeName + ) + ) + + if (entry.isDirectory) { + createdDirectories += 1 + zip.closeEntry() + continue + } + + val relativeFilePath = if (options.keepFolders) { + safeName + } else { + safeName.substringAfterLast('/') + } + val displayName = relativeFilePath.substringAfterLast('/').ifBlank { + "file_${processedEntries}" + } + val parentPath = relativeFilePath.substringBeforeLast('/', missingDelimiterValue = "") + val relativePath = buildDownloadsRelativePath(outputRoot, parentPath) + if (options.overwriteExisting) { + deleteExistingDownload(collection, relativePath, displayName) + } + val finalDisplayName = if (options.overwriteExisting) { + displayName + } else { + uniqueDownloadDisplayName(collection, relativePath, displayName) + } + + val values = ContentValues().apply { + put(MediaStore.Downloads.DISPLAY_NAME, finalDisplayName) + put(MediaStore.Downloads.MIME_TYPE, guessMimeType(finalDisplayName)) + put(MediaStore.Downloads.RELATIVE_PATH, relativePath) + put(MediaStore.Downloads.IS_PENDING, 1) + } + val uri = resolver.insert(collection, values) + ?: throw IOException("Android не дал создать файл в Downloads.") + + try { + resolver.openOutputStream(uri)?.use { output -> + while (true) { + coroutineContext.ensureActive() + val read = zip.read(buffer) + if (read < 0) { + break + } + output.write(buffer, 0, read) + writtenBytes += read + } + } ?: throw IOException("Android не дал записать файл в Downloads.") + + val publishValues = ContentValues().apply { + put(MediaStore.Downloads.IS_PENDING, 0) + } + resolver.update(uri, publishValues, null, null) + } catch (error: Exception) { + resolver.delete(uri, null, null) + throw error + } + + extractedFiles += 1 + zip.closeEntry() + } + } + } + + return ArchiveExtractionResult( + outputDirectoryPath = outputRoot, + processedEntries = processedEntries, + extractedFiles = extractedFiles, + createdDirectories = createdDirectories, + writtenBytes = writtenBytes, + skippedUnsafeEntries = skippedUnsafeEntries + ) + } + + private fun requireZipFile(archive: PendingArchiveFile): File { + if (!isSupportedZip(archive.fileName, archive.contentType)) { + throw IOException("Поддерживается только ZIP-архив.") + } + val file = File(archive.localPath) + if (!file.exists() || !file.isFile) { + throw IOException("Файл архива не найден.") + } + return file + } + + private fun createOutputDirectory(fileName: String): File { + val baseDirectory = context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS) + ?: File(context.filesDir, "downloads") + val archiveName = sanitizeFileName(fileName.substringBeforeLast('.', fileName)).ifBlank { "archive" } + val timestamp = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss")) + return File(baseDirectory, "Ikar/Archives/${archiveName}_$timestamp").apply { mkdirs() } + } + + private fun createDownloadsRelativeRoot(fileName: String): String { + val archiveName = sanitizeFileName(fileName.substringBeforeLast('.', fileName)).ifBlank { "archive" } + val timestamp = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss")) + return "${Environment.DIRECTORY_DOWNLOADS}/Ikar/Archives/${archiveName}_$timestamp" + } + + private fun buildDownloadsRelativePath(outputRoot: String, parentPath: String): String { + val normalizedParent = parentPath.trim('/').takeIf { it.isNotBlank() } + val path = if (normalizedParent == null) outputRoot else "$outputRoot/$normalizedParent" + return path.trim('/') + "/" + } + + private fun resolveTargetFile( + outputDirectory: File, + relativePath: String, + isDirectory: Boolean, + options: ArchiveExtractionOptions + ): File { + val path = if (options.keepFolders) { + relativePath + } else { + relativePath.trimEnd('/').substringAfterLast('/') + } + val target = File(outputDirectory, path) + val canonicalOutput = outputDirectory.canonicalFile + val canonicalTarget = if (isDirectory) { + target.canonicalFile + } else { + target.parentFile?.canonicalFile ?: outputDirectory.canonicalFile + } + if (canonicalTarget != canonicalOutput && !canonicalTarget.path.startsWith(canonicalOutput.path + File.separator)) { + throw IOException("Архив пытается записать файл вне папки распаковки.") + } + return target + } + + private fun safeRelativePath(name: String): String? { + val normalized = name.replace('\\', '/').trim().trimStart('/') + if (normalized.isBlank()) { + return null + } + val segments = normalized.split('/').filter { it.isNotBlank() } + if (segments.any { it == "." || it == ".." || it.contains(':') }) { + return null + } + return segments.joinToString("/") + } + + private fun uniqueFile(target: File): File { + if (!target.exists()) { + return target + } + val parent = target.parentFile ?: return target + val baseName = target.name.substringBeforeLast('.', target.name) + val extension = target.name.substringAfterLast('.', missingDelimiterValue = "") + .takeIf { it != target.name } + ?.let { ".$it" } + .orEmpty() + var index = 1 + while (true) { + val candidate = File(parent, "${baseName}_$index$extension") + if (!candidate.exists()) { + return candidate + } + index += 1 + } + } + + @androidx.annotation.RequiresApi(Build.VERSION_CODES.Q) + private fun uniqueDownloadDisplayName(collection: Uri, relativePath: String, displayName: String): String { + if (!downloadExists(collection, relativePath, displayName)) { + return displayName + } + + val baseName = displayName.substringBeforeLast('.', displayName) + val extension = displayName.substringAfterLast('.', missingDelimiterValue = "") + .takeIf { it != displayName } + ?.let { ".$it" } + .orEmpty() + var index = 1 + while (true) { + val candidate = "${baseName}_$index$extension" + if (!downloadExists(collection, relativePath, candidate)) { + return candidate + } + index += 1 + } + } + + @androidx.annotation.RequiresApi(Build.VERSION_CODES.Q) + private fun downloadExists(collection: Uri, relativePath: String, displayName: String): Boolean = + queryDownloadIds(collection, relativePath, displayName).isNotEmpty() + + @androidx.annotation.RequiresApi(Build.VERSION_CODES.Q) + private fun deleteExistingDownload(collection: Uri, relativePath: String, displayName: String) { + queryDownloadIds(collection, relativePath, displayName).forEach { id -> + context.contentResolver.delete(ContentUris.withAppendedId(collection, id), null, null) + } + } + + @androidx.annotation.RequiresApi(Build.VERSION_CODES.Q) + private fun queryDownloadIds(collection: Uri, relativePath: String, displayName: String): List { + val ids = mutableListOf() + context.contentResolver.query( + collection, + arrayOf(MediaStore.MediaColumns._ID), + "${MediaStore.Downloads.DISPLAY_NAME} = ? AND ${MediaStore.Downloads.RELATIVE_PATH} = ?", + arrayOf(displayName, relativePath), + null + )?.use { cursor -> + val idIndex = cursor.getColumnIndex(MediaStore.MediaColumns._ID) + while (idIndex >= 0 && cursor.moveToNext()) { + ids += cursor.getLong(idIndex) + } + } + return ids + } + + private fun queryDisplayName(uri: Uri): String? { + val resolver = context.contentResolver + resolver.query(uri, arrayOf(OpenableColumns.DISPLAY_NAME), null, null, null)?.use { cursor -> + val nameIndex = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME) + if (nameIndex >= 0 && cursor.moveToFirst() && !cursor.isNull(nameIndex)) { + return cursor.getString(nameIndex) + } + } + return null + } + + private fun queryFileSize(uri: Uri): Long? { + val resolver = context.contentResolver + resolver.query(uri, arrayOf(OpenableColumns.SIZE), null, null, null)?.use { cursor -> + val sizeIndex = cursor.getColumnIndex(OpenableColumns.SIZE) + if (sizeIndex >= 0 && cursor.moveToFirst() && !cursor.isNull(sizeIndex)) { + return cursor.getLong(sizeIndex).takeIf { it >= 0L } + } + } + return null + } + + private fun copyToFileWithLimit(input: InputStream, target: File): Long { + val buffer = ByteArray(DEFAULT_BUFFER_SIZE) + var totalBytes = 0L + target.outputStream().use { output -> + while (true) { + val read = input.read(buffer) + if (read < 0) { + return totalBytes + } + totalBytes += read + if (totalBytes > maxArchiveImportBytes) { + throw IOException("Архив слишком большой: максимум 512 МБ.") + } + output.write(buffer, 0, read) + } + } + } + + private fun sanitizeFileName(value: String): String { + val normalized = Normalizer.normalize(value.trim(), Normalizer.Form.NFKD) + return normalized + .replace(Regex("[^A-Za-z0-9._-]+"), "_") + .trim('_', '.', '-') + .ifBlank { "archive" } + } + + private fun guessMimeType(fileName: String): String { + val extension = fileName.substringAfterLast('.', missingDelimiterValue = "") + .takeIf { it.isNotBlank() } + ?.lowercase() + return extension + ?.let(MimeTypeMap.getSingleton()::getMimeTypeFromExtension) + ?: "application/octet-stream" + } + + companion object { + private const val MaxPreviewEntries = 30 + + fun isSupportedZip(fileName: String?, contentType: String?): Boolean { + val normalizedName = fileName.orEmpty().lowercase() + val normalizedType = contentType.orEmpty().lowercase() + return normalizedName.endsWith(".zip") || + normalizedType == "application/zip" || + normalizedType == "application/x-zip" || + normalizedType == "application/x-zip-compressed" + } + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/archive/ArchiveExtractorScreen.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/archive/ArchiveExtractorScreen.kt new file mode 100644 index 00000000..a67f6e08 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/archive/ArchiveExtractorScreen.kt @@ -0,0 +1,464 @@ +package com.seven.ikar.kotlin.feature.archive + +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.clickable +import androidx.compose.foundation.verticalScroll +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ColumnScope +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.WindowInsetsSides +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.navigationBarsPadding +import androidx.compose.foundation.layout.only +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.safeDrawing +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.windowInsetsPadding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.material3.Button +import androidx.compose.material3.Checkbox +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.LinearProgressIndicator +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedButton +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.RectangleShape +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import com.seven.ikar.kotlin.ui.IkarScreenSurface +import com.seven.ikar.kotlin.ui.IkarSimpleHeader +import com.seven.ikar.kotlin.ui.theme.TelegramBorder +import com.seven.ikar.kotlin.ui.theme.TelegramInkMuted + +@Composable +fun ArchiveExtractorScreen( + state: ArchiveExtractorUiState, + onBackClick: () -> Unit, + onKeepFoldersChanged: (Boolean) -> Unit, + onOverwriteExistingChanged: (Boolean) -> Unit, + onExtractClick: () -> Unit, + onCancelClick: () -> Unit +) { + IkarScreenSurface(modifier = Modifier.fillMaxSize()) { + Column( + modifier = Modifier + .fillMaxSize() + .windowInsetsPadding(WindowInsets.safeDrawing.only(WindowInsetsSides.Top)) + ) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(start = 18.dp, top = 16.dp, end = 18.dp, bottom = 12.dp), + verticalArrangement = Arrangement.spacedBy(12.dp) + ) { + IkarSimpleHeader( + title = "Архив", + onBackClick = onBackClick + ) + } + + Column( + modifier = Modifier + .weight(1f) + .verticalScroll(rememberScrollState()) + .padding(horizontal = 18.dp), + verticalArrangement = Arrangement.spacedBy(12.dp) + ) { + state.openError?.let { error -> + ArchiveErrorPanel( + title = "Не удалось открыть архив", + message = error.message, + fileName = error.fileName + ) + } + + state.archive?.let { archive -> + ArchivePanel { + Text( + text = archive.fileName, + style = MaterialTheme.typography.headlineMedium, + maxLines = 2, + overflow = TextOverflow.Ellipsis + ) + Text( + text = "${formatArchiveBytes(archive.fileSizeBytes)} · ZIP-архив", + style = MaterialTheme.typography.bodyMedium, + color = TelegramInkMuted + ) + } + + ArchivePanel { + Text( + text = "Что будет сделано", + style = MaterialTheme.typography.titleLarge, + fontWeight = FontWeight.SemiBold + ) + Spacer(modifier = Modifier.height(6.dp)) + Text( + text = "Икар распакует файлы в отдельную папку приложения. Опасные пути вида ../ будут пропущены, чтобы архив не смог записать файлы вне папки распаковки.", + style = MaterialTheme.typography.bodyMedium, + color = TelegramInkMuted + ) + } + } + + if (state.isInspecting) { + ArchivePanel { + Row( + modifier = Modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(12.dp) + ) { + CircularProgressIndicator(modifier = Modifier.size(22.dp), strokeWidth = 2.dp) + Text( + text = "Читаю список файлов в архиве...", + style = MaterialTheme.typography.bodyMedium + ) + } + } + } + + state.inspection?.let { inspection -> + ArchivePanel { + Text( + text = "Состав архива", + style = MaterialTheme.typography.titleLarge, + fontWeight = FontWeight.SemiBold + ) + Spacer(modifier = Modifier.height(10.dp)) + ArchiveStatRow("Файлы", inspection.totalFiles.toString()) + ArchiveStatRow("Папки", inspection.totalDirectories.toString()) + ArchiveStatRow("Общий размер", formatArchiveBytes(inspection.knownUncompressedBytes)) + if (inspection.skippedUnsafeEntries > 0) { + ArchiveStatRow("Будет пропущено небезопасных путей", inspection.skippedUnsafeEntries.toString()) + } + } + + ArchivePanel(padding = PaddingValues(0.dp)) { + Column(modifier = Modifier.padding(horizontal = 16.dp, vertical = 14.dp)) { + Text( + text = "Первые файлы", + style = MaterialTheme.typography.titleLarge, + fontWeight = FontWeight.SemiBold + ) + Text( + text = "Показан предварительный список, сама распаковка начнётся только после нажатия кнопки.", + style = MaterialTheme.typography.bodySmall, + color = TelegramInkMuted + ) + } + + if (inspection.previewEntries.isEmpty()) { + Text( + text = "В архиве нет файлов для распаковки.", + modifier = Modifier.padding(horizontal = 16.dp, vertical = 14.dp), + style = MaterialTheme.typography.bodyMedium, + color = TelegramInkMuted + ) + } else { + inspection.previewEntries.forEach { entry -> + ArchiveEntryRow(entry) + } + } + } + + ArchivePanel(padding = PaddingValues(0.dp)) { + ArchiveOptionRow( + title = "Сохранить папки из архива", + subtitle = "Если выключить, все файлы будут сложены в одну папку.", + checked = state.options.keepFolders, + enabled = !state.isExtracting, + onCheckedChange = onKeepFoldersChanged + ) + ArchiveDivider() + ArchiveOptionRow( + title = "Заменять совпадающие файлы", + subtitle = "Если выключить, Икар добавит номер к имени файла и ничего не перезапишет.", + checked = state.options.overwriteExisting, + enabled = !state.isExtracting, + onCheckedChange = onOverwriteExistingChanged + ) + } + } + + state.progress?.let { progress -> + ArchivePanel { + Text( + text = "Распаковка выполняется", + style = MaterialTheme.typography.titleLarge, + fontWeight = FontWeight.SemiBold + ) + Spacer(modifier = Modifier.height(10.dp)) + LinearProgressIndicator(modifier = Modifier.fillMaxWidth()) + Spacer(modifier = Modifier.height(10.dp)) + Text( + text = buildProgressText(progress), + style = MaterialTheme.typography.bodyMedium, + color = TelegramInkMuted + ) + progress.currentEntry?.let { currentEntry -> + Text( + text = currentEntry, + style = MaterialTheme.typography.bodySmall, + color = TelegramInkMuted, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + } + } + } + + state.result?.let { result -> + ArchivePanel { + Text( + text = "Готово", + style = MaterialTheme.typography.titleLarge, + color = MaterialTheme.colorScheme.primary, + fontWeight = FontWeight.SemiBold + ) + Spacer(modifier = Modifier.height(8.dp)) + Text( + text = "Распаковано файлов: ${result.extractedFiles}. Записано: ${formatArchiveBytes(result.writtenBytes)}.", + style = MaterialTheme.typography.bodyMedium + ) + if (result.skippedUnsafeEntries > 0) { + Text( + text = "Пропущено небезопасных путей: ${result.skippedUnsafeEntries}.", + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.error + ) + } + Spacer(modifier = Modifier.height(8.dp)) + Text( + text = result.outputDirectoryPath, + style = MaterialTheme.typography.bodySmall, + color = TelegramInkMuted + ) + } + } + + state.errorMessage?.let { message -> + ArchiveErrorPanel( + title = "Ошибка", + message = message, + fileName = state.archive?.fileName + ) + } + + Spacer(modifier = Modifier.height(8.dp)) + } + + ArchiveActionBar( + state = state, + onExtractClick = onExtractClick, + onCancelClick = onCancelClick + ) + } + } +} + +@Composable +private fun ArchiveActionBar( + state: ArchiveExtractorUiState, + onExtractClick: () -> Unit, + onCancelClick: () -> Unit +) { + Surface( + color = MaterialTheme.colorScheme.surface, + shape = RectangleShape, + shadowElevation = 8.dp + ) { + Column( + modifier = Modifier + .fillMaxWidth() + .navigationBarsPadding() + .padding(horizontal = 18.dp, vertical = 12.dp), + verticalArrangement = Arrangement.spacedBy(10.dp) + ) { + if (state.isExtracting) { + OutlinedButton( + onClick = onCancelClick, + modifier = Modifier.fillMaxWidth() + ) { + Text("Отменить распаковку") + } + } else { + Button( + onClick = onExtractClick, + modifier = Modifier.fillMaxWidth(), + enabled = state.archive != null && state.inspection != null && state.inspection.totalFiles > 0 + ) { + Text("Распаковать ZIP") + } + } + } + } +} + +@Composable +private fun ArchivePanel( + modifier: Modifier = Modifier, + padding: PaddingValues = PaddingValues(16.dp), + content: @Composable ColumnScope.() -> Unit +) { + Surface( + modifier = modifier + .fillMaxWidth() + .border(1.dp, TelegramBorder, RectangleShape), + shape = RectangleShape, + color = MaterialTheme.colorScheme.surface, + shadowElevation = 0.dp + ) { + Column( + modifier = Modifier.padding(padding), + verticalArrangement = Arrangement.spacedBy(0.dp), + content = content + ) + } +} + +@Composable +private fun ArchiveErrorPanel( + title: String, + message: String, + fileName: String? +) { + ArchivePanel { + Text( + text = title, + style = MaterialTheme.typography.titleLarge, + color = MaterialTheme.colorScheme.error, + fontWeight = FontWeight.SemiBold + ) + fileName?.let { + Text( + text = it, + style = MaterialTheme.typography.bodyMedium, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + } + Spacer(modifier = Modifier.height(6.dp)) + Text( + text = message, + style = MaterialTheme.typography.bodyMedium, + color = TelegramInkMuted + ) + } +} + +@Composable +private fun ArchiveStatRow( + title: String, + value: String +) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 4.dp), + horizontalArrangement = Arrangement.spacedBy(12.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = title, + modifier = Modifier.weight(1f), + style = MaterialTheme.typography.bodyMedium, + color = TelegramInkMuted + ) + Text( + text = value, + style = MaterialTheme.typography.titleMedium + ) + } +} + +@Composable +private fun ArchiveEntryRow(entry: ArchiveEntryPreview) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp, vertical = 10.dp), + verticalArrangement = Arrangement.spacedBy(3.dp) + ) { + Text( + text = if (entry.isDirectory) "${entry.name}/" else entry.name, + style = MaterialTheme.typography.bodyMedium, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + Text( + text = if (entry.isDirectory) "папка" else formatArchiveBytes(entry.sizeBytes), + style = MaterialTheme.typography.bodySmall, + color = TelegramInkMuted + ) + } + ArchiveDivider() +} + +@Composable +private fun ArchiveOptionRow( + title: String, + subtitle: String, + checked: Boolean, + enabled: Boolean, + onCheckedChange: (Boolean) -> Unit +) { + Row( + modifier = Modifier + .fillMaxWidth() + .clickable(enabled = enabled) { onCheckedChange(!checked) } + .padding(horizontal = 12.dp, vertical = 12.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(12.dp) + ) { + Checkbox( + checked = checked, + enabled = enabled, + onCheckedChange = onCheckedChange + ) + Column(modifier = Modifier.weight(1f), verticalArrangement = Arrangement.spacedBy(3.dp)) { + Text( + text = title, + style = MaterialTheme.typography.titleMedium + ) + Text( + text = subtitle, + style = MaterialTheme.typography.bodySmall, + color = TelegramInkMuted + ) + } + } +} + +@Composable +private fun ArchiveDivider() { + Box( + modifier = Modifier + .fillMaxWidth() + .height(1.dp) + .background(TelegramBorder) + ) +} + +private fun buildProgressText(progress: ArchiveExtractionProgress): String { + val total = progress.totalEntries.takeIf { it > 0 } + val entryPart = if (total != null) { + "${progress.processedEntries} из $total" + } else { + progress.processedEntries.toString() + } + return "Обработано записей: $entryPart. Файлов: ${progress.extractedFiles}. Записано: ${formatArchiveBytes(progress.writtenBytes)}." +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/archive/ArchiveExtractorViewModel.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/archive/ArchiveExtractorViewModel.kt new file mode 100644 index 00000000..d066f56b --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/archive/ArchiveExtractorViewModel.kt @@ -0,0 +1,172 @@ +package com.seven.ikar.kotlin.feature.archive + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.seven.ikar.kotlin.app.AppContainer +import kotlinx.coroutines.Job +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.launch +import java.text.DecimalFormat + +data class ArchiveExtractorUiState( + val archive: PendingArchiveFile? = null, + val openError: PendingArchiveOpenError? = null, + val inspection: ArchiveInspectionResult? = null, + val options: ArchiveExtractionOptions = ArchiveExtractionOptions(), + val isInspecting: Boolean = false, + val isExtracting: Boolean = false, + val progress: ArchiveExtractionProgress? = null, + val result: ArchiveExtractionResult? = null, + val errorMessage: String? = null +) { + val hasArchive: Boolean + get() = archive != null +} + +class ArchiveExtractorViewModel( + private val container: AppContainer +) : ViewModel() { + private val _uiState = MutableStateFlow(ArchiveExtractorUiState()) + val uiState: StateFlow = _uiState.asStateFlow() + private var extractionJob: Job? = null + + init { + viewModelScope.launch { + container.incomingArchiveStore.pendingArchive.collectLatest { pending -> + when (pending) { + is PendingArchiveFile -> loadArchive(pending) + is PendingArchiveOpenError -> { + extractionJob?.cancel() + _uiState.value = ArchiveExtractorUiState(openError = pending) + } + null -> { + extractionJob?.cancel() + _uiState.value = ArchiveExtractorUiState() + } + } + } + } + } + + fun setKeepFolders(enabled: Boolean) { + val current = _uiState.value + _uiState.value = current.copy( + options = current.options.copy(keepFolders = enabled), + result = null, + errorMessage = null + ) + } + + fun setOverwriteExisting(enabled: Boolean) { + val current = _uiState.value + _uiState.value = current.copy( + options = current.options.copy(overwriteExisting = enabled), + result = null, + errorMessage = null + ) + } + + fun extract() { + val archive = _uiState.value.archive ?: return + if (_uiState.value.isExtracting) { + return + } + + extractionJob = viewModelScope.launch { + _uiState.value = _uiState.value.copy( + isExtracting = true, + progress = ArchiveExtractionProgress( + processedEntries = 0, + totalEntries = _uiState.value.inspection?.totalEntries ?: 0, + extractedFiles = 0, + writtenBytes = 0, + currentEntry = null + ), + result = null, + errorMessage = null + ) + runCatching { + container.archiveFileService.extractZip( + archive = archive, + inspection = _uiState.value.inspection, + options = _uiState.value.options + ) { progress -> + _uiState.value = _uiState.value.copy(progress = progress) + } + }.onSuccess { result -> + _uiState.value = _uiState.value.copy( + isExtracting = false, + progress = null, + result = result, + errorMessage = null + ) + }.onFailure { error -> + _uiState.value = _uiState.value.copy( + isExtracting = false, + progress = null, + result = null, + errorMessage = error.message ?: "Не удалось распаковать архив." + ) + } + } + } + + fun cancelExtraction() { + extractionJob?.cancel() + extractionJob = null + _uiState.value = _uiState.value.copy( + isExtracting = false, + progress = null, + errorMessage = "Распаковка отменена." + ) + } + + fun clearAndClose() { + extractionJob?.cancel() + container.incomingArchiveStore.clear() + } + + private suspend fun loadArchive(archive: PendingArchiveFile) { + extractionJob?.cancel() + _uiState.value = ArchiveExtractorUiState( + archive = archive, + isInspecting = true + ) + runCatching { + container.archiveFileService.inspectZip(archive) + }.onSuccess { inspection -> + _uiState.value = _uiState.value.copy( + isInspecting = false, + inspection = inspection, + errorMessage = null + ) + }.onFailure { error -> + _uiState.value = _uiState.value.copy( + isInspecting = false, + inspection = null, + errorMessage = error.message ?: "Не удалось прочитать ZIP-архив." + ) + } + } +} + +fun formatArchiveBytes(value: Long?): String { + if (value == null || value < 0) { + return "размер неизвестен" + } + if (value == 0L) { + return "0 Б" + } + + val units = listOf("Б", "КБ", "МБ", "ГБ") + var size = value.toDouble() + var unitIndex = 0 + while (size >= 1024 && unitIndex < units.lastIndex) { + size /= 1024 + unitIndex += 1 + } + return "${DecimalFormat("#,##0.#").format(size).replace(',', '.')} ${units[unitIndex]}" +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/archive/IncomingArchiveStore.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/archive/IncomingArchiveStore.kt new file mode 100644 index 00000000..d1d833ac --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/archive/IncomingArchiveStore.kt @@ -0,0 +1,40 @@ +package com.seven.ikar.kotlin.feature.archive + +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow + +sealed interface PendingArchiveOpen { + val id: Long +} + +data class PendingArchiveFile( + override val id: Long = System.nanoTime(), + val fileName: String, + val contentType: String, + val fileSizeBytes: Long, + val localPath: String +) : PendingArchiveOpen + +data class PendingArchiveOpenError( + override val id: Long = System.nanoTime(), + val fileName: String?, + val message: String +) : PendingArchiveOpen + +class IncomingArchiveStore { + private val _pendingArchive = MutableStateFlow(null) + val pendingArchive: StateFlow = _pendingArchive.asStateFlow() + + fun setPending(file: PendingArchiveFile) { + _pendingArchive.value = file + } + + fun setError(message: String, fileName: String? = null) { + _pendingArchive.value = PendingArchiveOpenError(fileName = fileName, message = message) + } + + fun clear() { + _pendingArchive.value = null + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/bots/BotEditorScreen.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/bots/BotEditorScreen.kt new file mode 100644 index 00000000..ce301e7c --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/bots/BotEditorScreen.kt @@ -0,0 +1,197 @@ +package com.seven.ikar.kotlin.feature.bots + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.ArrowBack +import androidx.compose.material.icons.outlined.ContentCopy +import androidx.compose.material.icons.outlined.Delete +import androidx.compose.material.icons.outlined.SmartToy +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.Card +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedButton +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Switch +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.material3.TopAppBar +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalClipboardManager +import androidx.compose.ui.text.AnnotatedString +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun BotEditorScreen( + state: BotEditorUiState, + onBackClick: () -> Unit, + onDisplayNameChanged: (String) -> Unit, + onUsernameChanged: (String) -> Unit, + onAboutChanged: (String) -> Unit, + onCommandsChanged: (String) -> Unit, + onEnabledChanged: (Boolean) -> Unit, + onSaveClick: () -> Unit, + onRegenerateTokenClick: () -> Unit, + onDeleteBotClick: () -> Unit, + onOpenChatClick: () -> Unit +) { + val clipboardManager = LocalClipboardManager.current + var showDeleteConfirmation by remember { mutableStateOf(false) } + if (showDeleteConfirmation) { + AlertDialog( + onDismissRequest = { showDeleteConfirmation = false }, + title = { Text("Удалить бота?") }, + text = { Text("Бот будет удалён из управления, его токен и команды перестанут работать. История сообщений останется в чатах.") }, + confirmButton = { + TextButton( + onClick = { + showDeleteConfirmation = false + onDeleteBotClick() + }, + colors = ButtonDefaults.textButtonColors(contentColor = MaterialTheme.colorScheme.error) + ) { + Text("Удалить") + } + }, + dismissButton = { + TextButton(onClick = { showDeleteConfirmation = false }) { + Text("Отмена") + } + } + ) + } + Scaffold( + topBar = { + TopAppBar( + title = { Text(if (state.isExistingBot) "Редактор бота" else "Новый бот") }, + navigationIcon = { + IconButton(onClick = onBackClick) { + Icon(Icons.AutoMirrored.Outlined.ArrowBack, contentDescription = "Назад") + } + } + ) + } + ) { innerPadding -> + Column( + modifier = Modifier + .fillMaxSize() + .padding(innerPadding) + .verticalScroll(rememberScrollState()) + .padding(16.dp), + verticalArrangement = Arrangement.spacedBy(14.dp) + ) { + state.errorMessage?.let { + Text(it, color = MaterialTheme.colorScheme.error) + } + state.infoMessage?.let { + Text(it, color = MaterialTheme.colorScheme.primary, fontWeight = FontWeight.SemiBold) + } + + Card(modifier = Modifier.fillMaxWidth()) { + Column(modifier = Modifier.padding(16.dp), verticalArrangement = Arrangement.spacedBy(12.dp)) { + Icon(Icons.Outlined.SmartToy, contentDescription = null, tint = MaterialTheme.colorScheme.primary) + OutlinedTextField( + value = state.displayName, + onValueChange = onDisplayNameChanged, + modifier = Modifier.fillMaxWidth(), + label = { Text("Отображаемое имя") } + ) + OutlinedTextField( + value = state.username, + onValueChange = onUsernameChanged, + modifier = Modifier.fillMaxWidth(), + enabled = !state.isExistingBot, + label = { Text("Имя пользователя") }, + prefix = { Text("@") } + ) + OutlinedTextField( + value = state.about, + onValueChange = onAboutChanged, + modifier = Modifier.fillMaxWidth(), + minLines = 3, + label = { Text("О боте") } + ) + androidx.compose.foundation.layout.Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text("Бот активен") + Switch(checked = state.isEnabled, onCheckedChange = onEnabledChanged) + } + OutlinedTextField( + value = state.commandsText, + onValueChange = onCommandsChanged, + modifier = Modifier.fillMaxWidth(), + minLines = 5, + label = { Text("Команды") }, + supportingText = { Text("Формат: /help - описание") } + ) + } + } + + Button(onClick = onSaveClick, enabled = !state.isSaving && !state.isDeleting, modifier = Modifier.fillMaxWidth()) { + Text(if (state.isSaving) "Сохранение..." else "Сохранить") + } + + if (state.isExistingBot) { + OutlinedButton( + onClick = onRegenerateTokenClick, + enabled = !state.isDeleting && !state.isSaving, + modifier = Modifier.fillMaxWidth() + ) { + Text("Сгенерировать новый токен") + } + OutlinedButton( + onClick = onOpenChatClick, + enabled = !state.isDeleting && !state.isSaving, + modifier = Modifier.fillMaxWidth() + ) { + Text("Открыть чат с ботом") + } + OutlinedButton( + onClick = { showDeleteConfirmation = true }, + enabled = !state.isDeleting && !state.isSaving, + modifier = Modifier.fillMaxWidth(), + colors = ButtonDefaults.outlinedButtonColors(contentColor = MaterialTheme.colorScheme.error) + ) { + Icon(Icons.Outlined.Delete, contentDescription = null) + Text(if (state.isDeleting) "Удаление..." else "Удалить бота") + } + } + + if (state.latestToken.isNotBlank()) { + Card(modifier = Modifier.fillMaxWidth()) { + Column(modifier = Modifier.padding(16.dp), verticalArrangement = Arrangement.spacedBy(8.dp)) { + Text("Текущий токен", fontWeight = FontWeight.SemiBold) + Text(state.latestToken, style = MaterialTheme.typography.bodySmall) + OutlinedButton( + onClick = { clipboardManager.setText(AnnotatedString(state.latestToken)) }, + modifier = Modifier.fillMaxWidth() + ) { + Icon(Icons.Outlined.ContentCopy, contentDescription = null) + Text("Скопировать токен") + } + } + } + } + } + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/bots/BotEditorViewModel.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/bots/BotEditorViewModel.kt new file mode 100644 index 00000000..4ad0021f --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/bots/BotEditorViewModel.kt @@ -0,0 +1,236 @@ +package com.seven.ikar.kotlin.feature.bots + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.seven.ikar.kotlin.app.AppContainer +import com.seven.ikar.kotlin.core.model.AuthSessionDto +import com.seven.ikar.kotlin.core.model.BotCommandDto +import com.seven.ikar.kotlin.core.model.BotSummaryDto +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch + +data class BotEditorUiState( + val session: AuthSessionDto? = null, + val botId: String? = null, + val botUserId: String? = null, + val displayName: String = "", + val username: String = "", + val about: String = "", + val isEnabled: Boolean = true, + val commandsText: String = "", + val latestToken: String = "", + val isLoading: Boolean = false, + val isSaving: Boolean = false, + val isDeleting: Boolean = false, + val errorMessage: String? = null, + val infoMessage: String? = null, + val pendingChatId: String? = null, + val deleteCompleted: Boolean = false +) { + val isExistingBot: Boolean get() = !botId.isNullOrBlank() +} + +class BotEditorViewModel( + private val container: AppContainer, + private val botId: String? +) : ViewModel() { + private val _uiState = MutableStateFlow(BotEditorUiState(session = container.sessionStore.read(), botId = botId)) + val uiState: StateFlow = _uiState.asStateFlow() + + init { + load() + } + + fun updateDisplayName(value: String) { + _uiState.value = _uiState.value.copy(displayName = value) + } + + fun updateUsername(value: String) { + _uiState.value = _uiState.value.copy(username = value) + } + + fun updateAbout(value: String) { + _uiState.value = _uiState.value.copy(about = value) + } + + fun updateCommandsText(value: String) { + _uiState.value = _uiState.value.copy(commandsText = value) + } + + fun updateEnabled(value: Boolean) { + _uiState.value = _uiState.value.copy(isEnabled = value) + } + + fun load() { + val existingBotId = botId ?: return + viewModelScope.launch { + _uiState.value = _uiState.value.copy(isLoading = true, errorMessage = null) + runCatching { + container.executeAuthorized { session -> + session to container.apiClient.getBot(session.accessToken, existingBotId) + } + }.onSuccess { (session, bot) -> + applyBot(session, bot, latestToken = "", infoMessage = null) + }.onFailure { error -> + _uiState.value = _uiState.value.copy(isLoading = false, errorMessage = error.message) + } + } + } + + fun save() { + val state = _uiState.value + if (state.displayName.isBlank()) { + _uiState.value = state.copy(errorMessage = "Укажите отображаемое имя бота.") + return + } + if (!state.isExistingBot && state.username.isBlank()) { + _uiState.value = state.copy(errorMessage = "Укажите имя пользователя бота.") + return + } + + viewModelScope.launch { + _uiState.value = state.copy(isSaving = true, errorMessage = null, infoMessage = null) + runCatching { + container.executeAuthorized { session -> + val parsedCommands = parseCommands(state.commandsText) + if (!state.isExistingBot) { + val created = container.apiClient.createBot( + accessToken = session.accessToken, + username = state.username.trim(), + displayName = state.displayName.trim(), + about = state.about.trim().ifBlank { null } + ) + val updatedBot = if (parsedCommands.isNotEmpty()) { + container.apiClient.setBotCommands(session.accessToken, created.bot.id, parsedCommands) + } else { + created.bot + } + Triple(session, updatedBot, Pair(created.accessToken, "Бот создан.")) + } else { + val updated = container.apiClient.updateBot( + accessToken = session.accessToken, + botId = state.botId.orEmpty(), + displayName = state.displayName.trim(), + about = state.about.trim().ifBlank { null }, + isEnabled = state.isEnabled + ) + val withCommands = container.apiClient.setBotCommands( + accessToken = session.accessToken, + botId = updated.id, + commands = parsedCommands + ) + Triple(session, withCommands, Pair(state.latestToken, "Бот сохранён.")) + } + } + }.onSuccess { result -> + val (session, bot, extra) = result + applyBot(session, bot, latestToken = extra.first, infoMessage = extra.second) + }.onFailure { error -> + _uiState.value = _uiState.value.copy(isSaving = false, errorMessage = error.message) + } + } + } + + fun regenerateToken() { + val existingBotId = _uiState.value.botId ?: return + viewModelScope.launch { + runCatching { + container.executeAuthorized { session -> + container.apiClient.regenerateBotToken(session.accessToken, existingBotId) + } + }.onSuccess { response -> + _uiState.value = _uiState.value.copy(latestToken = response.accessToken, infoMessage = "Токен обновлён.") + }.onFailure { error -> + _uiState.value = _uiState.value.copy(errorMessage = error.message) + } + } + } + + fun deleteBot() { + val existingBotId = _uiState.value.botId ?: return + val state = _uiState.value + if (state.isDeleting || state.isSaving) { + return + } + + viewModelScope.launch { + _uiState.value = state.copy(isDeleting = true, errorMessage = null, infoMessage = null) + runCatching { + container.executeAuthorized { session -> + container.apiClient.deleteBot(session.accessToken, existingBotId) + } + }.onSuccess { + _uiState.value = _uiState.value.copy(isDeleting = false, deleteCompleted = true) + }.onFailure { error -> + _uiState.value = _uiState.value.copy(isDeleting = false, errorMessage = error.message) + } + } + } + + fun openChat() { + val botUserId = _uiState.value.botUserId ?: return + viewModelScope.launch { + runCatching { + container.executeAuthorized { session -> + container.apiClient.createDirectChat(session.accessToken, botUserId) + } + }.onSuccess { chat -> + _uiState.value = _uiState.value.copy(pendingChatId = chat.id) + }.onFailure { error -> + _uiState.value = _uiState.value.copy(errorMessage = error.message) + } + } + } + + fun consumePendingChatNavigation() { + _uiState.value = _uiState.value.copy(pendingChatId = null) + } + + fun consumeDeleteCompleted() { + _uiState.value = _uiState.value.copy(deleteCompleted = false) + } + + private fun applyBot(session: AuthSessionDto, bot: BotSummaryDto, latestToken: String, infoMessage: String?) { + _uiState.value = _uiState.value.copy( + session = session, + botId = bot.id, + botUserId = bot.userId, + displayName = bot.displayName, + username = bot.username, + about = bot.about.orEmpty(), + isEnabled = bot.isEnabled, + commandsText = formatCommands(bot.commands), + latestToken = latestToken, + isLoading = false, + isSaving = false, + isDeleting = false, + errorMessage = null, + infoMessage = infoMessage, + deleteCompleted = false + ) + } + + private fun parseCommands(source: String): List = + source + .lines() + .map { it.trim() } + .filter { it.isNotBlank() } + .mapNotNull { line -> + val separatorIndex = line.indexOf(" - ").takeIf { it > 0 } + ?: line.indexOf(' ').takeIf { it > 0 } + ?: return@mapNotNull null + val separatorLength = if (line.contains(" - ")) 3 else 1 + val command = line.substring(0, separatorIndex).trim().trimStart('/') + val description = line.substring(separatorIndex + separatorLength).trim() + if (command.isBlank() || description.isBlank()) { + null + } else { + BotCommandDto(command = command, description = description) + } + } + + private fun formatCommands(commands: List): String = + commands.joinToString(separator = "\n") { "/${it.command} - ${it.description}" } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/bots/BotsScreen.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/bots/BotsScreen.kt new file mode 100644 index 00000000..4cb885f9 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/bots/BotsScreen.kt @@ -0,0 +1,137 @@ +package com.seven.ikar.kotlin.feature.bots + +import androidx.compose.foundation.Image +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.WindowInsetsSides +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.only +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.safeDrawing +import androidx.compose.foundation.layout.windowInsetsPadding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.ArrowBack +import androidx.compose.material.icons.outlined.Add +import androidx.compose.material3.Icon +import androidx.compose.material3.Button +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.unit.dp +import com.seven.ikar.kotlin.R +import com.seven.ikar.kotlin.core.model.BotSummaryDto +import com.seven.ikar.kotlin.ui.IkarCenteredHeader +import com.seven.ikar.kotlin.ui.IkarHeaderIconBubble +import com.seven.ikar.kotlin.ui.IkarScreenSurface +import com.seven.ikar.kotlin.ui.IkarSectionCard +import com.seven.ikar.kotlin.ui.theme.TelegramBlue +import com.seven.ikar.kotlin.ui.theme.TelegramInkMuted + +@Composable +fun BotsScreen( + state: BotsUiState, + onBackClick: () -> Unit, + onCreateBotClick: () -> Unit, + onBotClick: (BotSummaryDto) -> Unit +) { + IkarScreenSurface(modifier = Modifier.fillMaxSize()) { + Column( + modifier = Modifier + .fillMaxSize() + .windowInsetsPadding(WindowInsets.safeDrawing.only(WindowInsetsSides.Vertical)) + ) { + Column( + modifier = Modifier.padding(start = 18.dp, top = 18.dp, end = 18.dp, bottom = 14.dp), + verticalArrangement = Arrangement.spacedBy(14.dp) + ) { + IkarCenteredHeader( + title = "Боты", + left = { + IkarHeaderIconBubble(onClick = onBackClick) { + Icon(Icons.AutoMirrored.Outlined.ArrowBack, contentDescription = "Назад", tint = MaterialTheme.colorScheme.onSurface) + } + }, + right = { + IkarHeaderIconBubble { + Image( + painter = painterResource(id = R.drawable.dotnet_bot), + contentDescription = "API ботов", + modifier = Modifier.align(Alignment.Center) + ) + } + } + ) + + Button(onClick = onCreateBotClick) { + Text("Создать бота") + } + + state.errorMessage?.let { + Text(it, color = MaterialTheme.colorScheme.error, style = MaterialTheme.typography.bodyMedium) + } + } + + LazyColumn( + modifier = Modifier + .fillMaxSize() + .padding(horizontal = 18.dp), + verticalArrangement = Arrangement.spacedBy(10.dp) + ) { + if (state.bots.isEmpty()) { + item { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 24.dp, vertical = 48.dp), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(8.dp) + ) { + Text("Ботов пока нет", style = MaterialTheme.typography.headlineMedium) + Text( + "Создайте первого бота и подключите его через Bot API.", + style = MaterialTheme.typography.bodyMedium, + color = TelegramInkMuted + ) + } + } + } else { + items(state.bots, key = { it.id }) { bot -> + IkarSectionCard( + modifier = Modifier + .fillMaxWidth() + .clickable { onBotClick(bot) } + ) { + Column(verticalArrangement = Arrangement.spacedBy(10.dp)) { + Column(verticalArrangement = Arrangement.spacedBy(2.dp)) { + Text(bot.displayName, style = MaterialTheme.typography.headlineMedium) + Text("@${bot.username}", style = MaterialTheme.typography.bodySmall, color = TelegramBlue) + } + Text(bot.about.orEmpty().ifBlank { "Без описания" }, style = MaterialTheme.typography.bodySmall, color = TelegramInkMuted) + Text( + if (bot.commands.isEmpty()) "Команд пока нет" else "Команд: ${bot.commands.joinToString { it.command }}", + style = MaterialTheme.typography.bodySmall, + color = TelegramInkMuted + ) + Text( + if (bot.isEnabled) "Включён" else "Выключен", + style = MaterialTheme.typography.labelLarge, + color = TelegramBlue + ) + } + } + } + } + } + } + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/bots/BotsViewModel.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/bots/BotsViewModel.kt new file mode 100644 index 00000000..6351b3d2 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/bots/BotsViewModel.kt @@ -0,0 +1,40 @@ +package com.seven.ikar.kotlin.feature.bots + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.seven.ikar.kotlin.app.AppContainer +import com.seven.ikar.kotlin.core.model.BotSummaryDto +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch + +data class BotsUiState( + val bots: List = emptyList(), + val isLoading: Boolean = false, + val errorMessage: String? = null +) + +class BotsViewModel(private val container: AppContainer) : ViewModel() { + private val _uiState = MutableStateFlow(BotsUiState()) + val uiState: StateFlow = _uiState.asStateFlow() + + init { + refresh() + } + + fun refresh() { + viewModelScope.launch { + _uiState.value = _uiState.value.copy(isLoading = true, errorMessage = null) + runCatching { + container.executeAuthorized { session -> + container.apiClient.getMyBots(session.accessToken) + } + }.onSuccess { bots -> + _uiState.value = _uiState.value.copy(bots = bots, isLoading = false, errorMessage = null) + }.onFailure { error -> + _uiState.value = _uiState.value.copy(isLoading = false, errorMessage = error.message) + } + } + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/call/AndroidCallTonePlayer.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/call/AndroidCallTonePlayer.kt new file mode 100644 index 00000000..179939ca --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/call/AndroidCallTonePlayer.kt @@ -0,0 +1,46 @@ +package com.seven.ikar.kotlin.feature.call + +import android.media.AudioManager +import android.media.ToneGenerator + +class AndroidCallTonePlayer { + private var toneGenerator: ToneGenerator? = null + private var isOutgoingRingbackActive: Boolean = false + + fun startOutgoingRingback() { + if (isOutgoingRingbackActive) { + return + } + + val generator = runCatching { + ToneGenerator(AudioManager.STREAM_RING, OUTGOING_RINGBACK_VOLUME) + }.getOrNull() ?: return + + stopOutgoingRingback() + toneGenerator = generator + isOutgoingRingbackActive = true + + val started = generator.startTone( + ToneGenerator.TONE_CDMA_NETWORK_USA_RINGBACK, + OUTGOING_RINGBACK_DURATION_MS + ) + if (!started) { + generator.startTone( + ToneGenerator.TONE_SUP_RINGTONE, + OUTGOING_RINGBACK_DURATION_MS + ) + } + } + + fun stopOutgoingRingback() { + isOutgoingRingbackActive = false + toneGenerator?.runCatching { stopTone() } + toneGenerator?.release() + toneGenerator = null + } + + companion object { + private const val OUTGOING_RINGBACK_VOLUME = 80 + private const val OUTGOING_RINGBACK_DURATION_MS = 120_000 + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/call/AndroidWebRtcCallService.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/call/AndroidWebRtcCallService.kt new file mode 100644 index 00000000..fceb195e --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/call/AndroidWebRtcCallService.kt @@ -0,0 +1,587 @@ +package com.seven.ikar.kotlin.feature.call + +import android.content.Context +import android.media.AudioDeviceInfo +import android.media.AudioManager +import android.os.Build +import com.seven.ikar.kotlin.core.model.CallAnswerDto +import com.seven.ikar.kotlin.core.model.CallIceCandidateDto +import com.seven.ikar.kotlin.core.model.CallIceServerDto +import com.seven.ikar.kotlin.core.model.CallMediaType +import com.seven.ikar.kotlin.core.model.CallOfferDto +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.launch +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock +import kotlinx.coroutines.suspendCancellableCoroutine +import org.webrtc.AudioSource +import org.webrtc.AudioTrack +import org.webrtc.Camera1Enumerator +import org.webrtc.Camera2Enumerator +import org.webrtc.CameraEnumerator +import org.webrtc.CameraVideoCapturer +import org.webrtc.DataChannel +import org.webrtc.DefaultVideoDecoderFactory +import org.webrtc.DefaultVideoEncoderFactory +import org.webrtc.EglBase +import org.webrtc.IceCandidate +import org.webrtc.MediaConstraints +import org.webrtc.MediaStream +import org.webrtc.MediaStreamTrack +import org.webrtc.PeerConnection +import org.webrtc.PeerConnectionFactory +import org.webrtc.RtpReceiver +import org.webrtc.RtpTransceiver +import org.webrtc.SdpObserver +import org.webrtc.SessionDescription +import org.webrtc.SurfaceTextureHelper +import org.webrtc.VideoCapturer +import org.webrtc.VideoSource +import org.webrtc.VideoTrack +import org.webrtc.audio.JavaAudioDeviceModule +import kotlin.coroutines.resume +import kotlin.coroutines.resumeWithException + +data class CallVideoRenderState( + val eglBaseContext: EglBase.Context?, + val localVideoTrack: VideoTrack? = null, + val remoteVideoTrack: VideoTrack? = null +) + +class AndroidWebRtcCallService( + context: Context +) { + private val appContext = context.applicationContext + private val scope = CoroutineScope(SupervisorJob() + Dispatchers.Default) + private val audioManager = appContext.getSystemService(Context.AUDIO_SERVICE) as AudioManager + private val mutex = Mutex() + private val eglBase: EglBase = EglBase.create() + private val peerConnectionFactory: PeerConnectionFactory by lazy(::createPeerConnectionFactory) + + private var peerConnection: PeerConnection? = null + private var callId: String? = null + private var mediaType: CallMediaType? = null + private var audioSource: AudioSource? = null + private var localAudioTrack: AudioTrack? = null + private var videoSource: VideoSource? = null + private var localVideoTrack: VideoTrack? = null + private var remoteVideoTrack: VideoTrack? = null + private var surfaceTextureHelper: SurfaceTextureHelper? = null + private var videoCapturer: VideoCapturer? = null + private var sendOffer: (suspend (CallOfferDto) -> Unit)? = null + private var sendAnswer: (suspend (CallAnswerDto) -> Unit)? = null + private var sendIceCandidate: (suspend (CallIceCandidateDto) -> Unit)? = null + private var remoteDescriptionApplied = false + private var pendingRemoteOffer: CallOfferDto? = null + private var pendingRemoteAnswer: CallAnswerDto? = null + private val pendingRemoteIceCandidates = mutableListOf() + private var previousAudioMode: Int = AudioManager.MODE_NORMAL + private var previousSpeakerphoneState: Boolean = false + private var previousCommunicationDeviceType: Int? = null + + var onRenderStateChanged: ((CallVideoRenderState?) -> Unit)? = null + var onConnectionFailure: ((String) -> Unit)? = null + + suspend fun start( + callId: String, + mediaType: CallMediaType, + iceServers: List, + shouldCreateOffer: Boolean, + sendOffer: suspend (CallOfferDto) -> Unit, + sendAnswer: suspend (CallAnswerDto) -> Unit, + sendIceCandidate: suspend (CallIceCandidateDto) -> Unit + ) { + mutex.withLock { + stopInternal() + + this.callId = callId + this.mediaType = mediaType + this.sendOffer = sendOffer + this.sendAnswer = sendAnswer + this.sendIceCandidate = sendIceCandidate + remoteDescriptionApplied = false + previousAudioMode = audioManager.mode + previousSpeakerphoneState = audioManager.isSpeakerphoneOn + previousCommunicationDeviceType = + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + audioManager.communicationDevice?.type + } else { + null + } + + preparePeerConnection(iceServers) + prepareLocalMedia(mediaType) + applyAudioRoutingForCurrentMediaType() + publishRenderState() + + if (shouldCreateOffer) { + createAndSendOffer(callId) + } else { + pendingRemoteOffer?.let { + pendingRemoteOffer = null + handleRemoteOfferLocked(it) + } + } + + pendingRemoteAnswer?.let { + pendingRemoteAnswer = null + handleRemoteAnswerLocked(it) + } + } + } + + suspend fun handleRemoteOffer(payload: CallOfferDto) { + mutex.withLock { + if (callId != payload.callId || peerConnection == null) { + pendingRemoteOffer = payload + return + } + + handleRemoteOfferLocked(payload) + } + } + + suspend fun handleRemoteAnswer(payload: CallAnswerDto) { + mutex.withLock { + if (callId != payload.callId || peerConnection == null) { + pendingRemoteAnswer = payload + return + } + + handleRemoteAnswerLocked(payload) + } + } + + suspend fun handleRemoteIceCandidate(payload: CallIceCandidateDto) { + mutex.withLock { + if (callId != payload.callId || peerConnection == null) { + pendingRemoteIceCandidates += payload + return + } + + if (!remoteDescriptionApplied) { + pendingRemoteIceCandidates += payload + return + } + + peerConnection?.addIceCandidate(payload.toNative()) + } + } + + suspend fun stop() { + mutex.withLock { + stopInternal() + } + } + + private fun preparePeerConnection(iceServers: List) { + val rtcConfiguration = PeerConnection.RTCConfiguration( + iceServers.map { it.toNative() } + ).apply { + sdpSemantics = PeerConnection.SdpSemantics.UNIFIED_PLAN + continualGatheringPolicy = PeerConnection.ContinualGatheringPolicy.GATHER_CONTINUALLY + } + val createdPeerConnection = peerConnectionFactory.createPeerConnection( + rtcConfiguration, + object : PeerConnection.Observer { + override fun onSignalingChange(newState: PeerConnection.SignalingState?) = Unit + + override fun onIceConnectionChange(newState: PeerConnection.IceConnectionState?) = Unit + + override fun onIceConnectionReceivingChange(receiving: Boolean) = Unit + + override fun onIceGatheringChange(newState: PeerConnection.IceGatheringState?) = Unit + + override fun onIceCandidate(candidate: IceCandidate?) { + val activeCallId = callId ?: return + val activeCandidate = candidate ?: return + val sender = sendIceCandidate ?: return + scope.launch { + sender( + CallIceCandidateDto( + callId = activeCallId, + candidate = activeCandidate.sdp, + sdpMid = activeCandidate.sdpMid, + sdpMLineIndex = activeCandidate.sdpMLineIndex + ) + ) + } + } + + override fun onIceCandidatesRemoved(candidates: Array?) = Unit + + override fun onAddStream(stream: MediaStream?) = Unit + + override fun onRemoveStream(stream: MediaStream?) = Unit + + override fun onDataChannel(dataChannel: DataChannel?) = Unit + + override fun onRenegotiationNeeded() = Unit + + override fun onAddTrack(receiver: RtpReceiver?, mediaStreams: Array?) { + receiver?.track()?.let(::handleRemoteTrack) + } + + override fun onTrack(transceiver: RtpTransceiver?) { + transceiver?.receiver?.track()?.let(::handleRemoteTrack) + } + + override fun onConnectionChange(newState: PeerConnection.PeerConnectionState?) { + if (newState == PeerConnection.PeerConnectionState.FAILED || + newState == PeerConnection.PeerConnectionState.CLOSED + ) { + onConnectionFailure?.invoke("WebRTC соединение завершилось: $newState") + } + } + } + ) + check(createdPeerConnection != null) { "Не удалось создать PeerConnection." } + peerConnection = createdPeerConnection + } + + private suspend fun handleRemoteOfferLocked(payload: CallOfferDto) { + val activePeerConnection = requireNotNull(peerConnection) { "PeerConnection не создан." } + setRemoteDescription(activePeerConnection, payload.toSessionDescription()) + remoteDescriptionApplied = true + flushPendingIceCandidatesLocked() + val answer = createAnswer(activePeerConnection, mediaType == CallMediaType.Video) + setLocalDescription(activePeerConnection, answer) + val sender = requireNotNull(sendAnswer) + sender(CallAnswerDto(payload.callId, answer.type.canonicalForm(), answer.description)) + } + + private suspend fun handleRemoteAnswerLocked(payload: CallAnswerDto) { + val activePeerConnection = requireNotNull(peerConnection) { "PeerConnection не создан." } + setRemoteDescription(activePeerConnection, payload.toSessionDescription()) + remoteDescriptionApplied = true + flushPendingIceCandidatesLocked() + } + + private suspend fun flushPendingIceCandidatesLocked() { + val activePeerConnection = peerConnection ?: return + val iterator = pendingRemoteIceCandidates.toList() + pendingRemoteIceCandidates.clear() + iterator.forEach { candidate -> + activePeerConnection.addIceCandidate(candidate.toNative()) + } + } + + private fun prepareLocalMedia(mediaType: CallMediaType) { + val activePeerConnection = requireNotNull(peerConnection) { "PeerConnection не создан." } + val newAudioSource = peerConnectionFactory.createAudioSource(MediaConstraints()) + val newLocalAudioTrack = peerConnectionFactory.createAudioTrack(AUDIO_TRACK_ID, newAudioSource) + activePeerConnection.addTrack(newLocalAudioTrack) + audioSource = newAudioSource + localAudioTrack = newLocalAudioTrack + + if (mediaType != CallMediaType.Video) { + return + } + + val capturer = createVideoCapturer() + val helper = SurfaceTextureHelper.create("IkarCaptureThread", eglBase.eglBaseContext) + val newVideoSource = peerConnectionFactory.createVideoSource(capturer.isScreencast) + capturer.initialize(helper, appContext, newVideoSource.capturerObserver) + capturer.startCapture(VIDEO_WIDTH, VIDEO_HEIGHT, VIDEO_FPS) + val newLocalVideoTrack = peerConnectionFactory.createVideoTrack(VIDEO_TRACK_ID, newVideoSource) + activePeerConnection.addTrack(newLocalVideoTrack) + videoCapturer = capturer + surfaceTextureHelper = helper + videoSource = newVideoSource + localVideoTrack = newLocalVideoTrack + } + + private suspend fun createAndSendOffer(callId: String) { + val activePeerConnection = requireNotNull(peerConnection) { "PeerConnection не создан." } + val offer = createOffer(activePeerConnection, mediaType == CallMediaType.Video) + setLocalDescription(activePeerConnection, offer) + val sender = requireNotNull(sendOffer) + sender(CallOfferDto(callId, offer.type.canonicalForm(), offer.description)) + } + + private fun handleRemoteTrack(track: MediaStreamTrack) { + when (track) { + is AudioTrack -> { + track.setEnabled(true) + applyAudioRoutingForCurrentMediaType() + } + is VideoTrack -> { + remoteVideoTrack = track + applyAudioRoutingForCurrentMediaType() + publishRenderState() + } + } + } + + private fun publishRenderState() { + onRenderStateChanged?.invoke( + if (mediaType == CallMediaType.Video) { + CallVideoRenderState( + eglBaseContext = eglBase.eglBaseContext, + localVideoTrack = localVideoTrack, + remoteVideoTrack = remoteVideoTrack + ) + } else { + null + } + ) + } + + private fun stopInternal() { + pendingRemoteOffer = null + pendingRemoteAnswer = null + pendingRemoteIceCandidates.clear() + remoteDescriptionApplied = false + + runCatching { videoCapturer?.stopCapture() } + runCatching { videoCapturer?.dispose() } + runCatching { localVideoTrack?.dispose() } + runCatching { videoSource?.dispose() } + runCatching { surfaceTextureHelper?.dispose() } + runCatching { localAudioTrack?.dispose() } + runCatching { audioSource?.dispose() } + runCatching { peerConnection?.dispose() } + + peerConnection = null + callId = null + mediaType = null + audioSource = null + localAudioTrack = null + videoSource = null + localVideoTrack = null + remoteVideoTrack = null + surfaceTextureHelper = null + videoCapturer = null + sendOffer = null + sendAnswer = null + sendIceCandidate = null + + restorePreviousAudioRouting() + audioManager.mode = previousAudioMode + publishRenderState() + } + + private fun applyAudioRoutingForCurrentMediaType() { + audioManager.mode = AudioManager.MODE_IN_COMMUNICATION + audioManager.isMicrophoneMute = false + + if (mediaType == CallMediaType.Video) { + runCatching { audioManager.stopBluetoothSco() } + runCatching { audioManager.setBluetoothScoOn(false) } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + val speakerDevice = audioManager.getAvailableCommunicationDevices().firstOrNull { + it.type == AudioDeviceInfo.TYPE_BUILTIN_SPEAKER || + it.type == AudioDeviceInfo.TYPE_BUILTIN_SPEAKER_SAFE + } + if (speakerDevice != null) { + audioManager.setCommunicationDevice(speakerDevice) + } else { + audioManager.clearCommunicationDevice() + } + } + audioManager.isSpeakerphoneOn = true + } else { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + audioManager.clearCommunicationDevice() + } + audioManager.isSpeakerphoneOn = false + } + } + + private fun restorePreviousAudioRouting() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + val previousDevice = previousCommunicationDeviceType?.let { previousType -> + audioManager.getAvailableCommunicationDevices().firstOrNull { it.type == previousType } + } + if (previousDevice != null) { + audioManager.setCommunicationDevice(previousDevice) + } else { + audioManager.clearCommunicationDevice() + } + } + audioManager.isSpeakerphoneOn = previousSpeakerphoneState + previousCommunicationDeviceType = null + } + + private fun createPeerConnectionFactory(): PeerConnectionFactory { + ensureFactoryInitialized(appContext) + val audioDeviceModule = JavaAudioDeviceModule.builder(appContext) + .setUseHardwareAcousticEchoCanceler(true) + .setUseHardwareNoiseSuppressor(true) + .createAudioDeviceModule() + + return try { + PeerConnectionFactory.builder() + .setAudioDeviceModule(audioDeviceModule) + .setVideoEncoderFactory(DefaultVideoEncoderFactory(eglBase.eglBaseContext, true, true)) + .setVideoDecoderFactory(DefaultVideoDecoderFactory(eglBase.eglBaseContext)) + .createPeerConnectionFactory() + } finally { + audioDeviceModule.release() + } + } + + private fun createVideoCapturer(): VideoCapturer { + val enumerator: CameraEnumerator = + if (Camera2Enumerator.isSupported(appContext)) { + Camera2Enumerator(appContext) + } else { + Camera1Enumerator(true) + } + + val preferredDevice = enumerator.deviceNames.firstOrNull { enumerator.isFrontFacing(it) } + ?: enumerator.deviceNames.firstOrNull() + ?: error("На устройстве нет камеры для видеозвонка.") + + return (enumerator.createCapturer(preferredDevice, null) as? CameraVideoCapturer) + ?: error("Не удалось подготовить видеокапчер для звонка.") + } + + private suspend fun createOffer( + peerConnection: PeerConnection, + offerToReceiveVideo: Boolean + ): SessionDescription = + suspendCancellableCoroutine { continuation -> + peerConnection.createOffer(object : SdpObserver { + override fun onCreateSuccess(description: SessionDescription?) { + val activeDescription = description ?: return continuation.resumeWithException( + IllegalStateException("WebRTC offer не был создан.") + ) + continuation.resume(activeDescription) + } + + override fun onSetSuccess() = Unit + + override fun onCreateFailure(error: String?) { + continuation.resumeWithException(IllegalStateException(error ?: "Не удалось создать WebRTC offer.")) + } + + override fun onSetFailure(error: String?) = Unit + }, buildSdpConstraints(offerToReceiveVideo)) + } + + private suspend fun createAnswer( + peerConnection: PeerConnection, + offerToReceiveVideo: Boolean + ): SessionDescription = + suspendCancellableCoroutine { continuation -> + peerConnection.createAnswer(object : SdpObserver { + override fun onCreateSuccess(description: SessionDescription?) { + val activeDescription = description ?: return continuation.resumeWithException( + IllegalStateException("WebRTC answer не был создан.") + ) + continuation.resume(activeDescription) + } + + override fun onSetSuccess() = Unit + + override fun onCreateFailure(error: String?) { + continuation.resumeWithException(IllegalStateException(error ?: "Не удалось создать WebRTC answer.")) + } + + override fun onSetFailure(error: String?) = Unit + }, buildSdpConstraints(offerToReceiveVideo)) + } + + private suspend fun setLocalDescription( + peerConnection: PeerConnection, + description: SessionDescription + ) { + suspendCancellableCoroutine { continuation -> + peerConnection.setLocalDescription(object : SdpObserver { + override fun onCreateSuccess(description: SessionDescription?) = Unit + + override fun onSetSuccess() { + continuation.resume(Unit) + } + + override fun onCreateFailure(error: String?) = Unit + + override fun onSetFailure(error: String?) { + continuation.resumeWithException( + IllegalStateException(error ?: "Не удалось установить local description.") + ) + } + }, description) + } + } + + private suspend fun setRemoteDescription( + peerConnection: PeerConnection, + description: SessionDescription + ) { + suspendCancellableCoroutine { continuation -> + peerConnection.setRemoteDescription(object : SdpObserver { + override fun onCreateSuccess(description: SessionDescription?) = Unit + + override fun onSetSuccess() { + continuation.resume(Unit) + } + + override fun onCreateFailure(error: String?) = Unit + + override fun onSetFailure(error: String?) { + continuation.resumeWithException( + IllegalStateException(error ?: "Не удалось установить remote description.") + ) + } + }, description) + } + } + + private fun buildSdpConstraints(offerToReceiveVideo: Boolean): MediaConstraints = + MediaConstraints().apply { + mandatory += MediaConstraints.KeyValuePair("OfferToReceiveAudio", "true") + mandatory += MediaConstraints.KeyValuePair( + "OfferToReceiveVideo", + if (offerToReceiveVideo) "true" else "false" + ) + } + + private fun CallIceServerDto.toNative(): PeerConnection.IceServer = + PeerConnection.IceServer.builder(urls) + .setUsername(username.orEmpty()) + .setPassword(credential.orEmpty()) + .createIceServer() + + private fun CallOfferDto.toSessionDescription(): SessionDescription = + SessionDescription(SessionDescription.Type.fromCanonicalForm(type), sdp) + + private fun CallAnswerDto.toSessionDescription(): SessionDescription = + SessionDescription(SessionDescription.Type.fromCanonicalForm(type), sdp) + + private fun CallIceCandidateDto.toNative(): IceCandidate = + IceCandidate(sdpMid, sdpMLineIndex, candidate) + + companion object { + private const val AUDIO_TRACK_ID = "IKAR_AUDIO_TRACK" + private const val VIDEO_TRACK_ID = "IKAR_VIDEO_TRACK" + private const val VIDEO_WIDTH = 640 + private const val VIDEO_HEIGHT = 480 + private const val VIDEO_FPS = 24 + + private val factoryInitializationLock = Any() + @Volatile + private var factoryInitialized = false + + private fun ensureFactoryInitialized(context: Context) { + if (factoryInitialized) { + return + } + + synchronized(factoryInitializationLock) { + if (factoryInitialized) { + return + } + + PeerConnectionFactory.initialize( + PeerConnectionFactory.InitializationOptions.builder(context) + .createInitializationOptions() + ) + factoryInitialized = true + } + } + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/call/CallManager.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/call/CallManager.kt new file mode 100644 index 00000000..a91ac89f --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/call/CallManager.kt @@ -0,0 +1,359 @@ +package com.seven.ikar.kotlin.feature.call + +import android.content.Context +import com.seven.ikar.kotlin.core.model.CallConnectedDto +import com.seven.ikar.kotlin.core.model.CallEndedDto +import com.seven.ikar.kotlin.core.model.CallMediaType +import com.seven.ikar.kotlin.core.model.IncomingCallDto +import com.seven.ikar.kotlin.core.model.OutgoingCallDto +import com.seven.ikar.kotlin.core.model.UserSummaryDto +import com.seven.ikar.kotlin.core.push.IncomingCallNotificationManager +import com.seven.ikar.kotlin.core.realtime.RealtimeService +import com.seven.ikar.kotlin.core.session.AuthorizedSessionManager +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch +import org.webrtc.VideoTrack +import java.time.OffsetDateTime +import java.time.format.DateTimeParseException + +enum class AudioCallStage { + None, + Incoming, + Outgoing, + Connecting, + Active +} + +data class AudioCallSnapshot( + val callId: String, + val chatId: String, + val peer: UserSummaryDto, + val stage: AudioCallStage, + val durationText: String, + val mediaType: CallMediaType, + val videoRenderState: CallVideoRenderState? = null +) + +class CallManager( + private val realtimeService: RealtimeService, + private val authorizedSessionManager: AuthorizedSessionManager, + private val webRtcCallService: AndroidWebRtcCallService, + private val callTonePlayer: AndroidCallTonePlayer, + private val appContext: Context +) { + private val scope = CoroutineScope(SupervisorJob() + Dispatchers.IO) + private var durationJob: Job? = null + private var connectedAtRaw: String? = null + + private val _currentCall = MutableStateFlow(null) + val currentCall: StateFlow = _currentCall.asStateFlow() + + init { + webRtcCallService.onRenderStateChanged = fun(renderState) { + val current = _currentCall.value ?: return + if (current.mediaType != CallMediaType.Video) { + return + } + + _currentCall.value = current.copy(videoRenderState = renderState) + } + webRtcCallService.onConnectionFailure = { + scope.launch { + val current = _currentCall.value ?: return@launch + runCatching { + authorizedSessionManager.executeAuthorized { session -> + realtimeService.ensureConnected(session.accessToken) + realtimeService.endCall(current.callId) + } + } + clearCurrentCallInternal() + } + } + + scope.launch { + realtimeService.incomingCall.collect(::handleIncomingCall) + } + scope.launch { + realtimeService.callConnected.collect(::handleCallConnected) + } + scope.launch { + realtimeService.callEnded.collect(::handleCallEnded) + } + scope.launch { + realtimeService.callOffer.collect { offer -> + val current = _currentCall.value ?: return@collect + if (current.callId == offer.callId) { + runCatching { webRtcCallService.handleRemoteOffer(offer) } + .onFailure { clearCurrentCall() } + } + } + } + scope.launch { + realtimeService.callAnswer.collect { answer -> + val current = _currentCall.value ?: return@collect + if (current.callId == answer.callId) { + runCatching { webRtcCallService.handleRemoteAnswer(answer) } + .onFailure { clearCurrentCall() } + } + } + } + scope.launch { + realtimeService.callIceCandidate.collect { candidate -> + val current = _currentCall.value ?: return@collect + if (current.callId == candidate.callId) { + runCatching { webRtcCallService.handleRemoteIceCandidate(candidate) } + .onFailure { clearCurrentCall() } + } + } + } + } + + fun canStartCallForChat(chatId: String): Boolean = + chatId.isNotBlank() && _currentCall.value == null + + fun isCallForChat(chatId: String): Boolean = + _currentCall.value?.chatId == chatId + + suspend fun startOutgoingAudioCall(chatId: String) { + startOutgoingCall(chatId, CallMediaType.Audio) + } + + suspend fun startOutgoingVideoCall(chatId: String) { + startOutgoingCall(chatId, CallMediaType.Video) + } + + fun acceptCurrentCall() { + val current = _currentCall.value ?: return + if (current.stage != AudioCallStage.Incoming) { + return + } + + IncomingCallNotificationManager.cancelIncomingCall(appContext, current.callId) + _currentCall.value = current.copy(stage = AudioCallStage.Connecting) + scope.launch { + runCatching { + authorizedSessionManager.executeAuthorized { session -> + realtimeService.ensureConnected(session.accessToken) + realtimeService.acceptCall(current.callId) + } + }.onFailure { + clearCurrentCallInternal() + } + } + } + + fun declineCurrentCall() { + val current = _currentCall.value ?: return + IncomingCallNotificationManager.cancelIncomingCall(appContext, current.callId) + scope.launch { + runCatching { + authorizedSessionManager.executeAuthorized { session -> + realtimeService.ensureConnected(session.accessToken) + realtimeService.declineCall(current.callId) + } + } + clearCurrentCallInternal() + } + } + + fun endCurrentCall() { + val current = _currentCall.value ?: return + IncomingCallNotificationManager.cancelIncomingCall(appContext, current.callId) + scope.launch { + runCatching { + authorizedSessionManager.executeAuthorized { session -> + realtimeService.ensureConnected(session.accessToken) + realtimeService.endCall(current.callId) + } + } + clearCurrentCallInternal() + } + } + + fun presentIncomingCallInvite( + callId: String, + chatId: String, + callerId: String, + callerDisplayName: String, + callerPhoneNumber: String?, + mediaType: CallMediaType + ) { + val current = _currentCall.value + if (current?.callId == callId || current != null) { + return + } + + callTonePlayer.stopOutgoingRingback() + stopDurationLoop() + connectedAtRaw = null + _currentCall.value = AudioCallSnapshot( + callId = callId, + chatId = chatId, + peer = UserSummaryDto( + id = callerId, + username = callerDisplayName, + displayName = callerDisplayName, + isOnline = false, + phoneNumber = callerPhoneNumber + ), + stage = AudioCallStage.Incoming, + durationText = "00:00", + mediaType = mediaType + ) + } + + fun dismissCallIfMatches(callId: String?) { + val normalizedCallId = callId?.takeIf { it.isNotBlank() } ?: return + if (_currentCall.value?.callId == normalizedCallId) { + clearCurrentCall() + } + } + + private suspend fun startOutgoingCall(chatId: String, mediaType: CallMediaType) { + if (!canStartCallForChat(chatId)) { + return + } + + handleOutgoingCallStarted(realtimeService.startCall(chatId, mediaType)) + } + + private fun handleOutgoingCallStarted(call: OutgoingCallDto) { + callTonePlayer.startOutgoingRingback() + stopDurationLoop() + connectedAtRaw = null + _currentCall.value = AudioCallSnapshot( + callId = call.callId, + chatId = call.chatId, + peer = call.peer, + stage = AudioCallStage.Outgoing, + durationText = "00:00", + mediaType = call.mediaType + ) + } + + private fun handleIncomingCall(call: IncomingCallDto) { + if (_currentCall.value != null) { + return + } + + callTonePlayer.stopOutgoingRingback() + stopDurationLoop() + connectedAtRaw = null + _currentCall.value = AudioCallSnapshot( + callId = call.callId, + chatId = call.chatId, + peer = call.caller, + stage = AudioCallStage.Incoming, + durationText = "00:00", + mediaType = call.mediaType + ) + } + + private fun handleCallConnected(call: CallConnectedDto) { + val current = _currentCall.value ?: return + if (current.callId != call.callId) { + return + } + + callTonePlayer.stopOutgoingRingback() + IncomingCallNotificationManager.cancelIncomingCall(appContext, call.callId) + connectedAtRaw = call.connectedAt + _currentCall.value = current.copy( + stage = AudioCallStage.Active, + durationText = "00:00", + mediaType = call.mediaType + ) + restartDurationLoop() + + scope.launch { + runCatching { + webRtcCallService.start( + callId = call.callId, + mediaType = call.mediaType, + iceServers = call.iceServers, + shouldCreateOffer = call.shouldCreateOffer, + sendOffer = realtimeService::sendCallOffer, + sendAnswer = realtimeService::sendCallAnswer, + sendIceCandidate = realtimeService::sendCallIceCandidate + ) + }.onFailure { + clearCurrentCallInternal() + } + } + } + + private fun handleCallEnded(call: CallEndedDto) { + val current = _currentCall.value ?: return + if (current.callId != call.callId) { + return + } + + clearCurrentCall() + } + + private fun restartDurationLoop() { + stopDurationLoop() + val startedAt = parseConnectedAt(connectedAtRaw) ?: return + durationJob = scope.launch { + while (true) { + val current = _currentCall.value + if (current == null || current.stage != AudioCallStage.Active) { + return@launch + } + + _currentCall.value = current.copy( + durationText = formatDurationMillis( + System.currentTimeMillis() - startedAt.toInstant().toEpochMilli() + ) + ) + delay(1_000) + } + } + } + + private fun stopDurationLoop() { + durationJob?.cancel() + durationJob = null + } + + private fun clearCurrentCall() { + scope.launch { + clearCurrentCallInternal() + } + } + + private suspend fun clearCurrentCallInternal() { + stopDurationLoop() + connectedAtRaw = null + callTonePlayer.stopOutgoingRingback() + IncomingCallNotificationManager.cancelIncomingCall(appContext, _currentCall.value?.callId) + runCatching { webRtcCallService.stop() } + _currentCall.value = null + } + + private fun parseConnectedAt(value: String?): OffsetDateTime? { + if (value.isNullOrBlank()) { + return null + } + + return try { + OffsetDateTime.parse(value) + } catch (_: DateTimeParseException) { + null + } + } + + private fun formatDurationMillis(durationMillis: Long): String { + val totalSeconds = (durationMillis.coerceAtLeast(0) / 1_000).toInt() + val minutes = totalSeconds / 60 + val seconds = totalSeconds % 60 + return "%02d:%02d".format(minutes, seconds) + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/call/CallScreen.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/call/CallScreen.kt new file mode 100644 index 00000000..bdd853f6 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/call/CallScreen.kt @@ -0,0 +1,561 @@ +package com.seven.ikar.kotlin.feature.call + +import android.Manifest +import android.content.pm.PackageManager +import androidx.activity.compose.rememberLauncherForActivityResult +import androidx.activity.result.contract.ActivityResultContracts +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.gestures.detectDragGestures +import androidx.compose.foundation.gestures.detectDragGesturesAfterLongPress +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.BoxWithConstraints +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.aspectRatio +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.navigationBarsPadding +import androidx.compose.foundation.layout.offset +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.outlined.Call +import androidx.compose.material.icons.outlined.CallEnd +import androidx.compose.material.icons.outlined.Close +import androidx.compose.material.icons.outlined.Videocam +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.rememberUpdatedState +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Brush +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.input.pointer.pointerInput +import androidx.compose.ui.layout.onSizeChanged +import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.IntOffset +import androidx.compose.ui.unit.IntSize +import androidx.compose.ui.unit.dp +import androidx.compose.ui.viewinterop.AndroidView +import androidx.compose.ui.zIndex +import androidx.core.content.ContextCompat +import com.seven.ikar.kotlin.core.model.CallMediaType +import kotlinx.coroutines.launch +import org.webrtc.SurfaceViewRenderer +import org.webrtc.VideoTrack +import kotlin.math.roundToInt + +@Composable +fun CallScreen( + state: AudioCallSnapshot, + onAccept: () -> Unit, + onDecline: () -> Unit, + onEnd: () -> Unit +) { + val context = LocalContext.current + val currentOnAccept by rememberUpdatedState(onAccept) + val currentMediaType by rememberUpdatedState(state.mediaType) + val currentContext by rememberUpdatedState(context) + val incomingPermissionsLauncher = rememberLauncherForActivityResult( + ActivityResultContracts.RequestMultiplePermissions() + ) { + val hasMicrophone = ContextCompat.checkSelfPermission( + currentContext, + Manifest.permission.RECORD_AUDIO + ) == PackageManager.PERMISSION_GRANTED + val hasCamera = currentMediaType != CallMediaType.Video || + ContextCompat.checkSelfPermission( + currentContext, + Manifest.permission.CAMERA + ) == PackageManager.PERMISSION_GRANTED + if (hasMicrophone && hasCamera) { + currentOnAccept() + } + } + + val handleAccept = { + val requiredPermissions = buildList { + if (ContextCompat.checkSelfPermission(context, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) { + add(Manifest.permission.RECORD_AUDIO) + } + if ( + state.mediaType == CallMediaType.Video && + ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED + ) { + add(Manifest.permission.CAMERA) + } + } + + if (requiredPermissions.isEmpty()) { + onAccept() + } else { + incomingPermissionsLauncher.launch(requiredPermissions.toTypedArray()) + } + } + + Surface( + modifier = Modifier.fillMaxSize(), + color = Color(0xFF081823) + ) { + Column( + modifier = Modifier + .fillMaxSize() + .background( + Brush.verticalGradient( + colors = listOf(Color(0xFF0A1F2D), Color(0xFF081823)) + ) + ) + .padding(horizontal = 24.dp, vertical = 28.dp), + verticalArrangement = Arrangement.SpaceBetween + ) { + Column(verticalArrangement = Arrangement.spacedBy(10.dp)) { + Text( + text = "ИКАР", + style = MaterialTheme.typography.labelLarge, + color = Color(0xFF90D6FF) + ) + Text( + text = state.peer.displayName, + style = MaterialTheme.typography.headlineMedium, + color = Color.White, + fontWeight = FontWeight.SemiBold + ) + Text( + text = buildPrimaryStatus(state), + style = MaterialTheme.typography.bodyMedium, + color = Color(0xFFB2C9D6) + ) + } + + Column( + modifier = Modifier.fillMaxWidth(), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(18.dp) + ) { + if (state.mediaType == CallMediaType.Video) { + val renderState = state.videoRenderState + val previewMarginPx = with(LocalDensity.current) { 16.dp.roundToPx() } + var videoStageSize by remember(state.callId) { mutableStateOf(IntSize.Zero) } + var localPreviewSize by remember(state.callId) { mutableStateOf(IntSize.Zero) } + var localPreviewOffset by remember(state.callId) { mutableStateOf(IntOffset.Zero) } + var isLocalPreviewPositionInitialized by remember(state.callId) { mutableStateOf(false) } + + fun clampLocalPreviewOffset(offset: IntOffset): IntOffset { + if (videoStageSize == IntSize.Zero || localPreviewSize == IntSize.Zero) { + return IntOffset.Zero + } + + val availableX = (videoStageSize.width - localPreviewSize.width).coerceAtLeast(0) + val availableY = (videoStageSize.height - localPreviewSize.height).coerceAtLeast(0) + val minX = previewMarginPx.coerceAtMost(availableX) + val minY = previewMarginPx.coerceAtMost(availableY) + val maxX = (availableX - previewMarginPx).coerceAtLeast(minX) + val maxY = (availableY - previewMarginPx).coerceAtLeast(minY) + + return IntOffset( + x = offset.x.coerceIn(minX, maxX), + y = offset.y.coerceIn(minY, maxY) + ) + } + + fun buildDefaultLocalPreviewOffset(): IntOffset = + clampLocalPreviewOffset( + IntOffset( + x = videoStageSize.width - localPreviewSize.width, + y = videoStageSize.height - localPreviewSize.height + ) + ) + + LaunchedEffect(videoStageSize, localPreviewSize, previewMarginPx, state.callId) { + if (videoStageSize == IntSize.Zero || localPreviewSize == IntSize.Zero) { + return@LaunchedEffect + } + + localPreviewOffset = if (isLocalPreviewPositionInitialized) { + clampLocalPreviewOffset(localPreviewOffset) + } else { + isLocalPreviewPositionInitialized = true + buildDefaultLocalPreviewOffset() + } + } + + Box( + modifier = Modifier + .fillMaxWidth() + .height(420.dp) + .onSizeChanged { videoStageSize = it } + .background(Color(0xFF122A39), RoundedCornerShape(28.dp)) + ) { + if (renderState?.eglBaseContext != null && renderState.remoteVideoTrack != null) { + CallVideoSurface( + eglBaseContext = renderState.eglBaseContext, + track = renderState.remoteVideoTrack, + isMirrored = false, + isOverlay = false, + modifier = Modifier.fillMaxSize() + ) + } else { + VideoPlaceholder( + text = buildStageText(state), + modifier = Modifier.fillMaxSize() + ) + } + + if (renderState?.eglBaseContext != null && renderState.localVideoTrack != null) { + CallVideoSurface( + eglBaseContext = renderState.eglBaseContext, + track = renderState.localVideoTrack, + isMirrored = true, + isOverlay = true, + modifier = Modifier + .zIndex(1f) + .offset { localPreviewOffset } + .onSizeChanged { localPreviewSize = it } + .pointerInput(state.callId, videoStageSize, localPreviewSize) { + detectDragGesturesAfterLongPress( + onDrag = { change, dragAmount -> + change.consume() + isLocalPreviewPositionInitialized = true + localPreviewOffset = clampLocalPreviewOffset( + IntOffset( + x = localPreviewOffset.x + dragAmount.x.roundToInt(), + y = localPreviewOffset.y + dragAmount.y.roundToInt() + ) + ) + } + ) + } + .fillMaxWidth(0.32f) + .aspectRatio(0.75f) + ) + } + } + } else { + Box( + modifier = Modifier + .size(220.dp) + .background(Color(0xFF122A39), CircleShape), + contentAlignment = Alignment.Center + ) { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(10.dp) + ) { + Icon( + imageVector = Icons.Outlined.Call, + contentDescription = null, + tint = Color.White, + modifier = Modifier.size(88.dp) + ) + Text( + text = buildStageText(state), + color = Color.White, + style = MaterialTheme.typography.titleMedium + ) + } + } + } + } + + Column( + modifier = Modifier + .fillMaxWidth() + .navigationBarsPadding(), + verticalArrangement = Arrangement.spacedBy(14.dp), + horizontalAlignment = Alignment.CenterHorizontally + ) { + if (state.stage == AudioCallStage.Incoming) { + IncomingCallSwipeControl( + onAccept = handleAccept, + onDecline = onDecline + ) + Text( + text = "Сдвиньте трубку вправо, чтобы принять, или влево, чтобы отклонить", + color = Color(0xFFB2C9D6), + style = MaterialTheme.typography.bodySmall + ) + } else { + CallActionButton( + text = if (state.stage == AudioCallStage.Active) "Завершить" else "Отменить", + icon = if (state.stage == AudioCallStage.Active) Icons.Outlined.CallEnd else Icons.Outlined.Close, + containerColor = Color(0xFFBE2D38), + onClick = onEnd + ) + } + } + } + } +} + +@Composable +private fun IncomingCallSwipeControl( + onAccept: () -> Unit, + onDecline: () -> Unit, + modifier: Modifier = Modifier +) { + val scope = rememberCoroutineScope() + var trackWidthPx by remember { mutableStateOf(0f) } + var handleWidthPx by remember { mutableStateOf(0f) } + val dragOffsetPx = remember { androidx.compose.animation.core.Animatable(0f) } + var isCompleting by remember { mutableStateOf(false) } + + val maxTravelPx = ((trackWidthPx - handleWidthPx) / 2f).coerceAtLeast(0f) + val triggerThresholdPx = maxTravelPx * 0.62f + + Box( + modifier = modifier + .fillMaxWidth() + .height(96.dp) + .clip(RoundedCornerShape(48.dp)) + .background(Color(0xFF102537)) + .border(1.dp, Color(0xFF1A425B), RoundedCornerShape(48.dp)) + .onSizeChanged { trackWidthPx = it.width.toFloat() } + ) { + Row( + modifier = Modifier + .fillMaxSize() + .padding(horizontal = 22.dp), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + SlideActionHint( + icon = Icons.Outlined.Close, + label = "Отклонить", + color = Color(0xFFFF7A7A), + alignEnd = false + ) + SlideActionHint( + icon = Icons.Outlined.Call, + label = "Принять", + color = Color(0xFF75E2A0), + alignEnd = true + ) + } + + Box( + modifier = Modifier + .align(Alignment.Center) + .offset { IntOffset(dragOffsetPx.value.roundToInt(), 0) } + .size(76.dp) + .onSizeChanged { handleWidthPx = it.width.toFloat() } + .clip(CircleShape) + .background(Color.White) + .pointerInput(maxTravelPx, isCompleting) { + if (isCompleting) { + return@pointerInput + } + + detectDragGestures( + onDragStart = { + scope.launch { dragOffsetPx.stop() } + }, + onDragCancel = { + scope.launch { dragOffsetPx.animateTo(0f) } + }, + onDragEnd = { + if (isCompleting) { + return@detectDragGestures + } + + val currentOffset = dragOffsetPx.value + when { + currentOffset >= triggerThresholdPx -> { + isCompleting = true + scope.launch { + dragOffsetPx.animateTo(maxTravelPx) + onAccept() + } + } + + currentOffset <= -triggerThresholdPx -> { + isCompleting = true + scope.launch { + dragOffsetPx.animateTo(-maxTravelPx) + onDecline() + } + } + + else -> { + scope.launch { dragOffsetPx.animateTo(0f) } + } + } + }, + onDrag = { change, dragAmount -> + if (isCompleting) { + return@detectDragGestures + } + + change.consume() + val nextOffset = (dragOffsetPx.value + dragAmount.x) + .coerceIn(-maxTravelPx, maxTravelPx) + scope.launch { dragOffsetPx.snapTo(nextOffset) } + } + ) + }, + contentAlignment = Alignment.Center + ) { + Icon( + imageVector = Icons.Outlined.Call, + contentDescription = null, + tint = if (dragOffsetPx.value >= 0f) Color(0xFF1B7F49) else Color(0xFFAF2330), + modifier = Modifier.size(34.dp) + ) + } + } +} + +@Composable +private fun SlideActionHint( + icon: androidx.compose.ui.graphics.vector.ImageVector, + label: String, + color: Color, + alignEnd: Boolean +) { + Column( + horizontalAlignment = if (alignEnd) Alignment.End else Alignment.Start, + verticalArrangement = Arrangement.spacedBy(6.dp) + ) { + Icon( + imageVector = icon, + contentDescription = null, + tint = color, + modifier = Modifier.size(22.dp) + ) + Text( + text = label, + color = color, + style = MaterialTheme.typography.labelLarge + ) + } +} + +@Composable +private fun CallActionButton( + text: String, + icon: androidx.compose.ui.graphics.vector.ImageVector, + containerColor: Color, + onClick: () -> Unit +) { + Button( + onClick = onClick, + colors = ButtonDefaults.buttonColors(containerColor = containerColor), + shape = RoundedCornerShape(26.dp), + modifier = Modifier.fillMaxWidth() + ) { + Icon( + imageVector = icon, + contentDescription = null, + modifier = Modifier.padding(end = 10.dp) + ) + Text(text) + } +} + +@Composable +private fun VideoPlaceholder( + text: String, + modifier: Modifier = Modifier +) { + Column( + modifier = modifier, + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center + ) { + Icon( + imageVector = Icons.Outlined.Videocam, + contentDescription = null, + tint = Color.White, + modifier = Modifier.size(72.dp) + ) + Text( + text = text, + color = Color.White, + style = MaterialTheme.typography.titleMedium + ) + } +} + +@Composable +private fun CallVideoSurface( + eglBaseContext: org.webrtc.EglBase.Context, + track: VideoTrack, + isMirrored: Boolean, + isOverlay: Boolean, + modifier: Modifier = Modifier +) { + val context = LocalContext.current + val currentTrack by rememberUpdatedState(track) + var renderer by remember { mutableStateOf(null) } + + AndroidView( + modifier = modifier, + factory = { viewContext -> + SurfaceViewRenderer(viewContext).apply { + init(eglBaseContext, null) + setEnableHardwareScaler(true) + setMirror(isMirrored) + setZOrderMediaOverlay(isOverlay) + setBackgroundColor(android.graphics.Color.TRANSPARENT) + renderer = this + } + }, + update = { view -> + view.setMirror(isMirrored) + view.setZOrderMediaOverlay(isOverlay) + if (renderer !== view) { + renderer = view + } + } + ) + + DisposableEffect(renderer, currentTrack) { + val activeRenderer = renderer + if (activeRenderer != null) { + currentTrack.addSink(activeRenderer) + } + + onDispose { + if (activeRenderer != null) { + currentTrack.removeSink(activeRenderer) + } + } + } + + DisposableEffect(context) { + onDispose { + renderer?.release() + renderer = null + } + } +} + +private fun buildPrimaryStatus(state: AudioCallSnapshot): String = + state.peer.phoneNumber ?: if (state.mediaType == CallMediaType.Video) "Ikar Video" else "Ikar Audio" + +private fun buildStageText(state: AudioCallSnapshot): String = when (state.stage) { + AudioCallStage.Incoming -> if (state.mediaType == CallMediaType.Video) "Входящий видеозвонок" else "Входящий аудиозвонок" + AudioCallStage.Outgoing -> "Идёт дозвон..." + AudioCallStage.Connecting -> "Соединение..." + AudioCallStage.Active -> if (state.mediaType == CallMediaType.Video) "Видеозвонок ${state.durationText}" else "Разговор ${state.durationText}" + AudioCallStage.None -> "Звонок" +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/call/IncomingCallActivity.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/call/IncomingCallActivity.kt new file mode 100644 index 00000000..fe852b48 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/call/IncomingCallActivity.kt @@ -0,0 +1,192 @@ +package com.seven.ikar.kotlin.feature.call + +import android.Manifest +import android.content.Context +import android.content.Intent +import android.content.pm.PackageManager +import android.graphics.Color +import android.os.Build +import android.os.Bundle +import android.view.WindowManager +import androidx.activity.ComponentActivity +import androidx.activity.result.contract.ActivityResultContracts +import androidx.activity.compose.setContent +import androidx.core.view.WindowCompat +import androidx.core.view.WindowInsetsControllerCompat +import androidx.core.content.ContextCompat +import androidx.compose.runtime.LaunchedEffect +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.seven.ikar.kotlin.app.IkarNativeApp +import com.seven.ikar.kotlin.core.model.CallMediaType +import com.seven.ikar.kotlin.core.push.AndroidAppVisibilityState +import com.seven.ikar.kotlin.core.push.PendingIncomingCallInvite +import com.seven.ikar.kotlin.core.push.applyToIntent +import com.seven.ikar.kotlin.core.push.pendingIncomingCallInviteFromIntent +import com.seven.ikar.kotlin.ui.theme.IkarKotlinTheme + +class IncomingCallActivity : ComponentActivity() { + private val applicationContainer + get() = (application as IkarNativeApp).container + private var shouldAutoAccept: Boolean = false + private val incomingCallPermissionsLauncher = registerForActivityResult( + ActivityResultContracts.RequestMultiplePermissions() + ) { + if (hasPermissionsForCurrentCall()) { + applicationContainer.callManager.acceptCurrentCall() + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + configureWindow() + syncCallFromIntent(intent) + syncAutoAcceptFromIntent(intent) + setContent { + IkarKotlinTheme { + val activeCall = applicationContainer.callManager.currentCall.collectAsStateWithLifecycle().value + LaunchedEffect(activeCall?.callId, activeCall?.stage) { + if (activeCall == null) { + finish() + } + } + if (activeCall != null) { + CallScreen( + state = activeCall, + onAccept = applicationContainer.callManager::acceptCurrentCall, + onDecline = applicationContainer.callManager::declineCurrentCall, + onEnd = applicationContainer.callManager::endCurrentCall + ) + } + } + } + } + + override fun onNewIntent(intent: Intent) { + super.onNewIntent(intent) + setIntent(intent) + syncCallFromIntent(intent) + syncAutoAcceptFromIntent(intent) + } + + override fun onStart() { + super.onStart() + AndroidAppVisibilityState.setVisible(true) + if (shouldAutoAccept) { + shouldAutoAccept = false + window.decorView.post { + acceptCurrentCallWithPermissions() + } + } + } + + override fun onStop() { + AndroidAppVisibilityState.setVisible(false) + super.onStop() + } + + private fun configureWindow() { + WindowCompat.setDecorFitsSystemWindows(window, false) + window.statusBarColor = Color.TRANSPARENT + window.navigationBarColor = Color.TRANSPARENT + window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) { + setShowWhenLocked(true) + setTurnScreenOn(true) + } else { + @Suppress("DEPRECATION") + window.addFlags( + WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED or + WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON + ) + } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + window.isNavigationBarContrastEnforced = false + window.isStatusBarContrastEnforced = false + } + + WindowInsetsControllerCompat(window, window.decorView).apply { + isAppearanceLightStatusBars = false + isAppearanceLightNavigationBars = false + } + } + + private fun syncCallFromIntent(intent: Intent?) { + val invite = intent?.let(::pendingIncomingCallInviteFromIntent) ?: return + if (applicationContainer.sessionStore.read() == null) { + return + } + + applicationContainer.callManager.presentIncomingCallInvite( + callId = invite.callId, + chatId = invite.chatId, + callerId = invite.callerId, + callerDisplayName = invite.callerDisplayName, + callerPhoneNumber = invite.callerPhoneNumber, + mediaType = invite.mediaType + ) + } + + private fun syncAutoAcceptFromIntent(intent: Intent?) { + if (intent?.getBooleanExtra(AutoAcceptExtra, false) != true) { + return + } + + intent.putExtra(AutoAcceptExtra, false) + shouldAutoAccept = true + } + + private fun acceptCurrentCallWithPermissions() { + val requiredPermissions = buildList { + if (ContextCompat.checkSelfPermission(this@IncomingCallActivity, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) { + add(Manifest.permission.RECORD_AUDIO) + } + if ( + applicationContainer.callManager.currentCall.value?.mediaType == CallMediaType.Video && + ContextCompat.checkSelfPermission(this@IncomingCallActivity, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED + ) { + add(Manifest.permission.CAMERA) + } + } + + if (requiredPermissions.isEmpty()) { + applicationContainer.callManager.acceptCurrentCall() + } else { + incomingCallPermissionsLauncher.launch(requiredPermissions.toTypedArray()) + } + } + + private fun hasPermissionsForCurrentCall(): Boolean { + val hasMicrophone = ContextCompat.checkSelfPermission( + this, + Manifest.permission.RECORD_AUDIO + ) == PackageManager.PERMISSION_GRANTED + val hasCamera = applicationContainer.callManager.currentCall.value?.mediaType != CallMediaType.Video || + ContextCompat.checkSelfPermission( + this, + Manifest.permission.CAMERA + ) == PackageManager.PERMISSION_GRANTED + return hasMicrophone && hasCamera + } + + companion object { + private const val AutoAcceptExtra = "autoAcceptIncomingCall" + + fun createLaunchIntent( + context: Context, + invite: PendingIncomingCallInvite, + autoAccept: Boolean = false + ): Intent = + invite.applyToIntent( + Intent(context, IncomingCallActivity::class.java).apply { + addFlags( + Intent.FLAG_ACTIVITY_NEW_TASK or + Intent.FLAG_ACTIVITY_SINGLE_TOP or + Intent.FLAG_ACTIVITY_CLEAR_TOP + ) + putExtra(AutoAcceptExtra, autoAccept) + } + ) + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/chat/AndroidAttachmentFileService.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/chat/AndroidAttachmentFileService.kt new file mode 100644 index 00000000..56ed8103 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/chat/AndroidAttachmentFileService.kt @@ -0,0 +1,301 @@ +package com.seven.ikar.kotlin.feature.chat + +import android.content.ActivityNotFoundException +import android.content.ContentValues +import android.content.Context +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.os.Environment +import android.provider.MediaStore +import android.provider.OpenableColumns +import androidx.core.content.FileProvider +import com.seven.ikar.kotlin.core.model.DownloadedAttachmentFile +import com.seven.ikar.kotlin.core.network.UploadFileSource +import com.seven.ikar.kotlin.feature.archive.AndroidArchiveFileService +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import java.io.File +import java.io.IOException +import java.io.InputStream + +data class LocalAttachmentFile( + val fileName: String, + val contentType: String, + val fileSizeBytes: Long, + val localPath: String +) + +data class CacheCleanupResult( + val deletedFiles: Int, + val deletedBytes: Long +) + +internal fun LocalAttachmentFile.toUploadFileSource(): UploadFileSource = + UploadFileSource( + fileName = fileName, + contentType = contentType, + contentLength = fileSizeBytes + ) { File(localPath).inputStream() } + +class AndroidAttachmentFileService( + private val context: Context +) { + private val maxAttachmentSizeBytes = 25L * 1024L * 1024L + private val attachmentsDirectory: File by lazy { + File(context.cacheDir, "attachments").apply { mkdirs() } + } + + suspend fun importFromUri(uri: Uri): LocalAttachmentFile = withContext(Dispatchers.IO) { + val resolver = context.contentResolver + val contentType = resolver.getType(uri) ?: "application/octet-stream" + val fileName = sanitizeFileName(queryDisplayName(uri) ?: "attachment") + val declaredSize = queryFileSize(uri) + if (declaredSize != null && declaredSize > maxAttachmentSizeBytes) { + throw IOException("File must be 25 MB or smaller.") + } + + val target = File(attachmentsDirectory, "pending_${System.currentTimeMillis()}_$fileName") + val copiedBytes = try { + resolver.openInputStream(uri)?.use { input -> copyToFileWithLimit(input, target) } + ?: throw IOException("Failed to read selected file.") + } catch (error: Exception) { + target.delete() + throw error + } + + LocalAttachmentFile( + fileName = fileName, + contentType = contentType, + fileSizeBytes = copiedBytes, + localPath = target.absolutePath + ) + } + + fun createAttachmentCacheFile(attachmentId: String, fileName: String): File = + File(attachmentsDirectory, "${attachmentId}_${sanitizeFileName(fileName)}") + + suspend fun cacheDownloadedAttachment(file: DownloadedAttachmentFile): LocalAttachmentFile = + withContext(Dispatchers.IO) { + val target = File(file.localPath) + target.setLastModified(System.currentTimeMillis()) + LocalAttachmentFile( + fileName = target.name.substringAfter('_', file.fileName), + contentType = file.contentType, + fileSizeBytes = file.fileSizeBytes.takeIf { it >= 0L } ?: target.length(), + localPath = target.absolutePath + ) + } + + suspend fun enforceCachePolicy(maxCacheMb: Int, keepMediaDays: Int): CacheCleanupResult = + withContext(Dispatchers.IO) { + val files = attachmentsDirectory + .walkTopDown() + .filter { it.isFile } + .filterNot { it.name.startsWith("pending_") } + .toList() + val cutoffMillis = System.currentTimeMillis() - keepMediaDays.coerceAtLeast(1) * 24L * 60L * 60L * 1000L + var deletedFiles = 0 + var deletedBytes = 0L + + val retainedAfterAge = files.filter { file -> + if (file.lastModified() in 1 until cutoffMillis) { + val size = file.length() + if (file.delete()) { + deletedFiles += 1 + deletedBytes += size + } + false + } else { + true + } + }.toMutableList() + + val maxBytes = maxCacheMb.coerceAtLeast(1) * 1024L * 1024L + var totalBytes = retainedAfterAge.sumOf { it.length() } + if (totalBytes > maxBytes) { + retainedAfterAge + .sortedWith(compareBy { it.lastModified().takeIf { value -> value > 0L } ?: Long.MAX_VALUE }.thenBy { it.name }) + .forEach { file -> + if (totalBytes <= maxBytes) { + return@forEach + } + val size = file.length() + if (file.delete()) { + totalBytes -= size + deletedFiles += 1 + deletedBytes += size + } + } + } + + CacheCleanupResult(deletedFiles = deletedFiles, deletedBytes = deletedBytes) + } + + fun openCachedAttachment(localPath: String, fileName: String, contentType: String) { + val file = requireExistingFile(localPath) + val contentUri = contentUriFor(file) + + if (AndroidArchiveFileService.isSupportedZip(fileName, contentType)) { + openArchiveInternally(contentUri, fileName, contentType) + return + } + + val intent = Intent(Intent.ACTION_VIEW).apply { + setDataAndType(contentUri, contentType) + addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + clipData = android.content.ClipData.newRawUri(fileName, contentUri) + } + + try { + context.startActivity(intent) + } catch (error: ActivityNotFoundException) { + throw IllegalStateException("No app found to open this attachment.") + } + } + + private fun openArchiveInternally(contentUri: Uri, fileName: String, contentType: String) { + val intent = Intent(Intent.ACTION_VIEW).apply { + setClassName(context.packageName, "${context.packageName}.MainActivity") + setDataAndType(contentUri, contentType.ifBlank { "application/zip" }) + putExtra(Intent.EXTRA_TITLE, fileName) + addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP) + addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + clipData = android.content.ClipData.newRawUri(fileName, contentUri) + } + + try { + context.startActivity(intent) + } catch (error: ActivityNotFoundException) { + throw IllegalStateException("Ikar could not open this ZIP archive.") + } + } + + fun shareCachedAttachment(localPath: String, fileName: String, contentType: String) { + val file = requireExistingFile(localPath) + val contentUri = contentUriFor(file) + + val chooserIntent = Intent.createChooser( + Intent(Intent.ACTION_SEND).apply { + type = contentType + putExtra(Intent.EXTRA_STREAM, contentUri) + putExtra(Intent.EXTRA_TITLE, fileName) + addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + clipData = android.content.ClipData.newRawUri(fileName, contentUri) + }, + "Share" + ).apply { + addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + } + + try { + context.startActivity(chooserIntent) + } catch (error: ActivityNotFoundException) { + throw IllegalStateException("No app found to share this attachment.") + } + } + + suspend fun saveCachedImageToGallery(localPath: String, fileName: String, contentType: String): Uri = + withContext(Dispatchers.IO) { + val file = requireExistingFile(localPath) + val resolver = context.contentResolver + val sanitizedFileName = sanitizeFileName(fileName) + val values = ContentValues().apply { + put(MediaStore.Images.Media.DISPLAY_NAME, sanitizedFileName) + put(MediaStore.Images.Media.MIME_TYPE, contentType) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + put(MediaStore.Images.Media.RELATIVE_PATH, Environment.DIRECTORY_PICTURES + "/Ikar") + put(MediaStore.Images.Media.IS_PENDING, 1) + } + } + + val uri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values) + ?: throw IOException("Failed to create gallery entry.") + + try { + resolver.openOutputStream(uri)?.use { output -> + file.inputStream().use { input -> input.copyTo(output) } + } ?: throw IOException("Failed to open gallery output stream.") + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + val publishedValues = ContentValues().apply { + put(MediaStore.Images.Media.IS_PENDING, 0) + } + resolver.update(uri, publishedValues, null, null) + } + + uri + } catch (error: Exception) { + resolver.delete(uri, null, null) + throw error + } + } + + private fun requireExistingFile(localPath: String): File { + val file = File(localPath) + if (!file.exists()) { + throw IOException("Cached file not found.") + } + file.setLastModified(System.currentTimeMillis()) + return file + } + + private fun contentUriFor(file: File): Uri = + FileProvider.getUriForFile( + context, + "${context.packageName}.fileprovider", + file + ) + + private fun queryDisplayName(uri: Uri): String? { + val resolver = context.contentResolver + resolver.query(uri, arrayOf(OpenableColumns.DISPLAY_NAME), null, null, null)?.use { cursor -> + val nameIndex = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME) + if (nameIndex >= 0 && cursor.moveToFirst()) { + return cursor.getString(nameIndex) + } + } + + return uri.lastPathSegment + } + + private fun queryFileSize(uri: Uri): Long? { + val resolver = context.contentResolver + resolver.query(uri, arrayOf(OpenableColumns.SIZE), null, null, null)?.use { cursor -> + val sizeIndex = cursor.getColumnIndex(OpenableColumns.SIZE) + if (sizeIndex >= 0 && cursor.moveToFirst() && !cursor.isNull(sizeIndex)) { + return cursor.getLong(sizeIndex).takeIf { it >= 0L } + } + } + + return null + } + + private fun copyToFileWithLimit(input: InputStream, target: File): Long { + val buffer = ByteArray(DEFAULT_BUFFER_SIZE) + var totalBytes = 0L + + target.outputStream().use { output -> + while (true) { + val read = input.read(buffer) + if (read < 0) { + return totalBytes + } + + totalBytes += read + if (totalBytes > maxAttachmentSizeBytes) { + throw IOException("File must be 25 MB or smaller.") + } + + output.write(buffer, 0, read) + } + } + } + + private fun sanitizeFileName(value: String): String = + value.trim().ifBlank { "attachment" }.replace(Regex("[^A-Za-z0-9._-]"), "_") +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/chat/AndroidVoiceNotePlayerService.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/chat/AndroidVoiceNotePlayerService.kt new file mode 100644 index 00000000..de3bb8cd --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/chat/AndroidVoiceNotePlayerService.kt @@ -0,0 +1,150 @@ +package com.seven.ikar.kotlin.feature.chat + +import android.media.MediaPlayer +import kotlinx.coroutines.CancellationException +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.SharedFlow +import kotlinx.coroutines.flow.asSharedFlow +import kotlinx.coroutines.launch +import java.util.concurrent.Semaphore + +data class VoiceNotePlaybackEvent( + val attachmentId: String, + val isPlaying: Boolean, + val positionMs: Long, + val durationMs: Long +) + +class AndroidVoiceNotePlayerService { + private val sync = Semaphore(1) + private val scope = CoroutineScope(SupervisorJob() + Dispatchers.IO) + private val _events = MutableSharedFlow(extraBufferCapacity = 32) + val events: SharedFlow = _events.asSharedFlow() + + private var player: MediaPlayer? = null + private var currentAttachmentId: String? = null + private var durationMs: Long = 0L + private var tickerJob: Job? = null + + suspend fun toggle(attachmentId: String, localFilePath: String) { + sync.acquire() + try { + if (player != null && currentAttachmentId == attachmentId) { + stopCurrent() + return + } + + stopCurrent() + + val nextPlayer = MediaPlayer().apply { + setDataSource(localFilePath) + prepare() + } + + player = nextPlayer + currentAttachmentId = attachmentId + durationMs = nextPlayer.duration.toLong().coerceAtLeast(0L) + + nextPlayer.setOnCompletionListener { + scope.launch { stopCurrent(playbackCompleted = true) } + } + nextPlayer.start() + startTicker() + emitEvent(attachmentId, true, 0L, durationMs) + } finally { + sync.release() + } + } + + suspend fun stop() { + sync.acquire() + try { + stopCurrent() + } finally { + sync.release() + } + } + + private suspend fun stopCurrent(playbackCompleted: Boolean = false) { + val existingPlayer = player + val attachmentId = currentAttachmentId + val completedDuration = durationMs + val finalPosition = if (playbackCompleted) completedDuration else safePosition(existingPlayer) + + player = null + currentAttachmentId = null + durationMs = 0L + stopTicker() + + existingPlayer?.let { mediaPlayer -> + try { + if (safeIsPlaying(mediaPlayer)) { + mediaPlayer.stop() + } + } catch (_: Throwable) { + } + + mediaPlayer.reset() + mediaPlayer.release() + } + + if (attachmentId != null) { + emitEvent(attachmentId, false, finalPosition, completedDuration) + } + } + + private fun startTicker() { + stopTicker() + tickerJob = scope.launch { + try { + while (true) { + delay(250) + val activePlayer = player ?: break + val attachmentId = currentAttachmentId ?: break + emitEvent( + attachmentId = attachmentId, + isPlaying = safeIsPlaying(activePlayer), + positionMs = safePosition(activePlayer), + durationMs = durationMs + ) + } + } catch (_: CancellationException) { + } + } + } + + private fun stopTicker() { + tickerJob?.cancel() + tickerJob = null + } + + private fun emitEvent(attachmentId: String, isPlaying: Boolean, positionMs: Long, durationMs: Long) { + _events.tryEmit( + VoiceNotePlaybackEvent( + attachmentId = attachmentId, + isPlaying = isPlaying, + positionMs = positionMs.coerceAtLeast(0L), + durationMs = durationMs.coerceAtLeast(0L) + ) + ) + } + + private fun safeIsPlaying(mediaPlayer: MediaPlayer?): Boolean = + try { + mediaPlayer?.isPlaying == true + } catch (_: Throwable) { + false + } + + private fun safePosition(mediaPlayer: MediaPlayer?): Long = + try { + mediaPlayer?.currentPosition?.toLong()?.coerceAtLeast(0L) ?: 0L + } catch (_: Throwable) { + 0L + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/chat/AndroidVoiceNoteRecorderService.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/chat/AndroidVoiceNoteRecorderService.kt new file mode 100644 index 00000000..4d6344c6 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/chat/AndroidVoiceNoteRecorderService.kt @@ -0,0 +1,148 @@ +package com.seven.ikar.kotlin.feature.chat + +import android.content.Context +import android.media.MediaRecorder +import android.os.Build +import kotlinx.coroutines.CancellationException +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch +import java.io.File +import java.util.concurrent.Semaphore + +class AndroidVoiceNoteRecorderService( + private val context: Context +) { + private val sync = Semaphore(1) + private val scope = CoroutineScope(SupervisorJob() + Dispatchers.IO) + private val _elapsedMs = MutableStateFlow(0L) + val elapsedMs: StateFlow = _elapsedMs.asStateFlow() + + private var recorder: MediaRecorder? = null + private var currentFile: File? = null + private var startedAtMs: Long = 0L + private var tickerJob: Job? = null + + val isRecording: Boolean + get() = recorder != null + + suspend fun start() { + sync.acquire() + try { + if (recorder != null) { + return + } + + val directory = File(context.cacheDir, "voice-notes").apply { mkdirs() } + val file = File(directory, "voice-${System.currentTimeMillis()}.m4a") + val nextRecorder = if (Build.VERSION.SDK_INT >= 31) { + MediaRecorder(context) + } else { + MediaRecorder() + } + + try { + nextRecorder.setAudioSource(MediaRecorder.AudioSource.MIC) + nextRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4) + nextRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC) + nextRecorder.setAudioSamplingRate(44_100) + nextRecorder.setAudioEncodingBitRate(128_000) + nextRecorder.setOutputFile(file.absolutePath) + nextRecorder.prepare() + nextRecorder.start() + } catch (error: Throwable) { + nextRecorder.reset() + nextRecorder.release() + file.delete() + throw error + } + + recorder = nextRecorder + currentFile = file + startedAtMs = System.currentTimeMillis() + _elapsedMs.value = 0L + startTicker() + } finally { + sync.release() + } + } + + suspend fun stop(discard: Boolean): File? { + sync.acquire() + val currentRecorder = recorder + val outputFile = currentFile + val elapsedMs = _elapsedMs.value + recorder = null + currentFile = null + startedAtMs = 0L + sync.release() + + stopTicker() + + if (currentRecorder == null) { + _elapsedMs.value = 0L + return null + } + + var shouldDelete = discard + try { + currentRecorder.stop() + } catch (_: Throwable) { + shouldDelete = true + } finally { + currentRecorder.reset() + currentRecorder.release() + } + + _elapsedMs.value = 0L + + if (outputFile == null || !outputFile.exists()) { + return null + } + + if (shouldDelete) { + outputFile.delete() + return null + } + + if (outputFile.length() <= 0) { + outputFile.delete() + return null + } + + if (elapsedMs < 600L) { + outputFile.delete() + throw IllegalStateException("Голосовое сообщение слишком короткое.") + } + + return outputFile + } + + private fun startTicker() { + stopTicker() + tickerJob = scope.launch { + try { + while (true) { + delay(250) + if (recorder == null) { + break + } + + _elapsedMs.value = (System.currentTimeMillis() - startedAtMs).coerceAtLeast(0L) + } + } catch (_: CancellationException) { + } + } + } + + private fun stopTicker() { + tickerJob?.cancel() + tickerJob = null + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/chat/ChatScreen.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/chat/ChatScreen.kt new file mode 100644 index 00000000..eec1dee8 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/chat/ChatScreen.kt @@ -0,0 +1,3723 @@ +package com.seven.ikar.kotlin.feature.chat + +import android.Manifest +import android.content.ActivityNotFoundException +import android.content.Context +import android.content.Intent +import android.content.pm.PackageManager +import android.net.Uri +import android.util.Patterns +import androidx.activity.compose.BackHandler +import androidx.activity.compose.rememberLauncherForActivityResult +import androidx.activity.result.contract.ActivityResultContracts +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.core.tween +import androidx.compose.animation.expandVertically +import androidx.compose.animation.shrinkVertically +import androidx.compose.foundation.ExperimentalFoundationApi +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.combinedClickable +import androidx.compose.foundation.gestures.detectHorizontalDragGestures +import androidx.compose.foundation.gestures.detectTapGestures +import androidx.compose.foundation.gestures.detectTransformGestures +import androidx.compose.foundation.horizontalScroll +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.BoxWithConstraints +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.FlowRow +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.heightIn +import androidx.compose.foundation.layout.ime +import androidx.compose.foundation.layout.imePadding +import androidx.compose.foundation.layout.navigationBars +import androidx.compose.foundation.layout.navigationBarsPadding +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.statusBars +import androidx.compose.foundation.layout.statusBarsPadding +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.windowInsetsTopHeight +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.layout.widthIn +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.grid.GridCells +import androidx.compose.foundation.lazy.grid.LazyVerticalGrid +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.lazy.rememberLazyListState +import androidx.compose.foundation.lazy.grid.items +import androidx.compose.foundation.lazy.grid.rememberLazyGridState +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.text.BasicTextField +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.ArrowBack +import androidx.compose.material.icons.automirrored.outlined.Send +import androidx.compose.material.icons.outlined.AttachFile +import androidx.compose.material.icons.outlined.ArrowDownward +import androidx.compose.material.icons.outlined.Call +import androidx.compose.material.icons.outlined.CheckCircle +import androidx.compose.material.icons.outlined.Close +import androidx.compose.material.icons.outlined.ContentCopy +import androidx.compose.material.icons.outlined.Delete +import androidx.compose.material.icons.outlined.Edit +import androidx.compose.material.icons.outlined.Image +import androidx.compose.material.icons.outlined.KeyboardArrowDown +import androidx.compose.material.icons.outlined.KeyboardArrowUp +import androidx.compose.material.icons.outlined.Menu +import androidx.compose.material.icons.outlined.Mic +import androidx.compose.material.icons.outlined.Notifications +import androidx.compose.material.icons.outlined.PlayArrow +import androidx.compose.material.icons.outlined.Mood +import androidx.compose.material.icons.outlined.PushPin +import androidx.compose.material.icons.outlined.Search +import androidx.compose.material.icons.outlined.Stop +import androidx.compose.material.icons.outlined.Videocam +import androidx.compose.material.icons.outlined.Visibility +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.DropdownMenu +import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.Icon +import androidx.compose.material3.LinearProgressIndicator +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.derivedStateOf +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue +import androidx.compose.runtime.snapshotFlow +import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.focus.onFocusChanged +import androidx.compose.ui.input.pointer.pointerInput +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.graphicsLayer +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.platform.LocalClipboardManager +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.platform.LocalSoftwareKeyboardController +import androidx.compose.ui.text.AnnotatedString +import androidx.compose.ui.text.SpanStyle +import androidx.compose.ui.text.TextLayoutResult +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.input.KeyboardCapitalization +import androidx.compose.ui.text.style.TextDecoration +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.compose.ui.window.Dialog +import androidx.compose.ui.window.DialogProperties +import androidx.core.content.ContextCompat +import com.seven.ikar.kotlin.core.model.AttachmentDto +import com.seven.ikar.kotlin.core.model.AttachmentKind +import com.seven.ikar.kotlin.core.model.BotCommandDto +import com.seven.ikar.kotlin.core.model.ChatType +import com.seven.ikar.kotlin.core.model.MessageDeliveryState +import com.seven.ikar.kotlin.core.model.MessageDto +import com.seven.ikar.kotlin.core.model.MessageReactionDto +import com.seven.ikar.kotlin.core.network.ServerConfig +import com.seven.ikar.kotlin.core.push.IncomingCallFullScreenSetupHelper +import com.seven.ikar.kotlin.core.push.IncomingCallFullScreenSetupResult +import com.seven.ikar.kotlin.core.settings.ChatSettingsSnapshot +import com.seven.ikar.kotlin.ui.AuthenticatedAsyncImage +import com.seven.ikar.kotlin.ui.AvatarView +import com.seven.ikar.kotlin.ui.ChatWallpaperBackground +import com.seven.ikar.kotlin.ui.IkarHeaderIconBubble +import com.seven.ikar.kotlin.ui.SecureWindowEffect +import com.seven.ikar.kotlin.ui.theme.TelegramBlue +import com.seven.ikar.kotlin.ui.theme.TelegramDanger +import com.seven.ikar.kotlin.ui.theme.TelegramInk +import com.seven.ikar.kotlin.ui.theme.TelegramInkMuted +import com.seven.ikar.kotlin.ui.theme.TelegramSurface +import java.time.Instant +import java.time.LocalDate +import java.time.OffsetDateTime +import java.time.ZoneId +import java.time.format.DateTimeFormatter +import java.util.Locale +import kotlinx.coroutines.FlowPreview +import kotlinx.coroutines.flow.debounce +import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.launch + +private sealed interface ChatRow { + data class DateSeparator(val id: String, val text: String) : ChatRow + data class Message(val item: MessageDto) : ChatRow +} + +private enum class LocalMessageStatus { + Sending, + Failed +} + +private fun ChatUiState.localMessageStatus(messageId: String): LocalMessageStatus? = when { + sendingLocalMessageIds.contains(messageId) -> LocalMessageStatus.Sending + failedLocalMessageIds.contains(messageId) -> LocalMessageStatus.Failed + else -> null +} + +private data class ChatImagePreviewEntry( + val message: MessageDto, + val attachment: AttachmentDto +) + +private data class EmojiGridItem( + val index: Int, + val categoryKey: String, + val categoryIndex: Int, + val emoji: String +) + +private val ChatTimeFormatter = DateTimeFormatter.ofPattern("HH:mm", Locale("ru", "RU")) +private val ChatDayFormatter = DateTimeFormatter.ofPattern("d MMMM", Locale("ru", "RU")) +private val ChatDayYearFormatter = DateTimeFormatter.ofPattern("d MMMM yyyy", Locale("ru", "RU")) + +private sealed interface EmojiPickerMode { + object Composer : EmojiPickerMode + data class Reaction(val message: MessageDto) : EmojiPickerMode +} + +private val EmojiKeyboardFallbackHeight = 300.dp +private val EmojiKeyboardMinHeight = 220.dp +private val EmojiKeyboardMaxHeight = 360.dp +private val EmojiGridMinCellWidth = 38.dp +private val EmojiGridCellHeight = 34.dp +private const val EmojiKeyboardAnimationMillis = 220 + +@OptIn(FlowPreview::class) +@Composable +fun ChatScreen( + state: ChatUiState, + viewModel: ChatViewModel, + chatSettings: ChatSettingsSnapshot, + onBackClick: () -> Unit, + onPeerProfileClick: (() -> Unit)? = null, + onChatNotificationsClick: () -> Unit, + onChatWallpaperClick: () -> Unit, + onForwardMessage: (MessageDto) -> Unit +) { + val clipboard = LocalClipboardManager.current + val context = LocalContext.current + val listState = rememberLazyListState() + val coroutineScope = rememberCoroutineScope() + val rows = remember(state.messages) { buildChatRows(state.messages) } + val latestMessageId = remember(state.messages) { state.messages.lastOrNull()?.id } + val savedScrollPosition = remember(state.chatId) { viewModel.readSavedScrollPosition() } + val firstUnreadRowIndex = remember(rows, state.firstUnreadMessageId) { + state.firstUnreadMessageId + ?.let { unreadMessageId -> rows.indexOfFirst { row -> row is ChatRow.Message && row.item.id == unreadMessageId } } + ?.takeIf { it >= 0 } + } + val currentUserId = state.session?.user?.id + val imagePreviewEntries = remember(state.messages) { + state.messages.flatMap { message -> + message.attachments + .filter { attachment -> attachment.isImageAttachment() } + .map { attachment -> ChatImagePreviewEntry(message = message, attachment = attachment) } + } + } + val currentImagePreviewIndex = remember(state.previewImageAttachmentId, imagePreviewEntries) { + state.previewImageAttachmentId + ?.let { attachmentId -> imagePreviewEntries.indexOfFirst { it.attachment.id == attachmentId } } + ?.takeIf { it >= 0 } + } + val currentImagePreviewEntry = remember(currentImagePreviewIndex, imagePreviewEntries) { + currentImagePreviewIndex?.let(imagePreviewEntries::getOrNull) + } + val hasProtectedContentVisible = remember(state.messages, currentImagePreviewEntry) { + state.messages.any { it.hasProtectedContent && !it.isDeleted() } || + currentImagePreviewEntry?.message?.hasProtectedContent == true + } + val searchResultIds = remember(state.search.resultMessageIds) { state.search.resultMessageIds.toSet() } + val activeSearchMessageId = state.search.activeMessageId + + SecureWindowEffect(enabled = hasProtectedContentVisible) + + LaunchedEffect(state.isChatDeleted) { + if (state.isChatDeleted) { + onBackClick() + } + } + + var emojiPickerMode by remember { mutableStateOf(null) } + var displayedEmojiPickerMode by remember { mutableStateOf(null) } + var frequentEmojis by remember(context) { mutableStateOf(loadFrequentEmojis(context)) } + val emojiCategories = remember(frequentEmojis) { emojiPickerCategories(frequentEmojis) } + val density = LocalDensity.current + val keyboardController = LocalSoftwareKeyboardController.current + var rememberedKeyboardHeight by remember { mutableStateOf(EmojiKeyboardFallbackHeight) } + val currentKeyboardHeight = with(density) { + (WindowInsets.ime.getBottom(this) - WindowInsets.navigationBars.getBottom(this)) + .coerceAtLeast(0) + .toDp() + } + val emojiKeyboardHeight = rememberedKeyboardHeight.coerceIn( + EmojiKeyboardMinHeight, + EmojiKeyboardMaxHeight + ) + var showHeaderMenu by remember { mutableStateOf(false) } + var showClearHistoryConfirm by remember { mutableStateOf(false) } + var showDeleteChatConfirm by remember { mutableStateOf(false) } + var showBotCommandsDialog by remember { mutableStateOf(false) } + var showBotThreadSelection by remember { mutableStateOf(false) } + var messageMenuTarget by remember { mutableStateOf(null) } + var deleteCandidate by remember { mutableStateOf(null) } + var isInitialScrollApplied by remember(state.chatId) { mutableStateOf(false) } + var observedLatestMessageId by remember(state.chatId) { mutableStateOf(null) } + var pendingVideoCallStartAfterSetup by remember { mutableStateOf(false) } + val showScrollToLatestButton by remember(listState, rows) { + derivedStateOf { + rows.isNotEmpty() && + (listState.firstVisibleItemIndex > 0 || listState.firstVisibleItemScrollOffset > 48) + } + } + val singleSelectedMessageId = remember(state.selectedMessageIds) { + state.selectedMessageIds.singleOrNull() + } + val singleSelectedMessage = remember(singleSelectedMessageId, state.messages) { + singleSelectedMessageId?.let { selectedId -> + state.messages.firstOrNull { it.id == selectedId } + } + } + + LaunchedEffect(currentKeyboardHeight) { + if (currentKeyboardHeight > 0.dp) { + rememberedKeyboardHeight = currentKeyboardHeight + } + } + + LaunchedEffect(emojiPickerMode) { + emojiPickerMode?.let { displayedEmojiPickerMode = it } + } + + BackHandler(enabled = state.isMessageSelectionMode) { + viewModel.clearMessageSelection() + } + + BackHandler(enabled = state.search.isActive && !state.isMessageSelectionMode) { + viewModel.closeMessageSearch() + } + + BackHandler(enabled = emojiPickerMode != null) { + emojiPickerMode = null + } + + var continueVideoCallAfterIncomingCallSetup: (() -> Unit)? = null + var runVideoCallIncomingCallPreflight: (() -> Unit)? = null + var requestVideoCallFullScreenNotificationPermission: (() -> Unit)? = null + + val attachmentPicker = rememberLauncherForActivityResult(ActivityResultContracts.GetMultipleContents()) { uris -> + if (uris.isNotEmpty()) { + viewModel.consumeAttachmentUris(uris) + } + } + val microphonePermissionLauncher = rememberLauncherForActivityResult(ActivityResultContracts.RequestPermission()) { granted -> + if (granted) { + viewModel.beginVoiceRecording() + } else { + viewModel.setErrorMessage("Нет доступа к микрофону.") + } + } + + val audioCallPermissionLauncher = rememberLauncherForActivityResult(ActivityResultContracts.RequestPermission()) { granted -> + if (granted) { + viewModel.startAudioCall() + } else { + viewModel.setErrorMessage("Нет доступа к микрофону.") + } + } + val videoCallPermissionLauncher = rememberLauncherForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { permissions -> + val hasMicrophone = permissions[Manifest.permission.RECORD_AUDIO] == true + val hasCamera = permissions[Manifest.permission.CAMERA] == true + if (hasMicrophone && hasCamera) { + pendingVideoCallStartAfterSetup = false + viewModel.startVideoCall() + } else { + pendingVideoCallStartAfterSetup = false + val missing = buildList { + if (!hasMicrophone) add("микрофону") + if (!hasCamera) add("камере") + }.joinToString(" и ") + viewModel.setErrorMessage("Нет доступа к $missing.") + } + } + val fullScreenCallSetupSettingsLauncher = rememberLauncherForActivityResult(ActivityResultContracts.StartActivityForResult()) { + if (!pendingVideoCallStartAfterSetup) { + return@rememberLauncherForActivityResult + } + + when (val result = IncomingCallFullScreenSetupHelper.evaluate(context)) { + IncomingCallFullScreenSetupResult.Ready -> { + continueVideoCallAfterIncomingCallSetup?.invoke() + } + + IncomingCallFullScreenSetupResult.NeedsPostNotificationsPermission -> { + requestVideoCallFullScreenNotificationPermission?.invoke() + } + + is IncomingCallFullScreenSetupResult.NeedsSystemSettings -> { + pendingVideoCallStartAfterSetup = false + viewModel.setErrorMessage(result.detail) + } + } + } + val fullScreenCallNotificationPermissionLauncher = rememberLauncherForActivityResult(ActivityResultContracts.RequestPermission()) { granted -> + if (!pendingVideoCallStartAfterSetup) { + return@rememberLauncherForActivityResult + } + + if (!granted) { + pendingVideoCallStartAfterSetup = false + viewModel.setErrorMessage("Без разрешения на уведомления полноэкранный входящий звонок на заблокированном экране может не появиться.") + return@rememberLauncherForActivityResult + } + + when (val result = IncomingCallFullScreenSetupHelper.evaluate(context)) { + IncomingCallFullScreenSetupResult.Ready -> { + continueVideoCallAfterIncomingCallSetup?.invoke() + } + + IncomingCallFullScreenSetupResult.NeedsPostNotificationsPermission -> { + pendingVideoCallStartAfterSetup = false + viewModel.setErrorMessage("Android не выдал разрешение на уведомления для Икар.") + } + + is IncomingCallFullScreenSetupResult.NeedsSystemSettings -> { + viewModel.setErrorMessage(result.detail) + fullScreenCallSetupSettingsLauncher.launch(result.intent) + } + } + } + requestVideoCallFullScreenNotificationPermission = { + fullScreenCallNotificationPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS) + } + + continueVideoCallAfterIncomingCallSetup = { + val hasMicrophone = ContextCompat.checkSelfPermission(context, Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED + val hasCamera = ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED + if (hasMicrophone && hasCamera) { + pendingVideoCallStartAfterSetup = false + viewModel.startVideoCall() + } else { + videoCallPermissionLauncher.launch( + arrayOf( + Manifest.permission.RECORD_AUDIO, + Manifest.permission.CAMERA + ) + ) + } + } + runVideoCallIncomingCallPreflight = { + when (val result = IncomingCallFullScreenSetupHelper.evaluate(context)) { + IncomingCallFullScreenSetupResult.Ready -> { + continueVideoCallAfterIncomingCallSetup?.invoke() + } + + IncomingCallFullScreenSetupResult.NeedsPostNotificationsPermission -> { + pendingVideoCallStartAfterSetup = true + requestVideoCallFullScreenNotificationPermission?.invoke() + } + + is IncomingCallFullScreenSetupResult.NeedsSystemSettings -> { + pendingVideoCallStartAfterSetup = true + viewModel.setErrorMessage(result.detail) + fullScreenCallSetupSettingsLauncher.launch(result.intent) + } + } + } + + LaunchedEffect( + state.chatId, + rows, + state.errorMessage, + state.chatType, + state.firstUnreadMessageId, + firstUnreadRowIndex, + state.hasMoreMessages, + state.isLoadingOlderMessages, + savedScrollPosition?.rowKey, + savedScrollPosition?.itemIndex, + savedScrollPosition?.itemScrollOffset + ) { + if (isInitialScrollApplied || state.errorMessage != null || rows.isEmpty()) { + return@LaunchedEffect + } + + val channelReadRowIndex = if (state.chatType == ChatType.Channel) { + firstUnreadRowIndex?.let { findLastReadRowIndexBeforeFirstUnread(rows, it) } + } else { + null + } + val shouldLoadChannelReadPosition = + state.chatType == ChatType.Channel && + state.firstUnreadMessageId != null && + channelReadRowIndex == null && + state.hasMoreMessages + + if (shouldLoadChannelReadPosition) { + if (!state.isLoadingOlderMessages) { + viewModel.loadOlderMessages() + } + return@LaunchedEffect + } + + val initialScrollTarget = when { + state.chatType == ChatType.Channel && firstUnreadRowIndex != null -> + (channelReadRowIndex ?: firstUnreadRowIndex) to 0 + + firstUnreadRowIndex != null -> firstUnreadRowIndex to 0 + + else -> savedScrollPosition?.let { position -> + val restoredIndex = rows.indexOfFirst { chatRowKey(it) == position.rowKey } + .takeIf { it >= 0 } + ?: position.itemIndex.coerceIn(0, rows.lastIndex) + restoredIndex to position.itemScrollOffset.coerceAtLeast(0) + } + } + + initialScrollTarget?.let { (restoredIndex, restoredOffset) -> + listState.scrollToItem( + index = restoredIndex, + scrollOffset = restoredOffset + ) + } + isInitialScrollApplied = true + } + + LaunchedEffect(state.scrollRequest?.requestId, rows, isInitialScrollApplied) { + val request = state.scrollRequest ?: return@LaunchedEffect + if (!isInitialScrollApplied || rows.isEmpty()) { + return@LaunchedEffect + } + + val targetIndex = request.messageId?.let { messageId -> + rows.indexOfFirst { row -> row is ChatRow.Message && row.item.id == messageId } + } + if (request.messageId != null && targetIndex == -1) { + return@LaunchedEffect + } + + listState.animateScrollToItem(index = targetIndex?.takeIf { it >= 0 } ?: 0) + viewModel.consumeScrollRequest(request.requestId) + } + + LaunchedEffect(state.chatId, rows, isInitialScrollApplied) { + if (!isInitialScrollApplied || rows.isEmpty()) { + return@LaunchedEffect + } + + snapshotFlow { + val visibleIndex = listState.firstVisibleItemIndex.coerceIn(0, rows.lastIndex) + SavedChatScrollPosition( + rowKey = rows.getOrNull(visibleIndex)?.let(::chatRowKey), + itemIndex = visibleIndex, + itemScrollOffset = listState.firstVisibleItemScrollOffset.coerceAtLeast(0) + ) + } + .distinctUntilChanged() + .debounce(350) + .collect(viewModel::saveScrollPosition) + } + + LaunchedEffect(state.chatId, state.chatType, latestMessageId, isInitialScrollApplied) { + if (!isInitialScrollApplied || latestMessageId == null) { + return@LaunchedEffect + } + + val previousLatestMessageId = observedLatestMessageId + observedLatestMessageId = latestMessageId + if (previousLatestMessageId == null || previousLatestMessageId == latestMessageId) { + return@LaunchedEffect + } + if (state.chatType == ChatType.Channel) { + return@LaunchedEffect + } + + listState.animateScrollToItem(index = 0) + } + + LaunchedEffect(state.chatId, state.chatType, rows, isInitialScrollApplied) { + if (!isInitialScrollApplied || state.chatType != ChatType.Channel || rows.isEmpty()) { + return@LaunchedEffect + } + + snapshotFlow { + listState.layoutInfo.visibleItemsInfo + .mapNotNull { item -> (rows.getOrNull(item.index) as? ChatRow.Message)?.item } + .filterNot { message -> message.isDeleted() } + .maxByOrNull { message -> parseMessageDate(message.sentAt)?.toInstant() ?: Instant.EPOCH } + ?.id + } + .distinctUntilChanged() + .debounce(500) + .collect { messageId -> + if (messageId != null) { + viewModel.acknowledgeRead(messageId) + } + } + } + + LaunchedEffect( + state.chatId, + rows.size, + state.hasMoreMessages, + state.isLoadingOlderMessages, + isInitialScrollApplied + ) { + if (!isInitialScrollApplied || rows.isEmpty()) { + return@LaunchedEffect + } + + snapshotFlow { + if (!state.hasMoreMessages || state.isLoadingOlderMessages || rows.isEmpty()) { + false + } else { + val olderEdgeIndex = (rows.lastIndex - 3).coerceAtLeast(0) + listState.layoutInfo.visibleItemsInfo.any { item -> item.index >= olderEdgeIndex } + } + } + .distinctUntilChanged() + .collect { shouldLoadOlder -> + if (shouldLoadOlder) { + viewModel.loadOlderMessages() + } + } + } + + LaunchedEffect(state.isMessageSelectionMode) { + if (state.isMessageSelectionMode) { + messageMenuTarget = null + emojiPickerMode = null + deleteCandidate = null + showHeaderMenu = false + } + } + + LaunchedEffect(activeSearchMessageId, rows) { + val messageId = activeSearchMessageId ?: return@LaunchedEffect + val rowIndex = rows.indexOfFirst { row -> row is ChatRow.Message && row.item.id == messageId } + if (rowIndex >= 0) { + listState.animateScrollToItem(rowIndex) + } + } + + fun handleEmojiSelected(pickerMode: EmojiPickerMode, emoji: String) { + frequentEmojis = storeFrequentEmoji(context, frequentEmojis, emoji) + when (pickerMode) { + EmojiPickerMode.Composer -> viewModel.appendEmoji(emoji) + is EmojiPickerMode.Reaction -> { + emojiPickerMode = null + val target = pickerMode.message + if (state.selectedMessageIds.contains(target.id)) { + viewModel.toggleReactionFromSelection(target, emoji) + } else { + viewModel.toggleReaction(target, emoji) + } + } + } + } + + Box(modifier = Modifier.fillMaxSize()) { + ChatWallpaperBackground( + snapshot = chatSettings, + modifier = Modifier.fillMaxSize() + ) + + Column( + modifier = Modifier.fillMaxSize() + ) { + if (state.isMessageSelectionMode) { + MessageSelectionHeader( + selectedMessagesCount = state.selectedMessagesCount, + selectedMessage = singleSelectedMessage, + currentUserId = currentUserId, + isDeleteEnabled = !state.isDeletingSelectedMessages, + onClearSelection = viewModel::clearMessageSelection, + onReplySelected = { message -> + viewModel.clearMessageSelection() + viewModel.beginReplyToMessage(message) + }, + onCopySelected = { message -> + clipboard.setText(AnnotatedString(message.text)) + viewModel.clearMessageSelection() + }, + onForwardSelected = { message -> + viewModel.clearMessageSelection() + onForwardMessage(message) + }, + onReactSelected = { message -> + keyboardController?.hide() + displayedEmojiPickerMode = EmojiPickerMode.Reaction(message) + emojiPickerMode = EmojiPickerMode.Reaction(message) + }, + onPinSelected = { message -> + viewModel.clearMessageSelection() + viewModel.togglePinMessage(message) + }, + onDeleteSelectedClick = viewModel::showDeleteSelectedMessagesDialog + ) + } else if (state.search.isActive) { + ChatSearchHeader( + search = state.search, + onQueryChanged = viewModel::updateMessageSearchQuery, + onPrevious = { viewModel.navigateMessageSearch(-1) }, + onNext = { viewModel.navigateMessageSearch(1) }, + onClose = viewModel::closeMessageSearch + ) + } else { + ChatHeader( + title = state.title.ifBlank { "Чат" }, + subtitle = state.subtitle, + avatarTitle = state.title.ifBlank { state.peer?.displayName.orEmpty() }, + avatarUrl = ServerConfig.normalizeMediaUrl(state.peer?.avatarPath), + avatarAccessToken = state.session?.accessToken, + onBackClick = onBackClick, + onAvatarClick = onPeerProfileClick, + onMenuClick = { showHeaderMenu = true } + ) + } + + state.pinnedMessages.firstOrNull()?.let { pinnedMessage -> + PinnedMessageBanner( + message = pinnedMessage, + onClick = { + val rowIndex = rows.indexOfFirst { row -> + row is ChatRow.Message && row.item.id == pinnedMessage.id + } + if (rowIndex >= 0) { + coroutineScope.launch { + listState.animateScrollToItem(rowIndex) + } + } else { + viewModel.setErrorMessage("Закреплённое сообщение находится за пределами загруженной истории. Прокрутите выше, чтобы загрузить старые сообщения.") + } + }, + onUnpinClick = { viewModel.togglePinMessage(pinnedMessage) } + ) + } + + Box( + modifier = Modifier + .weight(1f) + .fillMaxWidth() + ) { + LazyColumn( + state = listState, + reverseLayout = true, + modifier = Modifier.fillMaxSize(), + contentPadding = PaddingValues(start = 10.dp, top = 8.dp, end = 10.dp, bottom = 8.dp), + verticalArrangement = Arrangement.spacedBy(8.dp) + ) { + items( + items = rows, + key = { row -> + when (row) { + is ChatRow.DateSeparator -> row.id + is ChatRow.Message -> row.item.id + } + } + ) { row -> + when (row) { + is ChatRow.DateSeparator -> ChatDateChip(text = row.text) + is ChatRow.Message -> { + val localStatus = state.localMessageStatus(row.item.id) + MessageBubble( + message = row.item, + isOutgoing = row.item.sender.id == currentUserId && + !(state.chatType == ChatType.Channel && row.item.postedAsChannel), + showImagesBeforeText = state.chatType == ChatType.Channel, + isSelected = state.selectedMessageIds.contains(row.item.id), + isSearchMatch = searchResultIds.contains(row.item.id), + isActiveSearchResult = activeSearchMessageId == row.item.id, + isSelectionMode = state.isMessageSelectionMode, + localStatus = localStatus, + accessToken = state.session?.accessToken, + attachmentUrlResolver = viewModel::attachmentPreviewUrl, + onClick = { + if (state.isMessageSelectionMode) { + viewModel.toggleMessageSelection(row.item) + } else if (localStatus == null) { + messageMenuTarget = row.item + } + }, + onAttachmentClick = { attachment -> + if (state.isMessageSelectionMode) { + viewModel.toggleMessageSelection(row.item) + } else { + viewModel.openAttachment(attachment) + } + }, + onQuickActionClick = { commandText -> + if (state.isMessageSelectionMode) { + viewModel.toggleMessageSelection(row.item) + } else { + viewModel.executeBotCommand(commandText) + } + }, + onReactionClick = { emoji -> + if (state.isMessageSelectionMode) { + viewModel.toggleMessageSelection(row.item) + } else { + viewModel.toggleReaction(row.item, emoji) + } + }, + onDoubleTap = { + if (!state.isMessageSelectionMode && !row.item.isDeleted()) { + viewModel.toggleReaction(row.item, "\uD83D\uDC4D") + } + }, + onReplyPreviewClick = { replyMessageId -> + val rowIndex = rows.indexOfFirst { candidate -> + candidate is ChatRow.Message && candidate.item.id == replyMessageId + } + if (rowIndex >= 0) { + coroutineScope.launch { listState.animateScrollToItem(rowIndex) } + } else { + viewModel.setErrorMessage("Сообщение для ответа находится за пределами загруженной истории. Используйте поиск или прокрутите выше, чтобы загрузить старые сообщения.") + } + }, + onSwipeReply = { + if (localStatus == null) { + viewModel.beginReplyToMessage(row.item) + } + }, + onLongPress = { + if (localStatus == null) { + viewModel.handleMessageLongPress(row.item) + } + }, + attachmentPlaybackState = state.attachmentPlayback, + bubbleCornerRadiusDp = chatSettings.bubbleCornerRadiusDp, + messageTextSizeSp = chatSettings.messageTextSizeSp + ) + } + } + } + if (state.isLoadingOlderMessages) { + item(key = "older-messages-loading") { + OlderMessagesLoadingRow() + } + } + } + + if (state.isLoading && state.messages.isEmpty()) { + CircularProgressIndicator( + modifier = Modifier.align(Alignment.Center), + color = TelegramBlue + ) + } + + if (showScrollToLatestButton) { + Surface( + color = TelegramBlue, + shape = CircleShape, + shadowElevation = 6.dp, + modifier = Modifier + .align(Alignment.BottomEnd) + .padding(end = 16.dp, bottom = 16.dp) + .clickable { + coroutineScope.launch { + listState.animateScrollToItem(index = 0) + } + } + ) { + Box( + modifier = Modifier.padding(12.dp), + contentAlignment = Alignment.Center + ) { + Icon( + imageVector = Icons.Outlined.ArrowDownward, + contentDescription = "К последнему сообщению", + tint = Color.White + ) + } + } + } + } + + Column( + modifier = Modifier + .fillMaxWidth() + .then(if (emojiPickerMode == null) Modifier.imePadding() else Modifier) + .navigationBarsPadding() + ) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 10.dp, vertical = 8.dp), + verticalArrangement = Arrangement.spacedBy(8.dp) + ) { + state.activeCall?.let { + CallBanner( + title = viewModel.callBannerTitle(state), + subtitle = viewModel.callBannerSubtitle(state), + showAccept = viewModel.showAcceptCallButton(state), + showDecline = viewModel.showDeclineCallButton(state), + showEnd = viewModel.showEndCallButton(state), + onAccept = viewModel::acceptCall, + onDecline = viewModel::declineCall, + onEnd = viewModel::endCall + ) + } + + if (state.chatType == ChatType.Channel && !state.canSendMessages && !state.canSubscribe) { + InfoBanner(text = "Канал доступен только для чтения. Публикации создают администраторы.") + } + + state.editingMessageId?.let { + ComposerStateCard( + title = "Редактирование", + subtitle = state.editingMessageBanner, + actionText = "Отмена", + onActionClick = viewModel::cancelEditMessage + ) + } + + state.replyTo?.let { replyTo -> + ComposerStateCard( + title = "Ответ ${replyTo.senderDisplayName}", + subtitle = replyTo.previewText, + actionText = "Отмена", + onActionClick = viewModel::cancelReply + ) + } + + state.pendingAttachment?.takeIf { it.imagePreviews.size > 1 }?.let { pending -> + PendingImageAlbumCard( + pending = pending, + onRemoveClick = viewModel::removePendingAttachment + ) + } + + state.pendingAttachment?.takeUnless { it.imagePreviews.size > 1 }?.let { pending -> + ComposerStateCard( + title = pending.fileName, + subtitle = "${pending.contentType} • ${formatFileSize(pending.fileSizeBytes)}", + actionText = "Убрать", + onActionClick = viewModel::removePendingAttachment + ) + } + + state.activeTransfers.forEach { transfer -> + TransferQueueCard( + transfer = transfer, + onRetryClick = { viewModel.retryTransfer(transfer.groupId) }, + onCancelClick = { viewModel.cancelTransfer(transfer.groupId) } + ) + } + + if (state.isRecordingVoiceNote) { + ComposerStateCard( + title = "Идёт запись голосового сообщения", + subtitle = state.voiceRecordingElapsedText, + actionText = "Отменить", + onActionClick = viewModel::cancelVoiceRecording + ) + } + + state.errorMessage?.takeIf { it.isNotBlank() }?.let { + Text( + text = it, + style = MaterialTheme.typography.bodySmall, + color = TelegramDanger, + modifier = Modifier.padding(horizontal = 4.dp) + ) + } + + if (state.canSendMessages) { + ChatComposer( + draftText = state.draftText, + placeholder = if (state.chatType == ChatType.Channel) "Публикация" else "Сообщение", + showVoiceButton = state.draftText.isBlank() && state.pendingAttachment == null && state.editingMessageId == null, + showBotMenuButton = viewModel.showBotComposerMenuButton(state), + isRecording = state.isRecordingVoiceNote, + isSending = state.isSendingMessage, + recordingElapsedText = state.voiceRecordingElapsedText, + onDraftChanged = viewModel::updateDraft, + onEmojiClick = { + keyboardController?.hide() + emojiPickerMode = if (emojiPickerMode is EmojiPickerMode.Composer) { + null + } else { + displayedEmojiPickerMode = EmojiPickerMode.Composer + EmojiPickerMode.Composer + } + }, + onInputFocused = { emojiPickerMode = null }, + onBotMenuClick = { + viewModel.ensureBotCommandsLoaded() + showBotCommandsDialog = true + }, + onAttachClick = { attachmentPicker.launch("*/*") }, + onSendClick = viewModel::sendMessage, + onVoiceClick = { + if (state.isRecordingVoiceNote) { + viewModel.completeVoiceRecording() + } else { + microphonePermissionLauncher.launch(Manifest.permission.RECORD_AUDIO) + } + } + ) + } else if (state.chatType == ChatType.Channel) { + ChannelViewerBar( + isSubscribed = state.isSubscribed, + canSubscribe = state.canSubscribe, + isJoining = state.isJoiningChannel, + publicUsername = state.publicUsername, + subscriberCount = state.subscriberCount, + onSubscribeClick = viewModel::subscribeToChannel + ) + } + } + + AnimatedVisibility( + visible = emojiPickerMode != null, + enter = expandVertically( + expandFrom = Alignment.Bottom, + animationSpec = tween(EmojiKeyboardAnimationMillis) + ), + exit = shrinkVertically( + shrinkTowards = Alignment.Bottom, + animationSpec = tween(EmojiKeyboardAnimationMillis) + ) + ) { + displayedEmojiPickerMode?.let { pickerMode -> + EmojiKeyboardPanel( + categories = emojiCategories, + height = emojiKeyboardHeight, + onEmojiSelected = { emoji -> handleEmojiSelected(pickerMode, emoji) } + ) + } + } + } + } + } + + if (showHeaderMenu) { + val canStartCalls = viewModel.showCallHeaderButton(state) + MessageActionDialog( + title = "Меню чата", + onDismiss = { showHeaderMenu = false }, + actions = buildList { + add( + MessageActionItem( + label = "Уведомления", + icon = Icons.Outlined.Notifications, + onClick = { + showHeaderMenu = false + onChatNotificationsClick() + } + ) + ) + if (canStartCalls) { + add( + MessageActionItem( + label = "Видеозвонок", + icon = Icons.Outlined.Videocam, + onClick = { + showHeaderMenu = false + runVideoCallIncomingCallPreflight?.invoke() + } + ) + ) + add( + MessageActionItem( + label = "Аудиозвонок", + icon = Icons.Outlined.Call, + onClick = { + showHeaderMenu = false + audioCallPermissionLauncher.launch(Manifest.permission.RECORD_AUDIO) + } + ) + ) + } + add( + MessageActionItem( + label = "Настроить обои", + icon = Icons.Outlined.Image, + onClick = { + showHeaderMenu = false + onChatWallpaperClick() + } + ) + ) + if (viewModel.showBotComposerMenuButton(state)) { + add( + MessageActionItem( + label = "Удалить весь контент", + icon = Icons.Outlined.Delete, + isDestructive = true, + onClick = { + showHeaderMenu = false + showClearHistoryConfirm = true + } + ) + ) + } + if (state.chatType == ChatType.Channel && state.isSubscribed && !state.canManageChannel) { + add( + MessageActionItem( + label = if (state.isLeavingChannel) "Отписка..." else "Отписаться от канала", + icon = Icons.Outlined.Delete, + isDestructive = true, + onClick = { + showHeaderMenu = false + viewModel.unsubscribeFromChannel() + } + ) + ) + } else if (state.chatType != ChatType.Channel || state.isSubscribed) { + add( + MessageActionItem( + label = if (state.chatType == ChatType.Channel) "Удалить канал" else "Удалить чат", + icon = Icons.Outlined.Delete, + isDestructive = true, + onClick = { + showHeaderMenu = false + showDeleteChatConfirm = true + } + ) + ) + } + } + ) + } + + if (showDeleteChatConfirm) { + val deleteTitle = if (state.chatType == ChatType.Channel) "Удалить канал?" else "Удалить чат?" + val deleteText = if (state.chatType == ChatType.Channel) { + "Канал исчезнет из вашего списка после подтверждения." + } else { + "Чат исчезнет из вашего списка после подтверждения." + } + AlertDialog( + onDismissRequest = { showDeleteChatConfirm = false }, + title = { Text(deleteTitle) }, + text = { Text(deleteText) }, + confirmButton = { + TextButton( + enabled = !state.isDeletingChat, + onClick = { + showDeleteChatConfirm = false + viewModel.deleteChat() + } + ) { + Text("Удалить", color = MaterialTheme.colorScheme.error) + } + }, + dismissButton = { + TextButton( + enabled = !state.isDeletingChat, + onClick = { showDeleteChatConfirm = false } + ) { + Text("Отмена") + } + } + ) + } + + if (showClearHistoryConfirm) { + AlertDialog( + onDismissRequest = { showClearHistoryConfirm = false }, + title = { Text("Удалить весь контент") }, + text = { Text("Удалить все сообщения и вложения в этом чате с ботом без возможности восстановления?") }, + confirmButton = { + TextButton(onClick = { + showHeaderMenu = false + showClearHistoryConfirm = false + viewModel.clearChatHistory() + }) { + Text("Удалить", color = MaterialTheme.colorScheme.error) + } + }, + dismissButton = { + TextButton(onClick = { showClearHistoryConfirm = false }) { + Text("Отмена") + } + } + ) + } + + if (showBotCommandsDialog) { + ActionDialog( + title = "Команды бота", + onDismiss = { showBotCommandsDialog = false }, + actions = viewModel.availableBotCommands(state).map { command -> + val label = if (command.description.isBlank()) "/${command.command}" else "/${command.command} ${command.description}" + label to { + showBotCommandsDialog = false + when (command.command.lowercase(Locale.ROOT)) { + "use" -> { + val quickActions = viewModel.latestBotQuickActions(state) + if (quickActions.isNotEmpty()) { + showBotThreadSelection = true + } else { + viewModel.executeBotCommand("/threads") + } + } + + "newthread" -> viewModel.executeBotCommand("/newthread") + "turn" -> { + if (state.draftText.isBlank()) { + viewModel.setErrorMessage("Для /turn нужен текст. После выбора потока можно просто отправить обычное сообщение без команды.") + } else { + viewModel.executeBotCommand("/turn ${state.draftText.trim()}") + } + } + + else -> viewModel.executeBotCommand("/${command.command}") + } + } + } + ) + } + + if (showBotThreadSelection) { + ActionDialog( + title = "Выберите поток", + onDismiss = { showBotThreadSelection = false }, + actions = viewModel.latestBotQuickActions(state).map { action -> + action.title to { + showBotThreadSelection = false + viewModel.executeBotCommand(action.commandText) + } + } + ) + } + + messageMenuTarget?.let { target -> + val actionItems = buildMessageMenuItems( + message = target, + currentUserId = currentUserId, + onCopy = { + clipboard.setText(AnnotatedString(target.text)) + messageMenuTarget = null + }, + onForward = { + messageMenuTarget = null + onForwardMessage(target) + }, + onReply = { + messageMenuTarget = null + viewModel.beginReplyToMessage(target) + }, + onReact = { + messageMenuTarget = null + keyboardController?.hide() + displayedEmojiPickerMode = EmojiPickerMode.Reaction(target) + emojiPickerMode = EmojiPickerMode.Reaction(target) + }, + onPin = { + messageMenuTarget = null + viewModel.togglePinMessage(target) + }, + onEdit = { + messageMenuTarget = null + viewModel.beginEditMessage(target) + }, + onDelete = { + messageMenuTarget = null + deleteCandidate = target + } + ) + + if (actionItems.isNotEmpty()) { + MessageActionDialog( + title = "Действия с сообщением", + onDismiss = { messageMenuTarget = null }, + actions = actionItems + ) + } + } + + deleteCandidate?.let { target -> + AlertDialog( + onDismissRequest = { deleteCandidate = null }, + title = { Text("Удалить сообщение") }, + text = { Text("Удалить это сообщение для всех участников?") }, + confirmButton = { + TextButton(onClick = { + deleteCandidate = null + viewModel.deleteMessage(target) + }) { + Text("Удалить") + } + }, + dismissButton = { + TextButton(onClick = { deleteCandidate = null }) { + Text("Отмена") + } + } + ) + } + + if (state.isDeleteSelectionDialogVisible) { + DeleteSelectedMessagesDialog( + selectedMessagesCount = state.selectedMessagesCount, + isDeletingSelectedMessages = state.isDeletingSelectedMessages, + onDismiss = viewModel::dismissDeleteSelectedMessagesDialog, + onConfirmDelete = viewModel::confirmDeleteSelectedMessages + ) + } + + currentImagePreviewEntry?.let { previewEntry -> + val previewIndex = currentImagePreviewIndex ?: return@let + ChatImagePreviewDialog( + entry = previewEntry, + accessToken = state.session?.accessToken, + imageUrl = viewModel.attachmentPreviewUrl(previewEntry.attachment), + enableEdgeTapNavigation = chatSettings.mediaTapToBrowseEnabled, + canNavigatePrevious = previewIndex > 0, + canNavigateNext = previewIndex < imagePreviewEntries.lastIndex, + canDelete = previewEntry.message.canDelete(currentUserId), + isProtectedContent = previewEntry.message.hasProtectedContent, + onDismiss = viewModel::dismissImagePreview, + onNavigatePrevious = { + imagePreviewEntries.getOrNull(previewIndex - 1)?.let { previousEntry -> + viewModel.showImagePreviewAttachment(previousEntry.attachment.id) + } + }, + onNavigateNext = { + imagePreviewEntries.getOrNull(previewIndex + 1)?.let { nextEntry -> + viewModel.showImagePreviewAttachment(nextEntry.attachment.id) + } + }, + onSaveToGallery = { viewModel.saveImageAttachmentToGallery(previewEntry.attachment) }, + onReply = { + viewModel.beginReplyToMessage(previewEntry.message) + viewModel.dismissImagePreview() + }, + onShare = { viewModel.shareAttachmentExternally(previewEntry.attachment) }, + onDelete = { + viewModel.dismissImagePreview() + deleteCandidate = previewEntry.message + } + ) + } +} + +@Composable +private fun ChatHeader( + title: String, + subtitle: String, + avatarTitle: String, + avatarUrl: String?, + avatarAccessToken: String?, + onBackClick: () -> Unit, + onAvatarClick: (() -> Unit)?, + onMenuClick: () -> Unit +) { + Column( + modifier = Modifier + .fillMaxWidth() + .background(Color(0xFFF9FFFF)) + ) { + Spacer(modifier = Modifier.windowInsetsTopHeight(WindowInsets.statusBars)) + Row( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 10.dp, vertical = 10.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(10.dp) + ) { + IkarHeaderIconBubble(onClick = onBackClick) { + Icon( + imageVector = Icons.AutoMirrored.Outlined.ArrowBack, + contentDescription = "Назад", + tint = TelegramInk + ) + } + + Box( + modifier = if (onAvatarClick != null) { + Modifier + .clip(CircleShape) + .clickable(onClick = onAvatarClick) + } else { + Modifier + } + ) { + AvatarView( + imageUrl = avatarUrl, + title = avatarTitle, + accessToken = avatarAccessToken, + size = 42.dp + ) + } + + Column( + modifier = Modifier.weight(1f), + verticalArrangement = Arrangement.spacedBy(1.dp) + ) { + Text( + text = title, + style = MaterialTheme.typography.headlineLarge, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + if (subtitle.isNotBlank()) { + Text( + text = subtitle, + style = MaterialTheme.typography.bodySmall, + color = TelegramInkMuted, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + } + } + + IkarHeaderIconBubble(onClick = onMenuClick) { + Icon(Icons.Outlined.Menu, contentDescription = "Меню", tint = TelegramInk) + } + } + } +} + +@Composable +private fun ChatSearchHeader( + search: ChatSearchUiState, + onQueryChanged: (String) -> Unit, + onPrevious: () -> Unit, + onNext: () -> Unit, + onClose: () -> Unit +) { + val hasResults = search.resultMessageIds.isNotEmpty() + val resultLabel = when { + search.query.isBlank() -> "" + search.isSearching -> "..." + hasResults -> "${search.activeResultIndex + 1}/${search.resultMessageIds.size}" + else -> "0/0" + } + + Column( + modifier = Modifier + .fillMaxWidth() + .background(Color(0xFFF9FFFF)) + ) { + Spacer(modifier = Modifier.windowInsetsTopHeight(WindowInsets.statusBars)) + Row( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 10.dp, vertical = 10.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(10.dp) + ) { + IkarHeaderIconBubble(onClick = onClose) { + Icon(Icons.Outlined.Close, contentDescription = "Закрыть поиск", tint = TelegramInk) + } + + Surface( + color = TelegramSurface, + shape = RoundedCornerShape(18.dp), + modifier = Modifier.weight(1f) + ) { + BasicTextField( + value = search.query, + onValueChange = onQueryChanged, + singleLine = true, + textStyle = MaterialTheme.typography.bodyLarge.copy(color = TelegramInk), + modifier = Modifier.padding(horizontal = 14.dp, vertical = 10.dp), + decorationBox = { innerTextField -> + if (search.query.isBlank()) { + Text( + text = "Поиск сообщений", + style = MaterialTheme.typography.bodyLarge, + color = TelegramInkMuted + ) + } + innerTextField() + } + ) + } + + Text( + text = resultLabel, + style = MaterialTheme.typography.labelMedium, + color = TelegramInkMuted + ) + + IkarHeaderIconBubble(onClick = onPrevious.takeIf { hasResults }) { + Icon( + Icons.Outlined.KeyboardArrowUp, + contentDescription = "Предыдущий результат", + tint = if (hasResults) TelegramInk else TelegramInkMuted + ) + } + IkarHeaderIconBubble(onClick = onNext.takeIf { hasResults }) { + Icon( + Icons.Outlined.KeyboardArrowDown, + contentDescription = "Следующий результат", + tint = if (hasResults) TelegramInk else TelegramInkMuted + ) + } + } + if (search.isSearching) { + LinearProgressIndicator( + modifier = Modifier.fillMaxWidth(), + color = TelegramBlue + ) + } + } +} + +@Composable +private fun MessageSelectionHeader( + selectedMessagesCount: Int, + selectedMessage: MessageDto?, + currentUserId: String?, + isDeleteEnabled: Boolean, + onClearSelection: () -> Unit, + onReplySelected: (MessageDto) -> Unit, + onCopySelected: (MessageDto) -> Unit, + onForwardSelected: (MessageDto) -> Unit, + onReactSelected: (MessageDto) -> Unit, + onPinSelected: (MessageDto) -> Unit, + onDeleteSelectedClick: () -> Unit +) { + val canUseSingleActions = selectedMessagesCount == 1 && selectedMessage != null && !selectedMessage.isDeleted() + val canCopy = canUseSingleActions && + selectedMessage?.hasProtectedContent != true && + selectedMessage?.text?.isNotBlank() == true + val canForward = canUseSingleActions && + selectedMessage?.hasProtectedContent != true && + selectedMessage?.let { it.text.isNotBlank() || it.attachments.isNotEmpty() } == true + Column( + modifier = Modifier + .fillMaxWidth() + .background(Color(0xFFF9FFFF)) + ) { + Spacer(modifier = Modifier.windowInsetsTopHeight(WindowInsets.statusBars)) + Row( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 10.dp, vertical = 10.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(10.dp) + ) { + IkarHeaderIconBubble(onClick = onClearSelection) { + Icon( + imageVector = Icons.Outlined.Close, + contentDescription = "Снять выделение", + tint = TelegramInk + ) + } + + Column( + modifier = Modifier.weight(1f), + verticalArrangement = Arrangement.spacedBy(1.dp) + ) { + Text( + text = messageSelectionCountLabel(selectedMessagesCount), + style = MaterialTheme.typography.headlineLarge, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + Text( + text = "Можно удалить выбранные сообщения", + style = MaterialTheme.typography.bodySmall, + color = TelegramInkMuted, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + } + + if (canUseSingleActions && selectedMessage != null) { + SelectionActionButton( + icon = Icons.AutoMirrored.Outlined.ArrowBack, + contentDescription = "Ответить", + enabled = true, + onClick = { onReplySelected(selectedMessage) } + ) + SelectionActionButton( + icon = Icons.Outlined.ContentCopy, + contentDescription = "Копировать", + enabled = canCopy, + onClick = { onCopySelected(selectedMessage) } + ) + SelectionActionButton( + icon = Icons.AutoMirrored.Outlined.Send, + contentDescription = "Переслать", + enabled = canForward, + onClick = { onForwardSelected(selectedMessage) } + ) + SelectionActionButton( + icon = Icons.Outlined.Mood, + contentDescription = "Реакция", + enabled = true, + onClick = { onReactSelected(selectedMessage) } + ) + SelectionActionButton( + icon = Icons.Outlined.PushPin, + contentDescription = if (selectedMessage.pinnedAt == null) "Закрепить" else "Открепить", + enabled = selectedMessage.canDelete(currentUserId), + onClick = { onPinSelected(selectedMessage) } + ) + } + + IkarHeaderIconBubble(onClick = onDeleteSelectedClick.takeIf { isDeleteEnabled }) { + Icon( + imageVector = Icons.Outlined.Delete, + contentDescription = "Удалить выбранные сообщения", + tint = if (isDeleteEnabled) TelegramDanger else TelegramInkMuted + ) + } + } + } +} + +@Composable +private fun SelectionActionButton( + icon: ImageVector, + contentDescription: String, + enabled: Boolean, + onClick: () -> Unit +) { + IkarHeaderIconBubble(onClick = onClick.takeIf { enabled }) { + Icon( + imageVector = icon, + contentDescription = contentDescription, + tint = if (enabled) TelegramInk else TelegramInkMuted + ) + } +} + +@Composable +private fun PinnedMessageBanner( + message: MessageDto, + onClick: () -> Unit, + onUnpinClick: () -> Unit +) { + Surface( + color = Color.White.copy(alpha = 0.96f), + shadowElevation = 2.dp, + modifier = Modifier + .fillMaxWidth() + .clickable(onClick = onClick) + ) { + Row( + modifier = Modifier.padding(horizontal = 12.dp, vertical = 8.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(10.dp) + ) { + Box( + modifier = Modifier + .width(3.dp) + .height(36.dp) + .clip(CircleShape) + .background(TelegramBlue) + ) + Icon( + imageVector = Icons.Outlined.PushPin, + contentDescription = "Закрепленное сообщение", + tint = TelegramBlue, + modifier = Modifier.size(18.dp) + ) + Column(modifier = Modifier.weight(1f)) { + Text( + text = "Закрепленное сообщение", + style = MaterialTheme.typography.labelMedium, + color = TelegramBlue, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + Text( + text = pinnedMessagePreview(message), + style = MaterialTheme.typography.bodySmall, + color = TelegramInk, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + } + IkarHeaderIconBubble(onClick = onUnpinClick) { + Icon( + imageVector = Icons.Outlined.Close, + contentDescription = "Открепить", + tint = TelegramInkMuted + ) + } + } + } +} + +@Composable +private fun CallBanner( + title: String, + subtitle: String, + showAccept: Boolean, + showDecline: Boolean, + showEnd: Boolean, + onAccept: () -> Unit, + onDecline: () -> Unit, + onEnd: () -> Unit +) { + Surface( + color = Color(0xFFF2F8FF), + shape = RoundedCornerShape(16.dp), + shadowElevation = 0.dp + ) { + Column( + modifier = Modifier.padding(horizontal = 14.dp, vertical = 12.dp), + verticalArrangement = Arrangement.spacedBy(10.dp) + ) { + Text(title, style = MaterialTheme.typography.titleLarge) + if (subtitle.isNotBlank()) { + Text(subtitle, style = MaterialTheme.typography.bodySmall, color = TelegramInkMuted) + } + Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) { + if (showAccept) { + ActionChip(text = "Принять", background = TelegramBlue, textColor = Color.White, onClick = onAccept) + } + if (showDecline) { + ActionChip(text = "Отклонить", background = Color(0xFFF8E1E3), textColor = TelegramDanger, onClick = onDecline) + } + if (showEnd) { + ActionChip(text = "Отбой", background = Color(0xFFF8E1E3), textColor = TelegramDanger, onClick = onEnd) + } + } + } + } +} + +@Composable +private fun ActionChip( + text: String, + background: Color, + textColor: Color, + enabled: Boolean = true, + onClick: () -> Unit +) { + Surface( + modifier = Modifier.clickable(enabled = enabled, onClick = onClick), + color = background, + shape = RoundedCornerShape(16.dp), + shadowElevation = 0.dp + ) { + Text( + text = text, + modifier = Modifier.padding(horizontal = 14.dp, vertical = 9.dp), + style = MaterialTheme.typography.labelLarge, + color = textColor + ) + } +} + +@Composable +private fun ChannelViewerBar( + isSubscribed: Boolean, + canSubscribe: Boolean, + isJoining: Boolean, + publicUsername: String?, + subscriberCount: Int, + onSubscribeClick: () -> Unit +) { + Surface( + color = Color(0xFFF9FFFF), + shape = RoundedCornerShape(24.dp), + shadowElevation = 4.dp + ) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 14.dp, vertical = 10.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(10.dp) + ) { + Column(modifier = Modifier.weight(1f), verticalArrangement = Arrangement.spacedBy(2.dp)) { + Text( + text = when { + canSubscribe -> "Публичный канал" + isSubscribed -> "Вы подписаны на канал" + else -> "Канал только для чтения" + }, + style = MaterialTheme.typography.titleMedium, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + Text( + text = listOfNotNull( + publicUsername?.let { "@$it" }, + formatChannelSubscribers(subscriberCount) + ).joinToString(" • "), + style = MaterialTheme.typography.bodySmall, + color = TelegramInkMuted, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + } + if (canSubscribe) { + ActionChip( + text = if (isJoining) "Подписка..." else "Подписаться", + background = TelegramBlue, + textColor = Color.White, + enabled = !isJoining, + onClick = onSubscribeClick + ) + } + } + } +} + +@Composable +private fun InfoBanner(text: String) { + Surface( + color = Color(0xFFFDF6E3), + shape = RoundedCornerShape(16.dp), + shadowElevation = 0.dp + ) { + Text( + text = text, + modifier = Modifier.padding(horizontal = 14.dp, vertical = 12.dp), + style = MaterialTheme.typography.bodyMedium, + color = Color(0xFF9C6B00) + ) + } +} + +@Composable +private fun PendingImageAlbumCard( + pending: PendingAttachmentUiState, + onRemoveClick: () -> Unit +) { + Surface( + color = Color(0xFFF9FFFF), + shape = RoundedCornerShape(18.dp), + shadowElevation = 0.dp + ) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 12.dp, vertical = 10.dp), + verticalArrangement = Arrangement.spacedBy(8.dp) + ) { + Row( + modifier = Modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(10.dp) + ) { + Column(modifier = Modifier.weight(1f), verticalArrangement = Arrangement.spacedBy(2.dp)) { + Text(pending.fileName, style = MaterialTheme.typography.titleMedium, maxLines = 1, overflow = TextOverflow.Ellipsis) + Text( + text = "${pending.contentType} • ${formatFileSize(pending.fileSizeBytes)}", + style = MaterialTheme.typography.bodySmall, + color = TelegramInkMuted, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + } + TextButton(onClick = onRemoveClick) { + Text("Убрать") + } + } + + PendingImageAlbumGrid(previews = pending.imagePreviews) + } + } +} + +@Composable +private fun PendingImageAlbumGrid(previews: List) { + ImageCollageLayout( + itemCount = previews.size, + minHeight = 112.dp, + maxHeight = 144.dp + ) { index, modifier, overlayText -> + val preview = previews[index] + ImageCollageTile( + imageUrl = "file://${preview.localPath}", + accessToken = null, + contentDescription = preview.fileName, + modifier = modifier, + overlayText = overlayText + ) + } +} + +@Composable +private fun ComposerStateCard( + title: String, + subtitle: String, + actionText: String, + onActionClick: () -> Unit +) { + Surface( + color = Color(0xFFF9FFFF), + shape = RoundedCornerShape(18.dp), + shadowElevation = 0.dp + ) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 14.dp, vertical = 10.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(10.dp) + ) { + Column(modifier = Modifier.weight(1f), verticalArrangement = Arrangement.spacedBy(2.dp)) { + Text(title, style = MaterialTheme.typography.titleMedium, maxLines = 1, overflow = TextOverflow.Ellipsis) + Text(subtitle, style = MaterialTheme.typography.bodySmall, color = TelegramInkMuted, maxLines = 1, overflow = TextOverflow.Ellipsis) + } + TextButton(onClick = onActionClick) { + Text(actionText) + } + } + } +} + +@Composable +private fun TransferQueueCard( + transfer: TransferQueueUiState, + onRetryClick: () -> Unit, + onCancelClick: () -> Unit +) { + val isFailed = transfer.status == "failed" + ComposerStateCard( + title = transfer.title, + subtitle = when { + isFailed -> transfer.errorMessage ?: "Не удалось загрузить" + transfer.status == "queued" -> "В очереди" + transfer.status == "running" -> "Загрузка ${transfer.progressPercent}%" + else -> transfer.status + }, + actionText = if (isFailed) "Повторить" else "Отменить", + onActionClick = if (isFailed) onRetryClick else onCancelClick + ) +} + +@Composable +private fun ChatComposer( + draftText: String, + placeholder: String, + showVoiceButton: Boolean, + showBotMenuButton: Boolean, + isRecording: Boolean, + isSending: Boolean, + recordingElapsedText: String, + onDraftChanged: (String) -> Unit, + onEmojiClick: () -> Unit, + onInputFocused: () -> Unit, + onBotMenuClick: () -> Unit, + onAttachClick: () -> Unit, + onSendClick: () -> Unit, + onVoiceClick: () -> Unit +) { + Surface( + color = Color(0xFFF9FFFF), + shape = RoundedCornerShape(26.dp), + shadowElevation = 4.dp + ) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 4.dp, vertical = 2.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(2.dp) + ) { + ChatComposerIcon( + icon = if (showBotMenuButton) Icons.Outlined.Menu else Icons.Outlined.Mood, + description = if (showBotMenuButton) "Команды бота" else "Эмодзи", + onClick = if (showBotMenuButton) onBotMenuClick else onEmojiClick + ) + + BasicTextField( + value = draftText, + onValueChange = onDraftChanged, + enabled = !isSending, + keyboardOptions = KeyboardOptions(capitalization = KeyboardCapitalization.Sentences), + modifier = Modifier + .weight(1f) + .onFocusChanged { focusState -> + if (focusState.isFocused) { + onInputFocused() + } + } + .padding(horizontal = 4.dp, vertical = 10.dp), + textStyle = MaterialTheme.typography.bodyLarge.copy( + color = TelegramInk, + fontSize = 19.sp + ), + singleLine = false, + maxLines = 4, + decorationBox = { innerTextField -> + Box( + modifier = Modifier.fillMaxWidth(), + contentAlignment = Alignment.CenterStart + ) { + if (draftText.isBlank()) { + Text( + text = placeholder, + style = MaterialTheme.typography.bodyLarge.copy(fontSize = 19.sp), + color = TelegramInkMuted + ) + } + innerTextField() + } + } + ) + + ChatComposerIcon( + icon = Icons.Outlined.AttachFile, + description = "Вложение", + onClick = onAttachClick + ) + + Surface( + color = TelegramBlue, + shape = CircleShape, + modifier = Modifier.padding(end = 2.dp) + ) { + Box( + modifier = Modifier + .clickable( + enabled = !isSending, + onClick = if (showVoiceButton || isRecording) onVoiceClick else onSendClick + ) + .padding(10.dp), + contentAlignment = Alignment.Center + ) { + if (isSending) { + CircularProgressIndicator( + modifier = Modifier.size(20.dp), + color = Color.White, + strokeWidth = 2.dp + ) + } else { + Icon( + imageVector = when { + isRecording -> Icons.Outlined.Stop + showVoiceButton -> Icons.Outlined.Mic + else -> Icons.AutoMirrored.Outlined.Send + }, + contentDescription = when { + isRecording -> "Остановить запись" + showVoiceButton -> "Голосовое сообщение" + else -> "Отправить" + }, + tint = Color.White + ) + } + } + } + } + } + + if (isRecording) { + Text( + text = "Запись: $recordingElapsedText", + style = MaterialTheme.typography.bodySmall, + color = TelegramDanger, + modifier = Modifier.padding(horizontal = 8.dp) + ) + } +} + +@Composable +private fun ChatComposerIcon( + icon: androidx.compose.ui.graphics.vector.ImageVector, + description: String, + onClick: () -> Unit +) { + Box( + modifier = Modifier + .clickable(onClick = onClick) + .padding(8.dp), + contentAlignment = Alignment.Center + ) { + Icon(icon, contentDescription = description, tint = TelegramInkMuted) + } +} + +@Composable +private fun OlderMessagesLoadingRow() { + Box( + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 12.dp), + contentAlignment = Alignment.Center + ) { + CircularProgressIndicator( + modifier = Modifier.size(22.dp), + color = TelegramBlue, + strokeWidth = 2.dp + ) + } +} + +@Composable +private fun ChatDateChip(text: String) { + Box( + modifier = Modifier.fillMaxWidth(), + contentAlignment = Alignment.Center + ) { + Surface( + color = Color(0xFF8AA66F), + shape = RoundedCornerShape(12.dp), + shadowElevation = 0.dp + ) { + Text( + text = text, + modifier = Modifier.padding(horizontal = 12.dp, vertical = 4.dp), + style = MaterialTheme.typography.labelMedium, + color = Color.White + ) + } + } +} + +@OptIn(ExperimentalFoundationApi::class) +@Composable +private fun MessageBubble( + message: MessageDto, + isOutgoing: Boolean, + showImagesBeforeText: Boolean, + isSelected: Boolean, + isSearchMatch: Boolean, + isActiveSearchResult: Boolean, + isSelectionMode: Boolean, + localStatus: LocalMessageStatus?, + accessToken: String?, + attachmentUrlResolver: (AttachmentDto) -> String, + onClick: () -> Unit, + onAttachmentClick: (AttachmentDto) -> Unit, + onQuickActionClick: (String) -> Unit, + onReactionClick: (String) -> Unit, + onDoubleTap: () -> Unit, + onReplyPreviewClick: (String) -> Unit, + onSwipeReply: () -> Unit, + onLongPress: () -> Unit, + attachmentPlaybackState: Map, + bubbleCornerRadiusDp: Int, + messageTextSizeSp: Int +) { + val botQuickActions = remember(message.id, message.text) { buildBotQuickActions(message) } + val hasAttachments = message.attachments.isNotEmpty() + val selectionBackground = when { + isSelected -> TelegramBlue.copy(alpha = 0.12f) + isActiveSearchResult -> Color(0xFFFFD166).copy(alpha = 0.46f) + isSearchMatch -> Color(0xFFFFD166).copy(alpha = 0.22f) + else -> Color.Transparent + } + val displayText = if (message.isDeleted()) "Сообщение удалено." else message.text + val displayContent = remember(message.id, displayText) { buildMessageDisplayContent(displayText) } + val bubbleContentSpacing = if (!hasAttachments && displayContent.imageUrls.isEmpty() && botQuickActions.isEmpty()) 4.dp else 8.dp + val bubbleShape = RoundedCornerShape(bubbleCornerRadiusDp.dp) + val selectionShape = RoundedCornerShape((bubbleCornerRadiusDp + 4).coerceIn(8, 28).dp) + val density = LocalDensity.current + val context = LocalContext.current + val maxSwipeOffsetPx = with(density) { 72.dp.toPx() } + val swipeReplyThresholdPx = with(density) { 42.dp.toPx() } + var swipeOffsetPx by remember(message.id, isSelectionMode) { mutableStateOf(0f) } + val canSwipeToReply = !isSelectionMode && !message.isDeleted() + BoxWithConstraints(modifier = Modifier.fillMaxWidth()) { + val maxBubbleWidth = maxWidth * 0.8f + + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = if (isOutgoing) Arrangement.End else Arrangement.Start, + verticalAlignment = Alignment.Bottom + ) { + if (isOutgoing && isSelected) { + SelectionIndicator() + Spacer(modifier = Modifier.width(8.dp)) + } + + Box( + modifier = Modifier + .background(selectionBackground, selectionShape) + .padding(2.dp) + ) { + Surface( + color = if (hasAttachments) Color.Transparent else if (isOutgoing) Color(0xFFE7F7C8) else TelegramSurface, + shape = bubbleShape, + shadowElevation = if (hasAttachments) 0.dp else 1.dp, + modifier = Modifier + .widthIn(max = maxBubbleWidth) + .graphicsLayer { + translationX = swipeOffsetPx + alpha = if (localStatus == LocalMessageStatus.Sending) 0.72f else 1f + } + .pointerInput(message.id, canSwipeToReply) { + if (!canSwipeToReply) { + return@pointerInput + } + + detectHorizontalDragGestures( + onDragEnd = { + val shouldReply = swipeOffsetPx <= -swipeReplyThresholdPx + swipeOffsetPx = 0f + if (shouldReply) { + onSwipeReply() + } + }, + onDragCancel = { + swipeOffsetPx = 0f + } + ) { _, dragAmount -> + swipeOffsetPx = (swipeOffsetPx + dragAmount).coerceIn(-maxSwipeOffsetPx, 0f) + } + } + .combinedClickable( + onClick = onClick, + onDoubleClick = onDoubleTap, + onLongClick = onLongPress + ) + ) { + Column( + modifier = Modifier.padding( + horizontal = if (hasAttachments) 0.dp else 12.dp, + vertical = if (hasAttachments) 0.dp else 10.dp + ), + verticalArrangement = Arrangement.spacedBy(bubbleContentSpacing) + ) { + message.replyTo?.let { replyTo -> + ReplyPreviewCard( + replyTo = replyTo, + modifier = Modifier.padding(horizontal = if (hasAttachments) 6.dp else 0.dp), + onClick = { onReplyPreviewClick(replyTo.messageId) } + ) + } + + if (!message.forwardedFromDisplayName.isNullOrBlank()) { + Text( + text = "Переслано от ${message.forwardedFromDisplayName}", + style = MaterialTheme.typography.labelMedium, + color = TelegramBlue, + modifier = Modifier.padding(horizontal = if (hasAttachments) 6.dp else 0.dp) + ) + } + + val imageAttachments = message.attachments.filter { it.isImageAttachment() } + + if (showImagesBeforeText) { + displayContent.imageUrls.forEach { imageUrl -> + InlineMessageImage( + imageUrl = imageUrl, + onClick = { openExternalUrl(context, imageUrl) }, + onLongPress = onLongPress + ) + } + + if (imageAttachments.size > 1) { + AttachmentAlbumGrid( + attachments = imageAttachments, + attachmentUrlResolver = attachmentUrlResolver, + accessToken = accessToken, + onAttachmentClick = onAttachmentClick, + onLongPress = onLongPress + ) + } else { + imageAttachments.forEach { attachment -> + AttachmentCard( + attachment = attachment, + attachmentUrl = attachmentUrlResolver(attachment), + accessToken = accessToken, + playbackState = attachmentPlaybackState[attachment.id], + onClick = { onAttachmentClick(attachment) }, + onLongPress = onLongPress + ) + } + } + } + + if (displayContent.text.isNotBlank()) { + MessageText( + text = displayContent.text, + modifier = Modifier.padding(horizontal = if (hasAttachments) 6.dp else 0.dp), + textSizeSp = messageTextSizeSp, + onTap = onClick, + onLongPress = onLongPress + ) + } + + if (!showImagesBeforeText) { + displayContent.imageUrls.forEach { imageUrl -> + InlineMessageImage( + imageUrl = imageUrl, + onClick = { openExternalUrl(context, imageUrl) }, + onLongPress = onLongPress + ) + } + } + + val remainingAttachments = if (showImagesBeforeText || imageAttachments.size > 1) { + message.attachments.filterNot { it.isImageAttachment() } + } else { + message.attachments + } + + if (!showImagesBeforeText && imageAttachments.size > 1) { + AttachmentAlbumGrid( + attachments = imageAttachments, + attachmentUrlResolver = attachmentUrlResolver, + accessToken = accessToken, + onAttachmentClick = onAttachmentClick, + onLongPress = onLongPress + ) + } + + remainingAttachments.forEach { attachment -> + AttachmentCard( + attachment = attachment, + attachmentUrl = attachmentUrlResolver(attachment), + accessToken = accessToken, + playbackState = attachmentPlaybackState[attachment.id], + onClick = { onAttachmentClick(attachment) }, + onLongPress = onLongPress + ) + } + + if (botQuickActions.isNotEmpty()) { + FlowRow( + horizontalArrangement = Arrangement.spacedBy(6.dp), + verticalArrangement = Arrangement.spacedBy(6.dp) + ) { + botQuickActions.forEach { action -> + Surface( + color = Color(0xFFEEF5FD), + shape = RoundedCornerShape(16.dp), + modifier = Modifier.clickable { onQuickActionClick(action.commandText) } + ) { + Text( + text = action.title, + modifier = Modifier.padding(horizontal = 12.dp, vertical = 8.dp), + style = MaterialTheme.typography.labelLarge, + color = TelegramBlue + ) + } + } + } + } + + if (message.reactions.isNotEmpty()) { + ReactionRow( + reactions = message.reactions, + onReactionClick = onReactionClick + ) + } + + MessageMeta( + sentAt = message.sentAt, + deliveryState = message.deliveryState, + isOutgoing = isOutgoing, + viewCount = message.viewCount, + localStatus = localStatus, + modifier = Modifier.align(Alignment.End) + ) + } + } + } + + if (!isOutgoing && isSelected) { + Spacer(modifier = Modifier.width(8.dp)) + SelectionIndicator() + } + } + } +} + +@Composable +private fun SelectionIndicator() { + Icon( + imageVector = Icons.Outlined.CheckCircle, + contentDescription = "Сообщение выбрано", + tint = TelegramBlue, + modifier = Modifier.size(20.dp) + ) +} + +@Composable +private fun EmojiKeyboardPanel( + categories: List, + height: Dp, + onEmojiSelected: (String) -> Unit +) { + val gridState = rememberLazyGridState() + val coroutineScope = rememberCoroutineScope() + val categoryScrollState = rememberScrollState() + val emojiGridItems = remember(categories) { + var globalIndex = 0 + categories.flatMapIndexed { categoryIndex, category -> + category.emojis.map { emoji -> + EmojiGridItem( + index = globalIndex++, + categoryKey = category.key, + categoryIndex = categoryIndex, + emoji = emoji + ) + } + } + } + val categoryFirstIndexes = remember(categories) { + var itemIndex = 0 + categories.map { category -> + val firstIndex = itemIndex + itemIndex += category.emojis.size + firstIndex + } + } + val selectedCategoryIndex by remember(emojiGridItems, gridState) { + derivedStateOf { + emojiGridItems + .getOrNull(gridState.firstVisibleItemIndex) + ?.categoryIndex + ?.coerceIn(0, categories.lastIndex.coerceAtLeast(0)) + ?: 0 + } + } + + Column( + modifier = Modifier + .fillMaxWidth() + .height(height) + .background(TelegramSurface) + ) { + Row( + modifier = Modifier + .fillMaxWidth() + .horizontalScroll(categoryScrollState) + .padding(horizontal = 8.dp, vertical = 6.dp), + horizontalArrangement = Arrangement.spacedBy(4.dp) + ) { + categories.forEachIndexed { index, category -> + EmojiCategoryChip( + category = category, + selected = index == selectedCategoryIndex, + onClick = { + coroutineScope.launch { + gridState.animateScrollToItem(categoryFirstIndexes.getOrElse(index) { 0 }) + } + } + ) + } + } + + HorizontalDivider(color = Color(0xFFE6EEF6)) + + LazyVerticalGrid( + columns = GridCells.Adaptive(minSize = EmojiGridMinCellWidth), + state = gridState, + modifier = Modifier + .fillMaxWidth() + .weight(1f), + contentPadding = PaddingValues(start = 6.dp, top = 8.dp, end = 6.dp, bottom = 8.dp), + horizontalArrangement = Arrangement.SpaceEvenly, + verticalArrangement = Arrangement.spacedBy(2.dp) + ) { + items( + items = emojiGridItems, + key = { item -> "${item.index}-${item.categoryKey}-${item.emoji}" } + ) { item -> + EmojiPickerButton( + emoji = item.emoji, + onClick = { onEmojiSelected(item.emoji) } + ) + } + } + } +} + +@Composable +private fun EmojiCategoryChip( + category: EmojiCategory, + selected: Boolean, + onClick: () -> Unit +) { + Surface( + color = if (selected) Color(0xFFE7F1FF) else Color(0xFFF4F7FA), + shape = RoundedCornerShape(16.dp), + modifier = Modifier + .size(34.dp) + .clickable(onClick = onClick) + ) { + Box(contentAlignment = Alignment.Center) { + Text( + text = category.icon, + fontSize = 18.sp, + color = if (selected) TelegramBlue else TelegramInk + ) + } + } +} + +@Composable +private fun EmojiPickerButton( + emoji: String, + onClick: () -> Unit +) { + Surface( + color = Color.Transparent, + shape = RoundedCornerShape(8.dp), + modifier = Modifier + .fillMaxWidth() + .height(EmojiGridCellHeight) + .clickable(onClick = onClick) + ) { + Box( + modifier = Modifier.fillMaxSize(), + contentAlignment = Alignment.Center + ) { + Text(text = emoji, fontSize = 22.sp) + } + } +} + +@Composable +private fun ReplyPreviewCard( + replyTo: com.seven.ikar.kotlin.core.model.MessageReplyDto, + modifier: Modifier = Modifier, + onClick: () -> Unit = {} +) { + Surface( + color = Color(0x11000000), + shape = RoundedCornerShape(12.dp), + shadowElevation = 0.dp, + modifier = modifier + .fillMaxWidth() + .clickable(onClick = onClick) + ) { + Column( + modifier = Modifier.padding(horizontal = 10.dp, vertical = 8.dp), + verticalArrangement = Arrangement.spacedBy(2.dp) + ) { + Text( + text = replyTo.senderDisplayName, + style = MaterialTheme.typography.labelMedium, + color = TelegramBlue, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + Text( + text = replyTo.previewText, + style = MaterialTheme.typography.bodySmall, + color = TelegramInkMuted, + maxLines = 2, + overflow = TextOverflow.Ellipsis + ) + } + } +} + +@Composable +private fun ReactionRow( + reactions: List, + onReactionClick: (String) -> Unit +) { + FlowRow( + horizontalArrangement = Arrangement.spacedBy(6.dp), + verticalArrangement = Arrangement.spacedBy(6.dp) + ) { + reactions.forEach { reaction -> + Surface( + color = if (reaction.isMine) Color(0xFFE7F1FF) else Color(0xFFF4F7FA), + shape = RoundedCornerShape(14.dp), + shadowElevation = 0.dp, + modifier = Modifier.clickable { onReactionClick(reaction.emoji) } + ) { + Text( + text = "${reaction.emoji} ${reaction.count}", + modifier = Modifier.padding(horizontal = 10.dp, vertical = 6.dp), + style = MaterialTheme.typography.labelMedium, + color = if (reaction.isMine) TelegramBlue else TelegramInk + ) + } + } + } +} + +@Composable +private fun MessageText( + text: String, + modifier: Modifier = Modifier, + textSizeSp: Int, + onTap: () -> Unit, + onLongPress: () -> Unit +) { + val context = LocalContext.current + var revealedSpoilers by remember(text) { mutableStateOf>(emptySet()) } + val annotatedText = remember(text, revealedSpoilers) { + buildMessageAnnotatedText(text, revealedSpoilers) + } + var layoutResult by remember(annotatedText) { mutableStateOf(null) } + + Text( + text = annotatedText, + modifier = modifier.pointerInput(annotatedText) { + detectTapGestures( + onTap = { position -> + val offset = layoutResult?.getOffsetForPosition(position) ?: return@detectTapGestures + val urlAnnotation = annotatedText + .getStringAnnotations(tag = MessageUrlAnnotationTag, start = offset, end = offset) + .firstOrNull() + val spoilerAnnotation = annotatedText + .getStringAnnotations(tag = MessageSpoilerAnnotationTag, start = offset, end = offset) + .firstOrNull() + when { + urlAnnotation != null -> openExternalUrl(context, urlAnnotation.item) + spoilerAnnotation != null -> { + val key = spoilerAnnotation.item + revealedSpoilers = if (revealedSpoilers.contains(key)) { + revealedSpoilers - key + } else { + revealedSpoilers + key + } + } + else -> onTap() + } + }, + onLongPress = { onLongPress() } + ) + }, + style = MaterialTheme.typography.bodyLarge.copy(color = TelegramInk, fontSize = textSizeSp.sp), + onTextLayout = { layoutResult = it } + ) +} + +@Composable +private fun AttachmentAlbumGrid( + attachments: List, + attachmentUrlResolver: (AttachmentDto) -> String, + accessToken: String?, + onAttachmentClick: (AttachmentDto) -> Unit, + onLongPress: () -> Unit +) { + ImageCollageLayout(itemCount = attachments.size) { index, modifier, overlayText -> + val attachment = attachments[index] + ImageCollageTile( + imageUrl = attachmentUrlResolver(attachment), + accessToken = accessToken, + contentDescription = attachment.fileName, + modifier = modifier.combinedClickable( + onClick = { onAttachmentClick(attachment) }, + onLongClick = onLongPress + ), + overlayText = overlayText + ) + } +} + +@Composable +private fun ImageCollageLayout( + itemCount: Int, + minHeight: androidx.compose.ui.unit.Dp = 168.dp, + maxHeight: androidx.compose.ui.unit.Dp = 224.dp, + tileContent: @Composable (index: Int, modifier: Modifier, overlayText: String?) -> Unit +) { + if (itemCount <= 0) { + return + } + + BoxWithConstraints( + modifier = Modifier + .fillMaxWidth() + .clip(RoundedCornerShape(16.dp)) + ) { + val gap = 2.dp + val collageHeight = when (itemCount) { + 1 -> minHeight + 2 -> (maxWidth * 0.62f).coerceIn(minHeight, maxHeight) + else -> maxHeight + } + val visibleCount = itemCount.coerceAtMost(4) + + when (visibleCount) { + 1 -> { + tileContent(0, Modifier.fillMaxWidth().height(collageHeight), null) + } + + 2 -> { + Row( + modifier = Modifier + .fillMaxWidth() + .height(collageHeight), + horizontalArrangement = Arrangement.spacedBy(gap) + ) { + repeat(2) { index -> + tileContent(index, Modifier.weight(1f).fillMaxHeight(), null) + } + } + } + + 3 -> { + Row( + modifier = Modifier + .fillMaxWidth() + .height(collageHeight), + horizontalArrangement = Arrangement.spacedBy(gap) + ) { + tileContent(0, Modifier.weight(1.35f).fillMaxHeight(), null) + Column( + modifier = Modifier.weight(1f).fillMaxHeight(), + verticalArrangement = Arrangement.spacedBy(gap) + ) { + tileContent(1, Modifier.fillMaxWidth().weight(1f), null) + tileContent(2, Modifier.fillMaxWidth().weight(1f), null) + } + } + } + + else -> { + Column( + modifier = Modifier + .fillMaxWidth() + .height(collageHeight), + verticalArrangement = Arrangement.spacedBy(gap) + ) { + repeat(2) { row -> + Row( + modifier = Modifier.fillMaxWidth().weight(1f), + horizontalArrangement = Arrangement.spacedBy(gap) + ) { + repeat(2) { column -> + val index = row * 2 + column + val overlayText = if (index == 3 && itemCount > 4) "+${itemCount - 4}" else null + tileContent(index, Modifier.weight(1f).fillMaxHeight(), overlayText) + } + } + } + } + } + } + } +} + +@Composable +private fun ImageCollageTile( + imageUrl: String?, + accessToken: String?, + contentDescription: String, + modifier: Modifier, + overlayText: String? = null +) { + Box( + modifier = modifier + .background(Color(0xFFF7FAFD)) + .clip(RoundedCornerShape(3.dp)) + ) { + AuthenticatedAsyncImage( + imageUrl = imageUrl, + accessToken = accessToken, + contentDescription = contentDescription, + modifier = Modifier.fillMaxSize(), + contentScale = ContentScale.Crop + ) + if (overlayText != null) { + Box( + modifier = Modifier + .fillMaxSize() + .background(Color.Black.copy(alpha = 0.42f)), + contentAlignment = Alignment.Center + ) { + Text( + text = overlayText, + style = MaterialTheme.typography.headlineLarge, + color = Color.White + ) + } + } + } +} + +@OptIn(ExperimentalFoundationApi::class) +@Composable +private fun InlineMessageImage( + imageUrl: String, + onClick: () -> Unit, + onLongPress: () -> Unit +) { + AuthenticatedAsyncImage( + imageUrl = imageUrl, + accessToken = "", + contentDescription = "", + modifier = Modifier + .fillMaxWidth() + .heightIn(min = 120.dp, max = 420.dp) + .clip(RoundedCornerShape(16.dp)) + .combinedClickable(onClick = onClick, onLongClick = onLongPress) + .background(Color(0xFFF7FAFD)), + contentScale = ContentScale.Fit + ) +} + +@Composable +private fun AttachmentCard( + attachment: AttachmentDto, + attachmentUrl: String, + accessToken: String?, + playbackState: VoiceAttachmentPlaybackUiState?, + onClick: () -> Unit, + onLongPress: () -> Unit +) { + when { + attachment.isImageAttachment() -> { + AuthenticatedAsyncImage( + imageUrl = attachmentUrl, + accessToken = accessToken, + contentDescription = attachment.fileName, + modifier = Modifier + .fillMaxWidth() + .heightIn(min = 120.dp, max = 420.dp) + .clip(RoundedCornerShape(16.dp)) + .combinedClickable(onClick = onClick, onLongClick = onLongPress) + .background(Color(0xFFF7FAFD)), + contentScale = ContentScale.Fit + ) + } + + attachment.kind == AttachmentKind.VoiceNote -> { + Surface( + color = Color(0xFFF3F8FD), + shape = RoundedCornerShape(16.dp), + shadowElevation = 0.dp, + modifier = Modifier.combinedClickable(onClick = onClick, onLongClick = onLongPress) + ) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 12.dp, vertical = 12.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(12.dp) + ) { + Surface(color = TelegramBlue, shape = CircleShape) { + Box(modifier = Modifier.padding(10.dp), contentAlignment = Alignment.Center) { + Icon( + imageVector = if (playbackState?.isPlaying == true) Icons.Outlined.Stop else Icons.Outlined.PlayArrow, + contentDescription = "Голосовое", + tint = Color.White + ) + } + } + val durationMs = when { + playbackState?.durationMs?.let { it > 0L } == true -> playbackState.durationMs + else -> 0L + } + val progress = when { + durationMs > 0L -> (playbackState?.positionMs ?: 0L).toFloat() / durationMs.toFloat() + else -> 0f + }.coerceIn(0f, 1f) + + Column( + modifier = Modifier.weight(1f), + verticalArrangement = Arrangement.spacedBy(6.dp) + ) { + LinearProgressIndicator( + progress = { progress }, + modifier = Modifier + .fillMaxWidth() + .height(4.dp) + .clip(CircleShape), + color = TelegramBlue, + trackColor = Color(0xFFD6E5F5) + ) + Text( + text = buildVoiceNoteSecondaryText(attachment, playbackState), + style = MaterialTheme.typography.bodySmall, + color = TelegramInkMuted + ) + } + } + } + } + + else -> { + Surface( + color = Color(0xFFF7FAFD), + shape = RoundedCornerShape(16.dp), + shadowElevation = 0.dp, + modifier = Modifier.combinedClickable(onClick = onClick, onLongClick = onLongPress) + ) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 12.dp, vertical = 10.dp), + verticalArrangement = Arrangement.spacedBy(4.dp) + ) { + Text(text = attachment.fileName, style = MaterialTheme.typography.titleMedium, color = TelegramInk) + Text( + text = "${attachment.contentType} • ${formatFileSize(attachment.fileSizeBytes)}", + style = MaterialTheme.typography.bodySmall, + color = TelegramInkMuted + ) + } + } + } + } +} + +@Composable +private fun MessageMeta( + sentAt: String, + deliveryState: MessageDeliveryState, + isOutgoing: Boolean, + viewCount: Int?, + localStatus: LocalMessageStatus?, + modifier: Modifier = Modifier +) { + Row( + modifier = modifier, + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = formatMessageTime(sentAt), + style = MaterialTheme.typography.labelSmall, + color = if (isOutgoing) Color(0xFF6F8966) else TelegramInkMuted + ) + + if (viewCount != null) { + Spacer(modifier = Modifier.width(6.dp)) + Icon( + imageVector = Icons.Outlined.Visibility, + contentDescription = null, + tint = if (isOutgoing) Color(0xFF6F8966) else TelegramInkMuted, + modifier = Modifier.size(13.dp) + ) + Spacer(modifier = Modifier.width(2.dp)) + Text( + text = formatCompactCount(viewCount), + style = MaterialTheme.typography.labelSmall, + color = if (isOutgoing) Color(0xFF6F8966) else TelegramInkMuted + ) + } + + if (isOutgoing) { + Spacer(modifier = Modifier.width(4.dp)) + Text( + text = when (localStatus) { + LocalMessageStatus.Sending -> "..." + LocalMessageStatus.Failed -> "!" + null -> when (deliveryState) { + MessageDeliveryState.Read -> "\u2713\u2713" + MessageDeliveryState.Delivered -> "\u2713" + MessageDeliveryState.Sent -> "\u2713" + } + }, + style = MaterialTheme.typography.labelSmall.copy(fontWeight = FontWeight.SemiBold), + color = when (localStatus) { + LocalMessageStatus.Failed -> Color(0xFFE53935) + LocalMessageStatus.Sending -> Color(0xFF6F8966) + null -> if (deliveryState == MessageDeliveryState.Read) TelegramBlue else Color(0xFF6F8966) + } + ) + } + } +} + +private const val MessageUrlAnnotationTag = "message-url" +private const val MessageSpoilerAnnotationTag = "message-spoiler" + +private data class MessageUrlRange( + val start: Int, + val end: Int, + val url: String +) + +private data class MessageDisplayContent( + val text: String, + val imageUrls: List +) + +private val ImageLabelRegex = Regex("""(^|[\s:;,.!?()\[\]{}-])изображени[еяю]?([\s:;,.!?()\[\]{}-]|$)""", RegexOption.IGNORE_CASE) +private val ImageFileExtensions = setOf("jpg", "jpeg", "png", "webp", "gif", "bmp", "heic", "heif") + +private fun buildMessageDisplayContent(text: String): MessageDisplayContent { + if (text.isBlank()) { + return MessageDisplayContent(text = text, imageUrls = emptyList()) + } + + val imageUrls = mutableListOf() + val visibleLines = mutableListOf() + var pendingImageLabel = false + + text.lines().forEach { line -> + val hasImageLabel = ImageLabelRegex.containsMatchIn(line) + val ranges = extractMessageUrlRanges(line) + if (ranges.isEmpty()) { + val cleanedLine = if (hasImageLabel) cleanInlineImageLine(line, emptyList()) else line + if (hasImageLabel && cleanedLine.isBlank()) { + pendingImageLabel = true + return@forEach + } + + visibleLines += line + pendingImageLabel = false + return@forEach + } + + val imageRanges = ranges + .filter { range -> isInlineImageUrl(line, range, pendingImageLabel || hasImageLabel) } + if (imageRanges.isEmpty()) { + visibleLines += line + pendingImageLabel = false + return@forEach + } + + imageUrls += imageRanges.map { it.url } + val cleanedLine = cleanInlineImageLine(line, imageRanges) + if (cleanedLine.isNotBlank()) { + visibleLines += cleanedLine + } + pendingImageLabel = false + } + + return MessageDisplayContent( + text = visibleLines.joinToString("\n").trim(), + imageUrls = imageUrls.distinct() + ) +} + +private fun isInlineImageUrl(line: String, range: MessageUrlRange, forcedByLabel: Boolean): Boolean = + forcedByLabel || isImageUrl(range.url) || ImageLabelRegex.containsMatchIn(line) + +private fun cleanInlineImageLine(line: String, imageRanges: List): String { + var result = line + imageRanges + .sortedByDescending { it.start } + .forEach { range -> result = result.removeRange(range.start, range.end) } + + return ImageLabelRegex + .replace(result, " ") + .replace(Regex("""[ \t]{2,}"""), " ") + .trim() + .trim(':', ';', ',', '.', '-', '–', '—', '•') + .trim() +} + +private fun isImageUrl(url: String): Boolean { + val uri = runCatching { Uri.parse(url) }.getOrNull() ?: return false + val pathExtension = uri.path + ?.substringAfterLast('.', missingDelimiterValue = "") + ?.lowercase(Locale.US) + .orEmpty() + if (pathExtension in ImageFileExtensions) { + return true + } + + val query = uri.query.orEmpty().lowercase(Locale.US) + return ImageFileExtensions.any { extension -> + query.contains("format=$extension") || + query.contains("fm=$extension") || + query.contains("ext=$extension") || + query.contains("image/$extension") + } +} + +private fun buildMessageAnnotatedText(text: String, revealedSpoilers: Set = emptySet()): AnnotatedString { + val builder = AnnotatedString.Builder(text) + extractMessageUrlRanges(text).forEach { range -> + builder.addStyle( + style = SpanStyle( + color = TelegramBlue, + textDecoration = TextDecoration.Underline + ), + start = range.start, + end = range.end + ) + builder.addStringAnnotation( + tag = MessageUrlAnnotationTag, + annotation = range.url, + start = range.start, + end = range.end + ) + } + MentionHashtagRegex.findAll(text).forEach { match -> + builder.addStyle( + style = SpanStyle(color = TelegramBlue, fontWeight = FontWeight.SemiBold), + start = match.range.first, + end = match.range.last + 1 + ) + } + SpoilerRegex.findAll(text).forEach { match -> + val key = match.range.first.toString() + val isRevealed = revealedSpoilers.contains(key) + builder.addStyle( + style = SpanStyle( + color = if (isRevealed) TelegramInk else Color.Transparent, + background = if (isRevealed) Color(0xFFE4EEF6) else Color(0xFF9AA7B2) + ), + start = match.range.first, + end = match.range.last + 1 + ) + builder.addStringAnnotation( + tag = MessageSpoilerAnnotationTag, + annotation = key, + start = match.range.first, + end = match.range.last + 1 + ) + } + return builder.toAnnotatedString() +} + +private val MentionHashtagRegex = Regex("""(? { + val matcher = Patterns.WEB_URL.matcher(text) + val ranges = mutableListOf() + while (matcher.find()) { + val rawMatch = matcher.group().orEmpty() + val trimmedMatch = rawMatch.trimEnd('.', ',', '!', '?', ';', ':', ')', ']', '}', '>') + if (trimmedMatch.isBlank()) { + continue + } + + val start = matcher.start() + val end = start + trimmedMatch.length + ranges += MessageUrlRange( + start = start, + end = end, + url = normalizeExternalUrl(trimmedMatch) + ) + } + return ranges +} + +private fun normalizeExternalUrl(rawUrl: String): String = + if (rawUrl.startsWith("http://", ignoreCase = true) || rawUrl.startsWith("https://", ignoreCase = true)) { + rawUrl + } else { + "https://$rawUrl" + } + +private fun openExternalUrl(context: Context, url: String) { + val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url)).apply { + addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + } + + try { + context.startActivity(intent) + } catch (_: ActivityNotFoundException) { + // Ignore when there is no browser available on the device. + } +} + +private data class MessageActionItem( + val label: String, + val icon: ImageVector, + val isDestructive: Boolean = false, + val onClick: () -> Unit +) + +@Composable +private fun MessageActionDialog( + title: String, + onDismiss: () -> Unit, + actions: List +) { + AlertDialog( + onDismissRequest = onDismiss, + confirmButton = {}, + text = { + Column(verticalArrangement = Arrangement.spacedBy(0.dp)) { + actions.forEachIndexed { index, action -> + Row( + modifier = Modifier + .fillMaxWidth() + .clickable(onClick = action.onClick) + .padding(horizontal = 4.dp, vertical = 6.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(14.dp) + ) { + Icon( + imageVector = action.icon, + contentDescription = null, + tint = if (action.isDestructive) MaterialTheme.colorScheme.error else TelegramInkMuted + ) + Text( + text = action.label, + modifier = Modifier.weight(1f), + style = MaterialTheme.typography.titleMedium, + color = if (action.isDestructive) MaterialTheme.colorScheme.error else TelegramInk + ) + } + if (index != actions.lastIndex) { + HorizontalDivider() + } + } + } + } + ) +} + +@Composable +private fun ActionDialog( + title: String, + onDismiss: () -> Unit, + actions: List Unit>> +) { + AlertDialog( + onDismissRequest = onDismiss, + title = { Text(title) }, + text = { + Column { + actions.forEachIndexed { index, (label, onClick) -> + TextButton( + modifier = Modifier.fillMaxWidth(), + onClick = onClick + ) { + Text(label, modifier = Modifier.fillMaxWidth()) + } + if (index != actions.lastIndex) { + HorizontalDivider() + } + } + } + }, + confirmButton = {}, + dismissButton = { + TextButton(onClick = onDismiss) { + Text("Отмена") + } + } + ) +} + +@Composable +private fun DeleteSelectedMessagesDialog( + selectedMessagesCount: Int, + isDeletingSelectedMessages: Boolean, + onDismiss: () -> Unit, + onConfirmDelete: () -> Unit +) { + AlertDialog( + onDismissRequest = { + if (!isDeletingSelectedMessages) { + onDismiss() + } + }, + title = { Text(deleteSelectedMessagesDialogTitle(selectedMessagesCount)) }, + text = { Text(deleteSelectedMessagesDialogMessage(selectedMessagesCount), color = TelegramInkMuted) }, + confirmButton = { + TextButton( + enabled = !isDeletingSelectedMessages, + onClick = onConfirmDelete + ) { + Text("Удалить", color = MaterialTheme.colorScheme.error) + } + }, + dismissButton = { + TextButton( + enabled = !isDeletingSelectedMessages, + onClick = onDismiss + ) { + Text("Отмена") + } + } + ) +} + +@Composable +private fun ImagePreviewDialog( + attachment: AttachmentDto, + accessToken: String?, + imageUrl: String, + onDismiss: () -> Unit +) { + AlertDialog( + onDismissRequest = onDismiss, + confirmButton = {}, + dismissButton = { + TextButton(onClick = onDismiss) { + Text("Закрыть") + } + }, + text = { + AuthenticatedAsyncImage( + imageUrl = imageUrl, + accessToken = accessToken, + contentDescription = attachment.fileName, + modifier = Modifier + .fillMaxWidth() + .height(360.dp) + .clip(RoundedCornerShape(16.dp)), + contentScale = ContentScale.Fit + ) + } + ) +} + +@Composable +private fun ChatImagePreviewDialog( + entry: ChatImagePreviewEntry, + accessToken: String?, + imageUrl: String, + enableEdgeTapNavigation: Boolean, + canNavigatePrevious: Boolean, + canNavigateNext: Boolean, + canDelete: Boolean, + isProtectedContent: Boolean, + onDismiss: () -> Unit, + onNavigatePrevious: () -> Unit, + onNavigateNext: () -> Unit, + onSaveToGallery: () -> Unit, + onReply: () -> Unit, + onShare: () -> Unit, + onDelete: () -> Unit +) { + var showMenu by remember(entry.attachment.id) { mutableStateOf(false) } + var scale by remember(entry.attachment.id) { mutableStateOf(1f) } + var translation by remember(entry.attachment.id) { mutableStateOf(Offset.Zero) } + val density = LocalDensity.current + + Dialog( + onDismissRequest = onDismiss, + properties = DialogProperties(usePlatformDefaultWidth = false) + ) { + Box( + modifier = Modifier + .fillMaxSize() + .background(Color.Black) + ) { + Column(modifier = Modifier.fillMaxSize()) { + Spacer(modifier = Modifier.windowInsetsTopHeight(WindowInsets.statusBars)) + Row( + modifier = Modifier + .fillMaxWidth() + .background(Color.Black.copy(alpha = 0.72f)) + .padding(horizontal = 12.dp, vertical = 10.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(10.dp) + ) { + ImagePreviewHeaderButton( + icon = Icons.AutoMirrored.Outlined.ArrowBack, + contentDescription = "Назад", + onClick = onDismiss + ) + + Column( + modifier = Modifier.weight(1f), + verticalArrangement = Arrangement.spacedBy(2.dp) + ) { + Text( + text = entry.message.sender.displayName, + style = MaterialTheme.typography.titleMedium, + color = Color.White, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + Text( + text = formatImagePreviewTimestamp(entry.message.sentAt), + style = MaterialTheme.typography.bodySmall, + color = Color.White.copy(alpha = 0.8f), + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + } + + Box { + ImagePreviewHeaderButton( + icon = Icons.Outlined.Menu, + contentDescription = "Меню", + onClick = { showMenu = true } + ) + DropdownMenu( + expanded = showMenu, + onDismissRequest = { showMenu = false } + ) { + if (!isProtectedContent) { + DropdownMenuItem( + text = { Text("Сохранить в галерею") }, + onClick = { + showMenu = false + onSaveToGallery() + } + ) + } + DropdownMenuItem( + text = { Text("Ответить") }, + onClick = { + showMenu = false + onReply() + } + ) + if (!isProtectedContent) { + DropdownMenuItem( + text = { Text("Поделиться") }, + onClick = { + showMenu = false + onShare() + } + ) + } + if (canDelete) { + DropdownMenuItem( + text = { Text("Удалить", color = TelegramDanger) }, + onClick = { + showMenu = false + onDelete() + } + ) + } + } + } + } + + BoxWithConstraints( + modifier = Modifier + .weight(1f) + .fillMaxWidth() + ) { + val containerWidthPx = with(density) { maxWidth.toPx() } + val containerHeightPx = with(density) { maxHeight.toPx() } + + Box( + modifier = Modifier.fillMaxSize(), + contentAlignment = Alignment.Center + ) { + Box( + modifier = Modifier + .fillMaxSize() + .pointerInput(entry.attachment.id) { + detectTransformGestures { _, pan, zoom, _ -> + val nextScale = (scale * zoom).coerceIn(1f, 4f) + val maxTranslationX = ((nextScale - 1f) * containerWidthPx / 2f).coerceAtLeast(0f) + val maxTranslationY = ((nextScale - 1f) * containerHeightPx / 2f).coerceAtLeast(0f) + translation = if (nextScale == 1f) { + Offset.Zero + } else { + Offset( + x = (translation.x + pan.x).coerceIn(-maxTranslationX, maxTranslationX), + y = (translation.y + pan.y).coerceIn(-maxTranslationY, maxTranslationY) + ) + } + scale = nextScale + } + }, + contentAlignment = Alignment.Center + ) { + AuthenticatedAsyncImage( + imageUrl = imageUrl, + accessToken = accessToken, + contentDescription = entry.attachment.fileName, + modifier = Modifier + .fillMaxSize() + .graphicsLayer { + scaleX = scale + scaleY = scale + translationX = translation.x + translationY = translation.y + }, + contentScale = ContentScale.Fit + ) + } + + if (enableEdgeTapNavigation && canNavigatePrevious) { + ImagePreviewEdgeTapZone( + modifier = Modifier.align(Alignment.CenterStart), + onTap = onNavigatePrevious + ) + } + + if (enableEdgeTapNavigation && canNavigateNext) { + ImagePreviewEdgeTapZone( + modifier = Modifier.align(Alignment.CenterEnd), + onTap = onNavigateNext + ) + } + } + } + } + } + } +} + +@Composable +private fun ImagePreviewHeaderButton( + icon: ImageVector, + contentDescription: String, + onClick: () -> Unit +) { + Surface( + color = Color.White.copy(alpha = 0.14f), + shape = CircleShape, + modifier = Modifier + .size(40.dp) + .clickable(onClick = onClick) + ) { + Box(contentAlignment = Alignment.Center) { + Icon( + imageVector = icon, + contentDescription = contentDescription, + tint = Color.White + ) + } + } +} + +@Composable +private fun ImagePreviewEdgeTapZone( + modifier: Modifier = Modifier, + onTap: () -> Unit +) { + Box( + modifier = modifier + .fillMaxHeight() + .width(72.dp) + .pointerInput(onTap) { + detectTapGestures(onTap = { onTap() }) + } + ) +} + +private fun buildMessageMenuItems( + message: MessageDto, + currentUserId: String?, + onCopy: () -> Unit, + onForward: () -> Unit, + onReply: () -> Unit, + onReact: () -> Unit, + onPin: () -> Unit, + onEdit: () -> Unit, + onDelete: () -> Unit +): List { + val actions = mutableListOf() + if (!message.isDeleted() && !message.hasProtectedContent && message.text.isNotBlank()) { + actions.add( + MessageActionItem( + label = "Копировать", + icon = Icons.Outlined.ContentCopy, + onClick = onCopy + ) + ) + } + + if (!message.isDeleted() && (message.attachments.isNotEmpty() || message.text.isNotBlank())) { + if (!message.hasProtectedContent) { + actions.add( + MessageActionItem( + label = "Переслать", + icon = Icons.AutoMirrored.Outlined.Send, + onClick = onForward + ) + ) + } + actions.add( + MessageActionItem( + label = "Ответить", + icon = Icons.AutoMirrored.Outlined.ArrowBack, + onClick = onReply + ) + ) + actions.add( + MessageActionItem( + label = "Реакция", + icon = Icons.Outlined.Mood, + onClick = onReact + ) + ) + } + + if (!message.isDeleted() && (message.attachments.isNotEmpty() || message.text.isNotBlank())) { + actions.add( + MessageActionItem( + label = if (message.pinnedAt == null) "Закрепить" else "Открепить", + icon = Icons.Outlined.PushPin, + onClick = onPin + ) + ) + } + + if (message.canManage(currentUserId)) { + actions.add( + MessageActionItem( + label = "Изменить", + icon = Icons.Outlined.Edit, + onClick = onEdit + ) + ) + actions.add( + MessageActionItem( + label = "Удалить", + icon = Icons.Outlined.Delete, + isDestructive = true, + onClick = onDelete + ) + ) + } + + if (!message.canManage(currentUserId) && message.canDelete(currentUserId)) { + actions.add(buildDeleteMessageAction(onDelete)) + } + + return actions +} + +private fun buildDeleteMessageAction(onDelete: () -> Unit): MessageActionItem = + MessageActionItem( + label = "\u0423\u0434\u0430\u043b\u0438\u0442\u044c", + icon = Icons.Outlined.Delete, + isDestructive = true, + onClick = onDelete + ) + +private fun buildMessageActionItems( + message: MessageDto, + currentUserId: String?, + onCopy: () -> Unit, + onForward: () -> Unit, + onReply: () -> Unit, + onReact: () -> Unit, + onEdit: () -> Unit, + onDelete: () -> Unit +): List Unit>> { + val actions = mutableListOf Unit>>() + if (!message.isDeleted() && !message.hasProtectedContent && message.text.isNotBlank()) { + actions.add("Копировать" to onCopy) + } + + if (!message.isDeleted() && !message.hasProtectedContent && (message.attachments.isNotEmpty() || message.text.isNotBlank())) { + actions.add("Переслать" to onForward) + actions.add("Ответить" to onReply) + actions.add("Реакция" to onReact) + } + + if (message.canManage(currentUserId)) { + actions.add("Изменить" to onEdit) + actions.add("Удалить" to onDelete) + } + + return actions +} + +private fun messageSelectionCountLabel(selectedMessagesCount: Int): String = when { + selectedMessagesCount % 10 == 1 && selectedMessagesCount % 100 != 11 -> "Выбрано $selectedMessagesCount сообщение" + selectedMessagesCount % 10 in 2..4 && selectedMessagesCount % 100 !in 12..14 -> "Выбрано $selectedMessagesCount сообщения" + else -> "Выбрано $selectedMessagesCount сообщений" +} + +private fun pinnedMessagePreview(message: MessageDto): String = when { + message.text.isNotBlank() -> message.text + message.attachments.size == 1 -> message.attachments.first().fileName + message.attachments.isNotEmpty() -> "${message.attachments.size} files" + else -> "Message" +} + +private fun deleteSelectedMessagesDialogTitle(selectedMessagesCount: Int): String = + if (selectedMessagesCount == 1) "Удалить выбранное сообщение?" else "Удалить выбранные сообщения?" + +private fun deleteSelectedMessagesDialogMessage(selectedMessagesCount: Int): String = + if (selectedMessagesCount == 1) { + "Выбранное сообщение исчезнет из чата после подтверждения." + } else { + "Выбранные сообщения исчезнут из чата после подтверждения." + } + +private fun buildChatRows(messages: List): List { + if (messages.isEmpty()) { + return emptyList() + } + + val chronologicalRows = buildList { + var previousDate: LocalDate? = null + messages.forEach { message -> + val currentDate = parseMessageDate(message.sentAt)?.toLocalDate() + if (currentDate != null && currentDate != previousDate) { + add(ChatRow.DateSeparator("date-$currentDate", formatDateSeparator(currentDate))) + previousDate = currentDate + } + add(ChatRow.Message(message)) + } + } + + return chronologicalRows.asReversed() +} + +private fun chatRowKey(row: ChatRow): String = when (row) { + is ChatRow.DateSeparator -> row.id + is ChatRow.Message -> row.item.id +} + +private fun findLastReadRowIndexBeforeFirstUnread(rows: List, firstUnreadRowIndex: Int): Int? { + if (firstUnreadRowIndex >= rows.lastIndex) { + return null + } + + return ((firstUnreadRowIndex + 1)..rows.lastIndex) + .firstOrNull { index -> rows[index] is ChatRow.Message } +} + +private fun formatMessageTime(value: String): String = + parseMessageDate(value)?.format(ChatTimeFormatter) ?: value + +private fun formatCompactCount(value: Int): String = when { + value >= 1_000_000 -> String.format(Locale.US, "%.1fM", value / 1_000_000f).trimTrailingZero() + value >= 1_000 -> String.format(Locale.US, "%.1fK", value / 1_000f).trimTrailingZero() + else -> value.toString() +} + +private fun formatImagePreviewTimestamp(value: String): String = + parseMessageDate(value)?.let { timestamp -> + val dateFormatter = if (timestamp.year == LocalDate.now().year) ChatDayFormatter else ChatDayYearFormatter + "${timestamp.format(dateFormatter)} • ${timestamp.format(ChatTimeFormatter)}" + } ?: value + +private fun formatDateSeparator(date: LocalDate): String { + val today = LocalDate.now() + return when (date) { + today -> "Сегодня" + today.minusDays(1) -> "Вчера" + else -> if (date.year == today.year) date.format(ChatDayFormatter) else date.format(ChatDayYearFormatter) + } +} + +private fun parseMessageDate(value: String): OffsetDateTime? = + runCatching { + OffsetDateTime.parse(value) + .atZoneSameInstant(ZoneId.systemDefault()) + .toOffsetDateTime() + }.getOrNull() + +private fun formatFileSize(sizeBytes: Long): String = when { + sizeBytes >= 1024L * 1024L -> String.format(Locale.US, "%.1f MB", sizeBytes / 1024f / 1024f) + sizeBytes >= 1024L -> "${sizeBytes / 1024L} KB" + else -> "$sizeBytes B" +} + +private fun formatChannelSubscribers(count: Int): String = + "$count ${russianPlural(count, "подписчик", "подписчика", "подписчиков")}" + +private fun russianPlural(count: Int, one: String, few: String, many: String): String { + val value = kotlin.math.abs(count) % 100 + val lastDigit = value % 10 + if (value in 11..14) { + return many + } + + return when (lastDigit) { + 1 -> one + in 2..4 -> few + else -> many + } +} + +private fun String.trimTrailingZero(): String = + replace(".0", "") + +private fun buildVoiceNoteSecondaryText( + attachment: AttachmentDto, + playbackState: VoiceAttachmentPlaybackUiState? +): String { + val durationText = playbackState?.durationMs?.takeIf { it > 0L }?.let(::formatDurationMs) + ?: formatFileSize(attachment.fileSizeBytes) + val positionText = playbackState?.positionMs?.takeIf { it > 0L }?.let(::formatDurationMs) + + return if (positionText != null) "$positionText / $durationText" else durationText +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/chat/ChatScrollStateStore.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/chat/ChatScrollStateStore.kt new file mode 100644 index 00000000..a3d4005c --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/chat/ChatScrollStateStore.kt @@ -0,0 +1,43 @@ +package com.seven.ikar.kotlin.feature.chat + +import android.content.Context +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.Json + +@Serializable +data class SavedChatScrollPosition( + val rowKey: String? = null, + val itemIndex: Int = 0, + val itemScrollOffset: Int = 0 +) + +class ChatScrollStateStore( + context: Context, + private val json: Json +) { + private val preferences = + context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_PRIVATE) + + fun read(chatId: String): SavedChatScrollPosition? { + val raw = preferences.getString(key(chatId), null) ?: return null + return runCatching { + json.decodeFromString(raw) + }.getOrNull() + } + + fun save(chatId: String, position: SavedChatScrollPosition) { + preferences.edit() + .putString(key(chatId), json.encodeToString(SavedChatScrollPosition.serializer(), position)) + .apply() + } + + fun clear(chatId: String) { + preferences.edit().remove(key(chatId)).apply() + } + + private fun key(chatId: String): String = "scroll_$chatId" + + private companion object { + private const val PREFERENCES_NAME = "ikar_kotlin_chat_scroll" + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/chat/ChatViewModel.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/chat/ChatViewModel.kt new file mode 100644 index 00000000..b6f23102 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/chat/ChatViewModel.kt @@ -0,0 +1,2006 @@ +package com.seven.ikar.kotlin.feature.chat + +import android.Manifest +import android.content.Context +import android.content.pm.PackageManager +import android.net.ConnectivityManager +import android.net.NetworkCapabilities +import android.net.Uri +import androidx.core.content.ContextCompat +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.seven.ikar.kotlin.app.AppContainer +import com.seven.ikar.kotlin.core.contacts.PhoneNumberNormalizer +import com.seven.ikar.kotlin.core.model.AttachmentDto +import com.seven.ikar.kotlin.core.model.AuthSessionDto +import com.seven.ikar.kotlin.core.model.BotCommandDto +import com.seven.ikar.kotlin.core.model.CallMediaType +import com.seven.ikar.kotlin.core.model.ChatDetailsDto +import com.seven.ikar.kotlin.core.model.ChatType +import com.seven.ikar.kotlin.core.model.MessageDeliveryState +import com.seven.ikar.kotlin.core.model.MessageDto +import com.seven.ikar.kotlin.core.model.MessageReplyDto +import com.seven.ikar.kotlin.core.model.TypingIndicatorDto +import com.seven.ikar.kotlin.core.model.UserSummaryDto +import com.seven.ikar.kotlin.core.network.ServerConfig +import com.seven.ikar.kotlin.core.network.UploadFileSource +import com.seven.ikar.kotlin.core.local.TransferQueueEntity +import com.seven.ikar.kotlin.feature.call.AudioCallSnapshot +import com.seven.ikar.kotlin.feature.call.AudioCallStage +import com.seven.ikar.kotlin.feature.transfer.TransferForegroundNotification +import com.seven.ikar.kotlin.ui.formatPresence +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import java.time.OffsetDateTime +import java.time.ZoneId +import java.time.ZoneOffset +import java.time.format.DateTimeFormatter +import java.util.Locale +import java.util.UUID + +data class PendingAttachmentUiState( + val fileName: String, + val contentType: String, + val fileSizeBytes: Long, + val imagePreviews: List = emptyList() +) + +data class PendingImageAttachmentUiState( + val fileName: String, + val localPath: String +) + +data class TransferQueueUiState( + val groupId: String, + val title: String, + val status: String, + val progressPercent: Int, + val errorMessage: String? +) + +data class VoiceAttachmentPlaybackUiState( + val isPlaying: Boolean = false, + val positionMs: Long = 0L, + val durationMs: Long = 0L +) + +data class BotQuickAction( + val title: String, + val commandText: String +) + +data class ChatSearchUiState( + val isActive: Boolean = false, + val query: String = "", + val resultMessageIds: List = emptyList(), + val activeResultIndex: Int = 0, + val isSearching: Boolean = false +) { + val activeMessageId: String? + get() = resultMessageIds.getOrNull(activeResultIndex) +} + +data class ChatScrollRequest( + val messageId: String?, + val requestId: Long = System.nanoTime() +) + +data class ChatUiState( + val session: AuthSessionDto? = null, + val title: String = "", + val subtitle: String = "", + val chatId: String = "", + val chatType: ChatType = ChatType.Direct, + val peer: UserSummaryDto? = null, + val botPeer: UserSummaryDto? = null, + val messages: List = emptyList(), + val pinnedMessages: List = emptyList(), + val hasMoreMessages: Boolean = false, + val isLoadingOlderMessages: Boolean = false, + val draftText: String = "", + val canSendMessages: Boolean = true, + val subscriberCount: Int = 0, + val adminCount: Int = 0, + val isSubscribed: Boolean = false, + val canSubscribe: Boolean = false, + val canManageChannel: Boolean = false, + val canPostAsChannel: Boolean = false, + val publicUsername: String? = null, + val linkedDiscussionChatId: String? = null, + val channelDescription: String? = null, + val isJoiningChannel: Boolean = false, + val isLeavingChannel: Boolean = false, + val isLoading: Boolean = false, + val errorMessage: String? = null, + val activeCall: AudioCallSnapshot? = null, + val pendingAttachment: PendingAttachmentUiState? = null, + val replyTo: MessageReplyDto? = null, + val editingMessageId: String? = null, + val editingMessageBanner: String = "", + val isRecordingVoiceNote: Boolean = false, + val voiceRecordingElapsedText: String = "00:00", + val attachmentPlayback: Map = emptyMap(), + val botCommands: List = emptyList(), + val previewImageAttachmentId: String? = null, + val firstUnreadMessageId: String? = null, + val selectedMessageIds: Set = emptySet(), + val isDeleteSelectionDialogVisible: Boolean = false, + val isDeletingSelectedMessages: Boolean = false, + val sendingLocalMessageIds: Set = emptySet(), + val failedLocalMessageIds: Set = emptySet(), + val activeTransfers: List = emptyList(), + val search: ChatSearchUiState = ChatSearchUiState(), + val scrollRequest: ChatScrollRequest? = null, + val isSendingMessage: Boolean = false, + val isDeletingChat: Boolean = false, + val isChatDeleted: Boolean = false +) { + val isMessageSelectionMode: Boolean + get() = selectedMessageIds.isNotEmpty() + + val selectedMessagesCount: Int + get() = selectedMessageIds.size +} + +private val DefaultCodexBridgeBotCommands = listOf( + BotCommandDto(command = "help", description = "Показать список команд моста"), + BotCommandDto(command = "status", description = "Показать состояние моста и выбранный thread"), + BotCommandDto(command = "threads", description = "Показать thread по именам"), + BotCommandDto(command = "use", description = "Выбрать thread из последнего списка"), + BotCommandDto(command = "newthread", description = "Создать новый thread"), + BotCommandDto(command = "turn", description = "Запустить turn в выбранном thread") +) + +private val BotThreadOptionRegex = Regex("""^(?\d+)\.\s+(?.+?)(?<selected>\s+\[выбран])?$""") +private val ChatTimestampFormatter: DateTimeFormatter = DateTimeFormatter.ofPattern("HH:mm", Locale("ru", "RU")) +private const val LocalMessageIdPrefix = "local-" + +class ChatViewModel( + private val container: AppContainer, + private val chatId: String +) : ViewModel() { + private val _uiState = MutableStateFlow(ChatUiState(chatId = chatId, session = container.sessionStore.read())) + val uiState: StateFlow<ChatUiState> = _uiState.asStateFlow() + + private val cachedAttachmentFiles = mutableMapOf<String, LocalAttachmentFile>() + private var contactNamesByNormalizedPhone: Map<String, String> = emptyMap() + private var editingMessage: MessageDto? = null + private var pendingAttachments: List<LocalAttachmentFile> = emptyList() + private var baseSubtitle: String = "" + private val typingUsers = mutableMapOf<String, UserSummaryDto>() + private val typingExpiryJobs = mutableMapOf<String, Job>() + private var typingStopJob: Job? = null + private var searchJob: Job? = null + private var typingStateSent = false + private var lastTypingSentAtMillis = 0L + + init { + attachRealtime() + attachCallState() + attachVoicePlaybackState() + attachVoiceRecordingState() + attachTransferQueueState() + loadCachedMessages() + refresh() + } + + fun updateDraft(value: String) { + _uiState.value = _uiState.value.copy(draftText = value) + notifyTyping(value.isNotBlank()) + } + + override fun onCleared() { + notifyTyping(false) + typingExpiryJobs.values.forEach(Job::cancel) + searchJob?.cancel() + super.onCleared() + } + + fun readSavedScrollPosition(): SavedChatScrollPosition? = + container.chatScrollStateStore.read(chatId) + + fun saveScrollPosition(position: SavedChatScrollPosition) { + container.chatScrollStateStore.save(chatId, position) + } + + fun toggleMessageSelection(message: MessageDto) { + if (!canSelectMessage(message)) { + return + } + + val currentState = _uiState.value + val nextSelectedMessageIds = if (currentState.selectedMessageIds.contains(message.id)) { + currentState.selectedMessageIds - message.id + } else { + currentState.selectedMessageIds + message.id + } + + _uiState.value = currentState.copy( + selectedMessageIds = nextSelectedMessageIds, + isDeleteSelectionDialogVisible = currentState.isDeleteSelectionDialogVisible && nextSelectedMessageIds.isNotEmpty(), + isDeletingSelectedMessages = currentState.isDeletingSelectedMessages && nextSelectedMessageIds.isNotEmpty() + ) + } + + fun handleMessageLongPress(message: MessageDto) { + if (!canSelectMessage(message)) { + return + } + + val currentState = _uiState.value + if (currentState.isMessageSelectionMode) { + toggleMessageSelection(message) + } else { + _uiState.value = currentState.copy(selectedMessageIds = setOf(message.id)) + } + } + + fun clearMessageSelection() { + _uiState.value = _uiState.value.copy( + selectedMessageIds = emptySet(), + isDeleteSelectionDialogVisible = false, + isDeletingSelectedMessages = false + ) + } + + fun showDeleteSelectedMessagesDialog() { + val state = _uiState.value + if (state.selectedMessageIds.isEmpty() || state.isDeletingSelectedMessages) { + return + } + + _uiState.value = state.copy(isDeleteSelectionDialogVisible = true) + } + + fun dismissDeleteSelectedMessagesDialog() { + if (_uiState.value.isDeletingSelectedMessages) { + return + } + + _uiState.value = _uiState.value.copy(isDeleteSelectionDialogVisible = false) + } + + fun confirmDeleteSelectedMessages() { + val state = _uiState.value + if (state.selectedMessageIds.isEmpty() || state.isDeletingSelectedMessages) { + return + } + + val selectedMessages = state.messages.filter { state.selectedMessageIds.contains(it.id) && canSelectMessage(it) } + if (selectedMessages.isEmpty()) { + clearMessageSelection() + return + } + + viewModelScope.launch { + _uiState.value = state.copy(isDeletingSelectedMessages = true, errorMessage = null) + runCatching { + container.executeAuthorized { session -> + selectedMessages.map { message -> + container.apiClient.deleteMessage(session.accessToken, chatId, message.id) + } + } + }.onSuccess { updatedMessages -> + updatedMessages.forEach { updated -> + if (editingMessage?.id == updated.id) { + cancelEditMessageInternal(clearDraft = true) + } + replaceOrInsertMessage(updated) + } + clearMessageSelection() + }.onFailure { error -> + _uiState.value = _uiState.value.copy( + isDeletingSelectedMessages = false, + errorMessage = error.message + ) + } + } + } + + fun appendEmoji(emoji: String) { + _uiState.value = _uiState.value.copy(draftText = _uiState.value.draftText + emoji) + } + + fun clearErrorMessage() { + _uiState.value = _uiState.value.copy(errorMessage = null) + } + + fun setErrorMessage(message: String?) { + _uiState.value = _uiState.value.copy(errorMessage = message) + } + + fun openMessageSearch() { + val state = _uiState.value + _uiState.value = state.copy( + selectedMessageIds = emptySet(), + isDeleteSelectionDialogVisible = false, + search = state.search.copy(isActive = true) + ) + } + + fun closeMessageSearch() { + searchJob?.cancel() + _uiState.value = _uiState.value.copy(search = ChatSearchUiState()) + } + + fun jumpToMessage(messageId: String) { + if (messageId.isBlank()) { + return + } + + _uiState.value = _uiState.value.copy( + selectedMessageIds = emptySet(), + isDeleteSelectionDialogVisible = false, + search = ChatSearchUiState( + isActive = true, + resultMessageIds = listOf(messageId), + activeResultIndex = 0, + isSearching = false + ) + ) + } + + fun requestScrollToMessage(messageId: String) { + if (messageId.isBlank()) { + return + } + requestScrollToMessageInternal(messageId) + } + + fun requestScrollToLatest() { + requestScrollToMessageInternal(messageId = null) + } + + fun consumeScrollRequest(requestId: Long) { + val current = _uiState.value.scrollRequest ?: return + if (current.requestId == requestId) { + _uiState.value = _uiState.value.copy(scrollRequest = null) + } + } + + fun updateMessageSearchQuery(value: String) { + searchJob?.cancel() + val localResultIds = searchLoadedMessageIds(value, _uiState.value.messages) + _uiState.value = _uiState.value.copy( + search = ChatSearchUiState( + isActive = true, + query = value, + resultMessageIds = localResultIds, + activeResultIndex = 0, + isSearching = value.trim().isNotBlank() + ) + ) + + val query = value.trim() + if (query.isBlank()) { + _uiState.value = _uiState.value.copy(search = _uiState.value.search.copy(isSearching = false)) + return + } + + searchJob = viewModelScope.launch { + delay(250) + runCatching { + container.executeAuthorized { session -> + session to container.apiClient.searchChatMessages( + accessToken = session.accessToken, + chatId = chatId, + query = query, + limit = 100 + ) + } + }.onSuccess { (session, remoteMessages) -> + val currentState = _uiState.value + if (currentState.search.query.trim() != query) { + return@onSuccess + } + + val mergedMessages = (currentState.messages + remoteMessages) + .distinctBy { it.id } + .sortedBy { it.sentAt } + val resultMessageIds = remoteMessages + .filterNot { it.isDeleted() } + .sortedByDescending { it.sentAt } + .map(MessageDto::id) + .ifEmpty { searchLoadedMessageIds(query, mergedMessages) } + + _uiState.value = currentState.copy( + messages = mergedMessages, + search = currentState.search.copy( + resultMessageIds = resultMessageIds, + activeResultIndex = 0, + isSearching = false + ) + ) + cacheMessages(session.user.id, remoteMessages) + }.onFailure { error -> + _uiState.value = _uiState.value.copy( + search = _uiState.value.search.copy(isSearching = false), + errorMessage = error.message + ) + } + } + } + + fun navigateMessageSearch(delta: Int) { + val state = _uiState.value + val size = state.search.resultMessageIds.size + if (size == 0) { + return + } + + val nextIndex = (state.search.activeResultIndex + delta).floorMod(size) + _uiState.value = state.copy(search = state.search.copy(activeResultIndex = nextIndex)) + } + + fun refresh() { + if (container.sessionStore.read() == null) return + viewModelScope.launch { + _uiState.value = _uiState.value.copy(isLoading = true, errorMessage = null) + runCatching { + container.executeAuthorized { session -> + container.realtimeService.connect(session.accessToken) + session to container.apiClient.getChat(chatId, session.accessToken) + } + }.onSuccess { (session, chat) -> + contactNamesByNormalizedPhone = loadDeviceContactNames() + applyChat(chat, session) + }.onFailure { error -> + _uiState.value = _uiState.value.copy(isLoading = false, errorMessage = error.message) + } + } + } + + fun loadOlderMessages() { + val state = _uiState.value + val oldestMessageId = state.messages.firstOrNull()?.id + if ( + oldestMessageId == null || + !state.hasMoreMessages || + state.isLoadingOlderMessages || + state.isLoading + ) { + return + } + + viewModelScope.launch { + _uiState.value = _uiState.value.copy(isLoadingOlderMessages = true, errorMessage = null) + runCatching { + container.executeAuthorized { session -> + session to container.apiClient.getChatMessagesPage( + accessToken = session.accessToken, + chatId = chatId, + beforeMessageId = oldestMessageId + ) + } + }.onSuccess { (session, page) -> + val currentState = _uiState.value + val mergedMessages = (page.messages + currentState.messages) + .distinctBy { it.id } + .sortedBy { it.sentAt } + val selectedMessageIds = sanitizeSelectedMessageIds(currentState.selectedMessageIds, mergedMessages) + + _uiState.value = currentState.copy( + messages = mergedMessages, + hasMoreMessages = page.hasMoreMessages, + isLoadingOlderMessages = false, + selectedMessageIds = selectedMessageIds, + isDeleteSelectionDialogVisible = currentState.isDeleteSelectionDialogVisible && selectedMessageIds.isNotEmpty(), + isDeletingSelectedMessages = currentState.isDeletingSelectedMessages && selectedMessageIds.isNotEmpty() + ) + cacheMessages(session.user.id, page.messages) + }.onFailure { error -> + _uiState.value = _uiState.value.copy( + isLoadingOlderMessages = false, + errorMessage = error.message + ) + } + } + } + + fun sendMessage() { + val state = _uiState.value + if (!state.canSendMessages || state.isSendingMessage) { + return + } + + val attachments = pendingAttachments + val messageBeingEdited = editingMessage + val draftText = state.draftText.trim() + val replyToMessageId = state.replyTo?.messageId + if (attachments.isEmpty() && messageBeingEdited == null && draftText.isBlank()) { + return + } + + notifyTyping(false) + + if (attachments.isNotEmpty()) { + _uiState.value = state.copy(isSendingMessage = true, errorMessage = null) + viewModelScope.launch { + runCatching { + container.transferQueueRepository.enqueueUpload( + chatId = chatId, + text = draftText.takeIf { it.isNotBlank() }, + replyToMessageId = replyToMessageId, + files = attachments + ) + }.onSuccess { + clearPendingAttachment() + _uiState.value = _uiState.value.copy(draftText = "", replyTo = null, isSendingMessage = false) + }.onFailure { error -> + _uiState.value = _uiState.value.copy(isSendingMessage = false, errorMessage = error.message) + } + } + return + } + + val optimisticMessage = if (messageBeingEdited == null && draftText.isNotBlank()) { + buildOptimisticMessage(state, draftText) + } else { + null + } + + if (optimisticMessage != null) { + val optimisticMessages = (state.messages + optimisticMessage) + .distinctBy { it.id } + .sortedBy { it.sentAt } + _uiState.value = state.copy( + messages = optimisticMessages, + draftText = "", + replyTo = null, + isSendingMessage = false, + errorMessage = null, + sendingLocalMessageIds = state.sendingLocalMessageIds + optimisticMessage.id, + failedLocalMessageIds = state.failedLocalMessageIds - optimisticMessage.id + ) + cacheMessage(optimisticMessage, isOptimistic = true) + } else { + _uiState.value = state.copy(isSendingMessage = true, errorMessage = null) + } + + viewModelScope.launch { + runCatching { + when { + messageBeingEdited != null -> { + container.executeAuthorized { session -> + container.apiClient.updateMessage( + accessToken = session.accessToken, + chatId = chatId, + messageId = messageBeingEdited.id, + text = draftText + ) + } + } + + draftText.isNotBlank() -> { + container.executeAuthorized { session -> + container.apiClient.sendMessage( + chatId = chatId, + text = draftText, + accessToken = session.accessToken, + replyToMessageId = replyToMessageId + ) + } + } + + else -> null + } + }.onSuccess { message -> + val localMessageId = optimisticMessage?.id + when { + message == null -> { + _uiState.value = _uiState.value.copy(isSendingMessage = false) + } + + messageBeingEdited != null -> { + cancelEditMessageInternal(clearDraft = true) + _uiState.value = _uiState.value.copy(isSendingMessage = false) + replaceOrInsertMessage(message) + } + + else -> { + if (localMessageId != null) { + replaceLocalMessage(localMessageId, message) + } else { + _uiState.value = _uiState.value.copy(draftText = "", replyTo = null, isSendingMessage = false) + replaceOrInsertMessage(message) + } + } + } + }.onFailure { error -> + val localMessageId = optimisticMessage?.id + if (localMessageId != null) { + val currentState = _uiState.value + _uiState.value = currentState.copy( + errorMessage = error.message, + sendingLocalMessageIds = currentState.sendingLocalMessageIds - localMessageId, + failedLocalMessageIds = currentState.failedLocalMessageIds + localMessageId + ) + } else { + _uiState.value = _uiState.value.copy(isSendingMessage = false, errorMessage = error.message) + } + } + } + } + + fun ensureBotCommandsLoaded() { + val state = _uiState.value + val botPeer = state.botPeer ?: state.peer?.takeIf { it.isBot } + if (state.chatType != ChatType.Direct || botPeer == null) { + return + } + + if (state.botCommands.isNotEmpty()) { + return + } + + viewModelScope.launch { + runCatching { + container.executeAuthorized { session -> + container.apiClient.getBotCommands(session.accessToken, botPeer.id) + } + }.onSuccess { commands -> + _uiState.value = _uiState.value.copy( + botCommands = commands.ifEmpty { DefaultCodexBridgeBotCommands } + ) + }.onFailure { + _uiState.value = _uiState.value.copy(botCommands = DefaultCodexBridgeBotCommands) + } + } + } + + fun executeBotCommand(commandText: String) { + if (commandText.isBlank()) { + return + } + + viewModelScope.launch { + runCatching { + container.executeAuthorized { session -> + container.apiClient.sendMessage(chatId, commandText.trim(), session.accessToken) + } + }.onSuccess { message -> + if (commandText.startsWith("/turn ", ignoreCase = true)) { + _uiState.value = _uiState.value.copy(draftText = "") + } + replaceOrInsertMessage(message) + }.onFailure { error -> + _uiState.value = _uiState.value.copy(errorMessage = error.message) + } + } + } + + fun clearChatHistory() { + viewModelScope.launch { + runCatching { + container.executeAuthorized { session -> + container.apiClient.clearChatHistory(session.accessToken, chatId) + session.user.id + } + }.onSuccess { ownerUserId -> + clearPendingAttachment() + cancelEditMessageInternal(clearDraft = true) + container.chatScrollStateStore.clear(chatId) + clearCachedChat(ownerUserId) + _uiState.value = _uiState.value.copy( + messages = emptyList(), + pinnedMessages = emptyList(), + hasMoreMessages = false, + isLoadingOlderMessages = false, + errorMessage = null, + replyTo = null, + selectedMessageIds = emptySet(), + isDeleteSelectionDialogVisible = false, + isDeletingSelectedMessages = false, + sendingLocalMessageIds = emptySet(), + failedLocalMessageIds = emptySet() + ) + }.onFailure { error -> + _uiState.value = _uiState.value.copy(errorMessage = error.message) + } + } + } + + fun deleteChat() { + val state = _uiState.value + if (state.isDeletingChat || state.isChatDeleted) { + return + } + + viewModelScope.launch { + _uiState.value = _uiState.value.copy(isDeletingChat = true, errorMessage = null) + runCatching { + container.executeAuthorized { session -> + container.apiClient.deleteChat( + accessToken = session.accessToken, + chatId = chatId, + forEveryone = false + ) + session.user.id + } + }.onSuccess { ownerUserId -> + clearPendingAttachment() + cancelEditMessageInternal(clearDraft = true) + container.chatScrollStateStore.clear(chatId) + container.pushSettings.resetChatNotificationPreferences(chatId) + clearCachedChat(ownerUserId) + _uiState.value = _uiState.value.copy( + isDeletingChat = false, + isChatDeleted = true, + errorMessage = null + ) + }.onFailure { error -> + _uiState.value = _uiState.value.copy( + isDeletingChat = false, + errorMessage = error.message + ) + } + } + } + + fun subscribeToChannel() { + val state = _uiState.value + if (state.chatType != ChatType.Channel || !state.canSubscribe || state.isJoiningChannel) { + return + } + + viewModelScope.launch { + _uiState.value = _uiState.value.copy(isJoiningChannel = true, errorMessage = null) + runCatching { + container.executeAuthorized { session -> + session to container.apiClient.subscribeToChannel(session.accessToken, chatId) + } + }.onSuccess { (session, chat) -> + applyChat(chat, session) + requestScrollToLatest() + }.onFailure { error -> + _uiState.value = _uiState.value.copy(isJoiningChannel = false, errorMessage = error.message) + } + } + } + + fun unsubscribeFromChannel() { + val state = _uiState.value + if (state.chatType != ChatType.Channel || !state.isSubscribed || state.canManageChannel || state.isLeavingChannel) { + return + } + + viewModelScope.launch { + _uiState.value = _uiState.value.copy(isLeavingChannel = true, errorMessage = null) + runCatching { + container.executeAuthorized { session -> + container.apiClient.unsubscribeFromChannel(session.accessToken, chatId) + session.user.id + } + }.onSuccess { ownerUserId -> + clearPendingAttachment() + cancelEditMessageInternal(clearDraft = true) + container.chatScrollStateStore.clear(chatId) + container.pushSettings.resetChatNotificationPreferences(chatId) + clearCachedChat(ownerUserId) + _uiState.value = _uiState.value.copy( + isLeavingChannel = false, + isChatDeleted = true, + errorMessage = null + ) + }.onFailure { error -> + _uiState.value = _uiState.value.copy(isLeavingChannel = false, errorMessage = error.message) + } + } + } + + fun beginEditMessage(message: MessageDto) { + if (!message.canManage(currentUserId = _uiState.value.session?.user?.id)) { + return + } + + clearPendingAttachment() + cancelReplyInternal() + editingMessage = message + _uiState.value = _uiState.value.copy( + editingMessageId = message.id, + editingMessageBanner = "Сообщение от ${formatTimestamp(message.sentAt)}", + draftText = message.text + ) + } + + fun cancelEditMessage() { + cancelEditMessageInternal(clearDraft = true) + } + + fun beginReplyToMessage(message: MessageDto) { + if (message.isDeleted()) { + return + } + + val wasEditing = editingMessage != null + cancelEditMessageInternal(clearDraft = wasEditing) + _uiState.value = _uiState.value.copy(replyTo = message.toReplyPreview()) + } + + fun cancelReply() { + cancelReplyInternal() + } + + fun toggleReaction(message: MessageDto, emoji: String) { + if (message.isDeleted() || emoji.isBlank()) { + return + } + + viewModelScope.launch { + runCatching { + container.executeAuthorized { session -> + container.apiClient.setMessageReaction( + accessToken = session.accessToken, + chatId = chatId, + messageId = message.id, + emoji = emoji + ) + } + }.onSuccess(::replaceOrInsertMessage) + .onFailure { error -> _uiState.value = _uiState.value.copy(errorMessage = error.message) } + } + } + + fun toggleReactionFromSelection(message: MessageDto, emoji: String) { + if (message.isDeleted() || emoji.isBlank()) { + return + } + + viewModelScope.launch { + runCatching { + container.executeAuthorized { session -> + container.apiClient.setMessageReaction( + accessToken = session.accessToken, + chatId = chatId, + messageId = message.id, + emoji = emoji + ) + } + }.onSuccess { updatedMessage -> + replaceOrInsertMessage(updatedMessage) + clearMessageSelection() + }.onFailure { error -> + _uiState.value = _uiState.value.copy(errorMessage = error.message) + } + } + } + + fun deleteMessage(message: MessageDto) { + if (!message.canDelete(currentUserId = _uiState.value.session?.user?.id)) { + return + } + + viewModelScope.launch { + runCatching { + container.executeAuthorized { session -> + container.apiClient.deleteMessage(session.accessToken, chatId, message.id) + } + }.onSuccess { updated -> + if (editingMessage?.id == updated.id) { + cancelEditMessageInternal(clearDraft = true) + } + replaceOrInsertMessage(updated) + }.onFailure { error -> + _uiState.value = _uiState.value.copy(errorMessage = error.message) + } + } + } + + fun togglePinMessage(message: MessageDto) { + if (message.isLocalMessage() || message.isDeleted()) { + return + } + + viewModelScope.launch { + runCatching { + container.executeAuthorized { session -> + if (message.pinnedAt == null) { + container.apiClient.pinMessage(session.accessToken, chatId, message.id) + } else { + container.apiClient.unpinMessage(session.accessToken, chatId, message.id) + } + } + }.onSuccess(::replaceOrInsertMessage) + .onFailure { error -> _uiState.value = _uiState.value.copy(errorMessage = error.message) } + } + } + + fun consumeAttachmentUri(uri: Uri) { + consumeAttachmentUris(listOf(uri)) + } + + fun consumeAttachmentUris(uris: List<Uri>) { + if (uris.isEmpty()) { + return + } + + viewModelScope.launch { + runCatching { + uris.map { uri -> container.attachmentFileService.importFromUri(uri) } + }.onSuccess { attachments -> + cancelEditMessageInternal(clearDraft = false) + pendingAttachments = attachments + _uiState.value = _uiState.value.copy( + pendingAttachment = attachments.toPendingAttachmentUiState(), + errorMessage = null + ) + }.onFailure { error -> + _uiState.value = _uiState.value.copy(errorMessage = error.message) + } + } + } + + fun removePendingAttachment() { + clearPendingAttachment() + } + + fun retryTransfer(groupId: String) { + viewModelScope.launch { + runCatching { container.transferQueueRepository.retry(groupId) } + .onFailure { error -> _uiState.value = _uiState.value.copy(errorMessage = error.message) } + } + } + + fun cancelTransfer(groupId: String) { + viewModelScope.launch { + runCatching { container.transferQueueRepository.cancel(groupId) } + .onFailure { error -> _uiState.value = _uiState.value.copy(errorMessage = error.message) } + } + } + + fun openAttachment(attachment: AttachmentDto) { + if (attachment.isImageAttachment()) { + showImagePreviewAttachment(attachment.id) + return + } + + if (attachment.kind == com.seven.ikar.kotlin.core.model.AttachmentKind.VoiceNote) { + toggleVoiceAttachmentPlayback(attachment) + return + } + + viewModelScope.launch { + runCatching { + val local = ensureAttachmentDownloaded(attachment) + container.attachmentFileService.openCachedAttachment( + localPath = local.localPath, + fileName = local.fileName, + contentType = local.contentType + ) + }.onFailure { error -> + _uiState.value = _uiState.value.copy(errorMessage = error.message) + } + } + } + + fun dismissImagePreview() { + _uiState.value = _uiState.value.copy(previewImageAttachmentId = null) + } + + fun showImagePreviewAttachment(attachmentId: String) { + _uiState.value = _uiState.value.copy(previewImageAttachmentId = attachmentId) + } + + fun shareAttachmentExternally(attachment: AttachmentDto) { + if (isAttachmentInProtectedMessage(attachment)) { + _uiState.value = _uiState.value.copy(errorMessage = "Защищённый контент нельзя пересылать.") + return + } + + viewModelScope.launch { + runCatching { + val local = ensureAttachmentDownloaded(attachment) + container.attachmentFileService.shareCachedAttachment( + localPath = local.localPath, + fileName = local.fileName, + contentType = local.contentType + ) + }.onFailure { error -> + _uiState.value = _uiState.value.copy(errorMessage = error.message) + } + } + } + + fun saveImageAttachmentToGallery(attachment: AttachmentDto) { + if (isAttachmentInProtectedMessage(attachment)) { + _uiState.value = _uiState.value.copy(errorMessage = "Защищённый контент нельзя сохранять.") + return + } + + viewModelScope.launch { + runCatching { + val local = ensureAttachmentDownloaded(attachment) + container.attachmentFileService.saveCachedImageToGallery( + localPath = local.localPath, + fileName = local.fileName, + contentType = local.contentType + ) + }.onFailure { error -> + _uiState.value = _uiState.value.copy(errorMessage = error.message) + } + } + } + + fun beginVoiceRecording() { + if (_uiState.value.isRecordingVoiceNote || !_uiState.value.canSendMessages) { + return + } + + viewModelScope.launch { + runCatching { + container.voiceNoteRecorderService.start() + }.onSuccess { + _uiState.value = _uiState.value.copy( + isRecordingVoiceNote = true, + voiceRecordingElapsedText = "00:00", + errorMessage = null + ) + }.onFailure { error -> + _uiState.value = _uiState.value.copy(errorMessage = error.message) + } + } + } + + fun completeVoiceRecording() { + if (!_uiState.value.isRecordingVoiceNote) { + return + } + + viewModelScope.launch { + runCatching { + val file = container.voiceNoteRecorderService.stop(discard = false) + if (file == null) { + null + } else { + if (file.length() <= 0L) { + file.delete() + throw IllegalStateException("Голосовое сообщение пустое.") + } + + if (_uiState.value.voiceRecordingElapsedText == "00:00") { + file.delete() + throw IllegalStateException("Голосовое сообщение слишком короткое.") + } + + try { + container.executeAuthorized { session -> + container.apiClient.uploadAttachment( + accessToken = session.accessToken, + chatId = chatId, + text = null, + replyToMessageId = _uiState.value.replyTo?.messageId, + file = UploadFileSource( + fileName = file.name, + contentType = "audio/mp4", + contentLength = file.length() + ) { file.inputStream() } + ) + } + } finally { + file.delete() + } + } + }.onSuccess { message -> + _uiState.value = _uiState.value.copy( + isRecordingVoiceNote = false, + voiceRecordingElapsedText = "00:00", + replyTo = null + ) + message?.let(::replaceOrInsertMessage) + }.onFailure { error -> + _uiState.value = _uiState.value.copy( + isRecordingVoiceNote = false, + voiceRecordingElapsedText = "00:00", + errorMessage = error.message + ) + } + } + } + + fun cancelVoiceRecording() { + viewModelScope.launch { + runCatching { container.voiceNoteRecorderService.stop(discard = true) } + _uiState.value = _uiState.value.copy( + isRecordingVoiceNote = false, + voiceRecordingElapsedText = "00:00" + ) + } + } + + fun stopVoicePlayback() { + viewModelScope.launch { + container.voiceNotePlayerService.stop() + } + } + + fun startAudioCall() { + val state = _uiState.value + if (!canStartAudioCall(state)) { + return + } + + viewModelScope.launch { + runCatching { + container.executeAuthorized { session -> + container.realtimeService.ensureConnected(session.accessToken) + container.callManager.startOutgoingAudioCall(chatId) + } + } + .onFailure { error -> _uiState.value = _uiState.value.copy(errorMessage = error.message) } + } + } + + fun startVideoCall() { + val state = _uiState.value + if (!canStartAudioCall(state)) { + return + } + + viewModelScope.launch { + runCatching { + container.executeAuthorized { session -> + container.realtimeService.ensureConnected(session.accessToken) + container.callManager.startOutgoingVideoCall(chatId) + } + } + .onFailure { error -> _uiState.value = _uiState.value.copy(errorMessage = error.message) } + } + } + + fun acceptCall() { + container.callManager.acceptCurrentCall() + } + + fun declineCall() { + container.callManager.declineCurrentCall() + } + + fun endCall() { + container.callManager.endCurrentCall() + } + + fun attachmentPreviewUrl(attachment: AttachmentDto): String = when { + attachment.downloadPath.startsWith("http://") || attachment.downloadPath.startsWith("https://") -> attachment.downloadPath + else -> ServerConfig.absoluteMessengerUrl(attachment.downloadPath) + } + + fun showCallHeaderButton(state: ChatUiState = uiState.value): Boolean = + state.chatType == ChatType.Direct && state.peer?.isBot == false && state.botPeer == null + + fun showBotComposerMenuButton(state: ChatUiState = uiState.value): Boolean = + state.chatType == ChatType.Direct && (state.botPeer != null || state.peer?.isBot == true) + + fun showHeaderMenuButton(state: ChatUiState = uiState.value): Boolean = + state.chatType == ChatType.Direct && (state.botPeer != null || state.peer?.isBot == true) + + fun showAcceptCallButton(state: ChatUiState = uiState.value): Boolean = + state.activeCall?.stage == AudioCallStage.Incoming + + fun showDeclineCallButton(state: ChatUiState = uiState.value): Boolean = + state.activeCall?.stage in setOf(AudioCallStage.Incoming, AudioCallStage.Outgoing, AudioCallStage.Connecting) + + fun showEndCallButton(state: ChatUiState = uiState.value): Boolean = + state.activeCall?.stage == AudioCallStage.Active + + fun callBannerTitle(state: ChatUiState = uiState.value): String = + state.activeCall?.peer?.displayName.orEmpty() + + fun callBannerSubtitle(state: ChatUiState = uiState.value): String { + val call = state.activeCall ?: return "" + val callPrefix = if (call.mediaType == CallMediaType.Video) "Видеозвонок" else "Аудиозвонок" + return when (call.stage) { + AudioCallStage.Incoming -> "Входящий ${callPrefix.lowercase()}" + AudioCallStage.Outgoing -> if (call.mediaType == CallMediaType.Video) "Идёт видеовызов..." else "Идёт вызов..." + AudioCallStage.Connecting -> "Подключение..." + AudioCallStage.Active -> if (call.mediaType == CallMediaType.Video) "Видеозвонок ${call.durationText}" else "Разговор ${call.durationText}" + AudioCallStage.None -> "" + } + } + + fun availableBotCommands(state: ChatUiState = uiState.value): List<BotCommandDto> = + state.botCommands.ifEmpty { DefaultCodexBridgeBotCommands } + + fun latestBotQuickActions(state: ChatUiState = uiState.value): List<BotQuickAction> = + state.messages.lastOrNull { buildBotQuickActions(it).isNotEmpty() } + ?.let(::buildBotQuickActions) + .orEmpty() + + private fun loadCachedMessages(session: AuthSessionDto? = container.sessionStore.read()) { + if (session == null) { + return + } + + viewModelScope.launch { + val cachedMessages = withContext(Dispatchers.IO) { + val latestMessages = container.chatMessageCache.loadLatestMessages(session.user.id, chatId) + val optimisticMessages = container.chatMessageCache.loadOptimisticMessages(session.user.id, chatId) + (latestMessages + optimisticMessages) + .distinctBy { it.id } + .sortedBy { it.sentAt } + } + if (cachedMessages.isEmpty()) { + return@launch + } + + val currentState = _uiState.value + val mergedMessages = (currentState.messages + cachedMessages) + .distinctBy { it.id } + .sortedBy { it.sentAt } + val cachedLocalMessageIds = cachedMessages + .filter { it.isLocalMessage() } + .mapTo(mutableSetOf()) { it.id } + val selectedMessageIds = sanitizeSelectedMessageIds(currentState.selectedMessageIds, mergedMessages) + + _uiState.value = currentState.copy( + session = session, + messages = mergedMessages, + selectedMessageIds = selectedMessageIds, + isDeleteSelectionDialogVisible = currentState.isDeleteSelectionDialogVisible && selectedMessageIds.isNotEmpty(), + isDeletingSelectedMessages = currentState.isDeletingSelectedMessages && selectedMessageIds.isNotEmpty(), + failedLocalMessageIds = currentState.failedLocalMessageIds + + (cachedLocalMessageIds - currentState.sendingLocalMessageIds) + ) + } + } + + private fun buildOptimisticMessage(state: ChatUiState, text: String): MessageDto? { + val session = state.session ?: container.sessionStore.read() ?: return null + return MessageDto( + id = "$LocalMessageIdPrefix${UUID.randomUUID()}", + chatId = chatId, + chatType = state.chatType, + sender = session.user, + text = text, + attachments = emptyList(), + sentAt = OffsetDateTime.now(ZoneOffset.UTC).format(DateTimeFormatter.ISO_OFFSET_DATE_TIME), + deliveryState = MessageDeliveryState.Sent, + replyTo = state.replyTo, + postedAsChannel = state.chatType == ChatType.Channel, + displayAuthorName = if (state.chatType == ChatType.Channel) state.title else session.user.displayName, + viewCount = if (state.chatType == ChatType.Channel) 0 else null + ) + } + + private fun applyChat(chat: ChatDetailsDto, session: AuthSessionDto) { + val previousState = _uiState.value + val localMessages = previousState.messages.filter { it.isLocalMessage() } + val orderedMessages = (chat.messages + localMessages) + .distinctBy { it.id } + .sortedBy { it.sentAt } + val localMessageIds = orderedMessages + .filter { it.isLocalMessage() } + .mapTo(mutableSetOf()) { it.id } + val peer = resolvePeer(chat, session) + val botPeer = resolveBotPeer(chat, session, peer, orderedMessages) + val resolvedTitle = resolveChatTitle(chat, peer) + baseSubtitle = buildSubtitle(chat, peer) + val updatedEditingMessage = previousState.editingMessageId?.let { editingId -> + orderedMessages.firstOrNull { it.id == editingId && it.deletedAt == null } + } + val selectedMessageIds = sanitizeSelectedMessageIds(previousState.selectedMessageIds, orderedMessages) + editingMessage = updatedEditingMessage + + _uiState.value = previousState.copy( + session = session, + title = resolvedTitle, + subtitle = buildTypingSubtitle().ifBlank { baseSubtitle }, + chatType = chat.type, + peer = peer, + botPeer = botPeer, + messages = orderedMessages, + pinnedMessages = chat.pinnedMessages, + hasMoreMessages = chat.hasMoreMessages, + isLoadingOlderMessages = false, + firstUnreadMessageId = chat.firstUnreadMessageId, + canSendMessages = chat.canSendMessages, + subscriberCount = chat.subscriberCount, + adminCount = chat.adminCount, + isSubscribed = chat.isSubscribed, + canSubscribe = chat.canSubscribe, + canManageChannel = chat.canManageChannel, + canPostAsChannel = chat.canPostAsChannel, + publicUsername = chat.publicUsername, + linkedDiscussionChatId = chat.linkedDiscussionChatId, + channelDescription = chat.description, + isJoiningChannel = false, + isLeavingChannel = false, + isLoading = false, + errorMessage = null, + selectedMessageIds = selectedMessageIds, + isDeleteSelectionDialogVisible = previousState.isDeleteSelectionDialogVisible && selectedMessageIds.isNotEmpty(), + isDeletingSelectedMessages = previousState.isDeletingSelectedMessages && selectedMessageIds.isNotEmpty(), + sendingLocalMessageIds = previousState.sendingLocalMessageIds.intersect(localMessageIds), + failedLocalMessageIds = previousState.failedLocalMessageIds.intersect(localMessageIds), + editingMessageId = updatedEditingMessage?.id, + editingMessageBanner = updatedEditingMessage?.let { "Сообщение от ${formatTimestamp(it.sentAt)}" }.orEmpty(), + draftText = when { + updatedEditingMessage != null -> previousState.draftText + previousState.editingMessageId != null -> "" + else -> previousState.draftText + } + ) + cacheMessages(session.user.id, chat.messages) + scheduleAutoDownloads(orderedMessages) + refreshCallBanner() + } + + private fun attachRealtime() { + viewModelScope.launch { + container.realtimeService.messagesCreated.collect { message -> + if (message.chatId == chatId) { + replaceOrInsertMessage(message) + requestScrollToMessageInternal(message.id) + if (message.sender.id != _uiState.value.session?.user?.id) { + acknowledgeRead(message.id) + } + } + } + } + viewModelScope.launch { + container.realtimeService.messagesUpdated.collect { message -> + if (message.chatId == chatId) { + if (editingMessage?.id == message.id && message.deletedAt != null) { + cancelEditMessageInternal(clearDraft = true) + } + replaceOrInsertMessage(message) + } + } + } + viewModelScope.launch { + container.realtimeService.chatsChanged.collect { + refresh() + } + } + viewModelScope.launch { + container.realtimeService.typingChanged.collect(::handleTypingChanged) + } + } + + private fun handleTypingChanged(payload: TypingIndicatorDto) { + val currentUserId = _uiState.value.session?.user?.id + if (payload.chatId != chatId || payload.user.id == currentUserId) { + return + } + + val userId = payload.user.id + typingExpiryJobs.remove(userId)?.cancel() + if (payload.isTyping) { + typingUsers[userId] = payload.user + typingExpiryJobs[userId] = viewModelScope.launch { + delay(4_000) + typingUsers.remove(userId) + typingExpiryJobs.remove(userId) + updateTypingSubtitle() + } + } else { + typingUsers.remove(userId) + } + + updateTypingSubtitle() + } + + private fun notifyTyping(isTyping: Boolean) { + if (!_uiState.value.canSendMessages) { + return + } + + if (!isTyping) { + typingStopJob?.cancel() + typingStopJob = null + if (typingStateSent) { + typingStateSent = false + sendTypingSignal(false) + } + return + } + + val now = System.currentTimeMillis() + if (!typingStateSent || now - lastTypingSentAtMillis > 2_000) { + typingStateSent = true + lastTypingSentAtMillis = now + sendTypingSignal(true) + } + + typingStopJob?.cancel() + typingStopJob = viewModelScope.launch { + delay(2_500) + typingStateSent = false + sendTypingSignal(false) + } + } + + private fun sendTypingSignal(isTyping: Boolean) { + viewModelScope.launch(Dispatchers.IO) { + runCatching { + container.executeAuthorized { session -> + container.realtimeService.ensureConnected(session.accessToken) + container.realtimeService.sendTyping(chatId, isTyping) + } + } + } + } + + private fun updateTypingSubtitle() { + _uiState.value = _uiState.value.copy( + subtitle = buildTypingSubtitle().ifBlank { baseSubtitle } + ) + } + + private fun buildTypingSubtitle(): String { + val names = typingUsers.values + .sortedBy { it.displayName.lowercase(Locale.getDefault()) } + .map { it.displayName.ifBlank { it.username } } + + return when { + names.isEmpty() -> "" + names.size == 1 && _uiState.value.chatType == ChatType.Direct -> "печатает..." + names.size == 1 -> "${names.first()} печатает..." + names.size == 2 -> "${names[0]} и ${names[1]} печатают..." + else -> "${names.size} участников печатают..." + } + } + + private fun attachCallState() { + viewModelScope.launch { + container.callManager.currentCall.collect { + refreshCallBanner() + } + } + } + + private fun attachVoicePlaybackState() { + viewModelScope.launch { + container.voiceNotePlayerService.events.collect { event -> + val nextMap = _uiState.value.attachmentPlayback.toMutableMap() + nextMap[event.attachmentId] = VoiceAttachmentPlaybackUiState( + isPlaying = event.isPlaying, + positionMs = event.positionMs, + durationMs = event.durationMs + ) + _uiState.value = _uiState.value.copy(attachmentPlayback = nextMap) + } + } + } + + private fun attachVoiceRecordingState() { + viewModelScope.launch { + container.voiceNoteRecorderService.elapsedMs.collect { elapsedMs -> + if (_uiState.value.isRecordingVoiceNote) { + _uiState.value = _uiState.value.copy( + voiceRecordingElapsedText = formatDurationMs(elapsedMs) + ) + } + } + } + } + + private fun attachTransferQueueState() { + viewModelScope.launch { + container.transferQueueRepository.observeActiveForChat(chatId).collect { items -> + _uiState.value = _uiState.value.copy(activeTransfers = items.toTransferQueueUiState()) + } + } + } + + private fun refreshCallBanner() { + val current = container.callManager.currentCall.value + _uiState.value = _uiState.value.copy(activeCall = current?.takeIf { it.chatId == chatId }) + } + + private suspend fun ensureAttachmentDownloaded(attachment: AttachmentDto): LocalAttachmentFile { + cachedAttachmentFiles[attachment.id]?.let { return it } + + val target = container.attachmentFileService.createAttachmentCacheFile(attachment.id, attachment.fileName) + if (target.exists()) { + val cached = LocalAttachmentFile( + fileName = attachment.fileName, + contentType = attachment.contentType, + fileSizeBytes = target.length(), + localPath = target.absolutePath + ) + cachedAttachmentFiles[attachment.id] = cached + return cached + } + + if (attachment.fileSizeBytes >= TransferForegroundNotification.LargeTransferThresholdBytes) { + container.transferQueueRepository.enqueueDownload(chatId, attachment) + throw IllegalStateException("Large download queued. Try opening it again when the transfer completes.") + } + + return container.executeAuthorized { session -> + val downloaded = container.apiClient.downloadAttachmentTo(session.accessToken, attachment, target) + val cached = container.attachmentFileService.cacheDownloadedAttachment(downloaded) + cachedAttachmentFiles[attachment.id] = cached + cached + } + } + + private fun scheduleAutoDownloads(messages: List<MessageDto>) { + val settings = container.appSettings.loadSnapshot() + if (!settings.autoDownloadPhotos && !settings.autoDownloadVideosOnWifi && !settings.autoDownloadFilesOnWifi) { + return + } + + val isUnmetered = isUnmeteredNetwork() + messages + .asSequence() + .filterNot { it.hasProtectedContent || it.isDeleted() } + .flatMap { it.attachments.asSequence() } + .filter { attachment -> shouldAutoDownload(attachment, settings, isUnmetered) } + .filterNot { attachment -> cachedAttachmentFiles.containsKey(attachment.id) } + .filterNot { attachment -> container.attachmentFileService.createAttachmentCacheFile(attachment.id, attachment.fileName).exists() } + .take(8) + .forEach { attachment -> + viewModelScope.launch { + runCatching { ensureAttachmentDownloaded(attachment) } + } + } + } + + private fun shouldAutoDownload( + attachment: AttachmentDto, + settings: com.seven.ikar.kotlin.core.settings.AppSettingsSnapshot, + isUnmetered: Boolean + ): Boolean = when { + attachment.isImageAttachment() -> settings.autoDownloadPhotos + attachment.contentType.startsWith("video/", ignoreCase = true) -> settings.autoDownloadVideosOnWifi && isUnmetered + else -> settings.autoDownloadFilesOnWifi && isUnmetered + } + + private fun isUnmeteredNetwork(): Boolean { + val connectivityManager = container.appContext.getSystemService(Context.CONNECTIVITY_SERVICE) as? ConnectivityManager + ?: return false + val network = connectivityManager.activeNetwork ?: return false + val capabilities = connectivityManager.getNetworkCapabilities(network) ?: return false + return capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED) + } + + private fun isAttachmentInProtectedMessage(attachment: AttachmentDto): Boolean = + _uiState.value.messages.any { message -> + message.hasProtectedContent && message.attachments.any { it.id == attachment.id } + } + + private fun toggleVoiceAttachmentPlayback(attachment: AttachmentDto) { + viewModelScope.launch { + runCatching { + val local = ensureAttachmentDownloaded(attachment) + container.voiceNotePlayerService.toggle( + attachmentId = attachment.id, + localFilePath = local.localPath + ) + }.onFailure { error -> + _uiState.value = _uiState.value.copy(errorMessage = error.message) + } + } + } + + private fun clearPendingAttachment() { + pendingAttachments = emptyList() + _uiState.value = _uiState.value.copy(pendingAttachment = null) + } + + private fun cancelEditMessageInternal(clearDraft: Boolean) { + editingMessage = null + _uiState.value = _uiState.value.copy( + editingMessageId = null, + editingMessageBanner = "", + draftText = if (clearDraft) "" else _uiState.value.draftText + ) + } + + private fun cancelReplyInternal() { + _uiState.value = _uiState.value.copy(replyTo = null) + } + + private fun replaceOrInsertMessage(message: MessageDto, cacheAsOptimistic: Boolean = message.isLocalMessage()) { + val currentState = _uiState.value + val matchingLocalMessageId = findMatchingPendingLocalMessageId(currentState, message) + val nextMessages = currentState.messages + .filterNot { it.id == matchingLocalMessageId } + .toMutableList() + val existingIndex = nextMessages.indexOfFirst { it.id == message.id } + if (existingIndex >= 0) { + nextMessages[existingIndex] = message + } else { + nextMessages += message + } + + val sortedMessages = nextMessages.sortedBy { it.sentAt } + val updatedReplyTo = currentState.replyTo?.let { currentReply -> + if (currentReply.messageId == message.id) message.toReplyPreview() else currentReply + } + val selectedMessageIds = sanitizeSelectedMessageIds(currentState.selectedMessageIds, sortedMessages) + val sendingLocalMessageIds = matchingLocalMessageId?.let { currentState.sendingLocalMessageIds - it } + ?: currentState.sendingLocalMessageIds + val failedLocalMessageIds = matchingLocalMessageId?.let { currentState.failedLocalMessageIds - it } + ?: currentState.failedLocalMessageIds + val pinnedMessages = updatePinnedMessages(currentState.pinnedMessages, message) + + _uiState.value = currentState.copy( + messages = sortedMessages, + pinnedMessages = pinnedMessages, + errorMessage = null, + replyTo = updatedReplyTo, + selectedMessageIds = selectedMessageIds, + isDeleteSelectionDialogVisible = currentState.isDeleteSelectionDialogVisible && selectedMessageIds.isNotEmpty(), + isDeletingSelectedMessages = currentState.isDeletingSelectedMessages && selectedMessageIds.isNotEmpty(), + sendingLocalMessageIds = sendingLocalMessageIds, + failedLocalMessageIds = failedLocalMessageIds + ) + if (matchingLocalMessageId != null) { + cacheReplaceOptimisticMessage(matchingLocalMessageId, message) + } else { + cacheMessage(message, isOptimistic = cacheAsOptimistic) + } + scheduleAutoDownloads(listOf(message)) + } + + private fun requestScrollToMessageInternal(messageId: String?) { + _uiState.value = _uiState.value.copy(scrollRequest = ChatScrollRequest(messageId = messageId)) + } + + private fun replaceLocalMessage(localMessageId: String, serverMessage: MessageDto) { + val currentState = _uiState.value + val nextMessages = currentState.messages + .filterNot { it.id == localMessageId || it.id == serverMessage.id } + .plus(serverMessage) + .sortedBy { it.sentAt } + val selectedMessageIds = sanitizeSelectedMessageIds(currentState.selectedMessageIds, nextMessages) + val pinnedMessages = updatePinnedMessages(currentState.pinnedMessages, serverMessage) + + _uiState.value = currentState.copy( + messages = nextMessages, + pinnedMessages = pinnedMessages, + errorMessage = null, + selectedMessageIds = selectedMessageIds, + isDeleteSelectionDialogVisible = currentState.isDeleteSelectionDialogVisible && selectedMessageIds.isNotEmpty(), + isDeletingSelectedMessages = currentState.isDeletingSelectedMessages && selectedMessageIds.isNotEmpty(), + sendingLocalMessageIds = currentState.sendingLocalMessageIds - localMessageId, + failedLocalMessageIds = currentState.failedLocalMessageIds - localMessageId + ) + cacheReplaceOptimisticMessage(localMessageId, serverMessage) + } + + private fun findMatchingPendingLocalMessageId(state: ChatUiState, serverMessage: MessageDto): String? { + if (serverMessage.isLocalMessage() || state.sendingLocalMessageIds.isEmpty()) { + return null + } + + return state.messages.firstOrNull { localMessage -> + state.sendingLocalMessageIds.contains(localMessage.id) && + localMessage.sender.id == serverMessage.sender.id && + localMessage.text == serverMessage.text && + localMessage.attachments.isEmpty() && + serverMessage.attachments.isEmpty() && + localMessage.replyTo?.messageId == serverMessage.replyTo?.messageId + }?.id + } + + private fun cacheMessage(message: MessageDto, isOptimistic: Boolean = false) { + val ownerUserId = _uiState.value.session?.user?.id ?: container.sessionStore.read()?.user?.id ?: return + cacheMessages(ownerUserId, listOf(message), isOptimistic = isOptimistic) + } + + private fun cacheMessages( + ownerUserId: String, + messages: List<MessageDto>, + isOptimistic: Boolean = false + ) { + if (messages.isEmpty()) { + return + } + + viewModelScope.launch(Dispatchers.IO) { + container.chatMessageCache.upsertMessages(ownerUserId, chatId, messages, isOptimistic) + } + } + + private fun cacheReplaceOptimisticMessage(localMessageId: String, serverMessage: MessageDto) { + val ownerUserId = _uiState.value.session?.user?.id ?: container.sessionStore.read()?.user?.id ?: return + viewModelScope.launch(Dispatchers.IO) { + container.chatMessageCache.replaceOptimisticMessage(ownerUserId, chatId, localMessageId, serverMessage) + } + } + + private fun clearCachedChat(ownerUserId: String) { + viewModelScope.launch(Dispatchers.IO) { + container.chatMessageCache.clearChat(ownerUserId, chatId) + } + } + + fun acknowledgeRead(messageId: String) { + viewModelScope.launch { + runCatching { + container.executeAuthorized { session -> + container.apiClient.acknowledgeRead( + accessToken = session.accessToken, + chatId = chatId, + messageId = messageId + ) + } + } + } + } + + private fun resolvePeer(chat: ChatDetailsDto, session: AuthSessionDto): UserSummaryDto? { + if (chat.type != ChatType.Direct) { + return null + } + + return chat.participants.firstOrNull { it.id != session.user.id } + } + + private fun resolveBotPeer( + chat: ChatDetailsDto, + session: AuthSessionDto, + peer: UserSummaryDto?, + messages: List<MessageDto> + ): UserSummaryDto? { + if (chat.type != ChatType.Direct) { + return null + } + + return peer?.takeIf { it.isBot } + ?: chat.participants.firstOrNull { it.id != session.user.id && it.isBot } + ?: messages.asSequence() + .map { it.sender } + .firstOrNull { it.id != session.user.id && it.isBot } + } + + private fun resolveChatTitle(chat: ChatDetailsDto, peer: UserSummaryDto?): String { + if (chat.type != ChatType.Direct) { + return chat.title + } + + val normalizedPhone = PhoneNumberNormalizer.normalize(peer?.phoneNumber) + val contactName = normalizedPhone?.let(contactNamesByNormalizedPhone::get) + return contactName?.takeIf { it.isNotBlank() } + ?: peer?.displayName?.takeIf { it.isNotBlank() } + ?: chat.title + } + + private suspend fun loadDeviceContactNames(): Map<String, String> = withContext(Dispatchers.IO) { + if (!hasContactsPermission()) { + return@withContext emptyMap() + } + + runCatching { + container.contactDiscoveryService + .getContacts() + .associate { contact -> contact.normalizedPhoneNumber to contact.displayName } + }.getOrDefault(emptyMap()) + } + + private fun hasContactsPermission(): Boolean = + ContextCompat.checkSelfPermission( + container.appContext, + Manifest.permission.READ_CONTACTS + ) == PackageManager.PERMISSION_GRANTED + + private fun canSelectMessage(message: MessageDto): Boolean = + !message.isLocalMessage() && message.canDelete(currentUserId = _uiState.value.session?.user?.id) + + private fun sanitizeSelectedMessageIds(selectedMessageIds: Set<String>, messages: List<MessageDto>): Set<String> { + if (selectedMessageIds.isEmpty()) { + return emptySet() + } + + val existingSelectableIds = messages + .asSequence() + .filter(::canSelectMessage) + .map(MessageDto::id) + .toSet() + + return selectedMessageIds.intersect(existingSelectableIds) + } + + private fun updatePinnedMessages(current: List<MessageDto>, message: MessageDto): List<MessageDto> { + val withoutMessage = current.filterNot { it.id == message.id } + if (message.pinnedAt == null || message.isDeleted()) { + return withoutMessage + } + + return (withoutMessage + message) + .sortedByDescending { it.pinnedAt.orEmpty() } + .take(5) + } + + private fun buildSubtitle(chat: ChatDetailsDto, peer: UserSummaryDto?): String = when { + chat.type == ChatType.Direct && peer != null -> formatPresence(peer) + chat.type == ChatType.Channel && chat.canPostAsChannel -> "${formatChannelSubscribers(chat)} · публикация разрешена" + chat.type == ChatType.Channel -> formatChannelSubscribers(chat) + chat.type == ChatType.Group -> "${chat.participants.size} участников" + else -> "${chat.participants.size} участника" + } + + private fun canStartAudioCall(state: ChatUiState): Boolean = + state.chatType == ChatType.Direct && + state.peer?.isBot == false && + state.activeCall == null +} + +internal fun MessageDto.canManage(currentUserId: String?): Boolean = + currentUserId != null && sender.id == currentUserId && deletedAt == null + +internal fun MessageDto.canDelete(currentUserId: String?): Boolean = + currentUserId != null && deletedAt == null + +private fun MessageDto.isLocalMessage(): Boolean = id.startsWith(LocalMessageIdPrefix) + +private fun searchLoadedMessageIds(query: String, messages: List<MessageDto>): List<String> { + val normalizedQuery = query.trim() + if (normalizedQuery.isBlank()) { + return emptyList() + } + + return messages + .asSequence() + .filterNot { it.isDeleted() } + .filter { message -> + message.text.contains(normalizedQuery, ignoreCase = true) || + message.sender.displayName.contains(normalizedQuery, ignoreCase = true) || + message.attachments.any { attachment -> + attachment.fileName.contains(normalizedQuery, ignoreCase = true) || + attachment.contentType.contains(normalizedQuery, ignoreCase = true) + } + } + .sortedByDescending { it.sentAt } + .map(MessageDto::id) + .toList() +} + +private fun Int.floorMod(modulus: Int): Int = ((this % modulus) + modulus) % modulus + +private fun formatChannelSubscribers(chat: ChatDetailsDto): String { + val count = if (chat.subscriberCount > 0) chat.subscriberCount else chat.participants.size + return "$count ${russianPlural(count, "подписчик", "подписчика", "подписчиков")}" +} + +private fun russianPlural(count: Int, one: String, few: String, many: String): String { + val value = kotlin.math.abs(count) % 100 + val lastDigit = value % 10 + if (value in 11..14) { + return many + } + + return when (lastDigit) { + 1 -> one + in 2..4 -> few + else -> many + } +} + +private fun List<LocalAttachmentFile>.toPendingAttachmentUiState(): PendingAttachmentUiState? { + if (isEmpty()) { + return null + } + + val imagePreviews = filter { it.isImageAttachment() } + .map { attachment -> + PendingImageAttachmentUiState( + fileName = attachment.fileName, + localPath = attachment.localPath + ) + } + + if (size == 1) { + val attachment = first() + return PendingAttachmentUiState( + fileName = attachment.fileName, + contentType = attachment.contentType, + fileSizeBytes = attachment.fileSizeBytes, + imagePreviews = imagePreviews + ) + } + + val allImages = imagePreviews.size == size + return PendingAttachmentUiState( + fileName = if (allImages) { + "$size ${russianPlural(size, "фотография", "фотографии", "фотографий")}" + } else { + "$size ${russianPlural(size, "файл", "файла", "файлов")}" + }, + contentType = if (allImages) "альбом" else "вложения", + fileSizeBytes = sumOf { it.fileSizeBytes }, + imagePreviews = imagePreviews + ) +} + +private fun LocalAttachmentFile.isImageAttachment(): Boolean = + contentType.startsWith("image/", ignoreCase = true) || + fileName.endsWith(".jpg", ignoreCase = true) || + fileName.endsWith(".jpeg", ignoreCase = true) || + fileName.endsWith(".png", ignoreCase = true) || + fileName.endsWith(".webp", ignoreCase = true) || + fileName.endsWith(".gif", ignoreCase = true) + +private fun List<TransferQueueEntity>.toTransferQueueUiState(): List<TransferQueueUiState> = + groupBy { it.groupId } + .map { (groupId, items) -> + val ordered = items.sortedBy { it.sortOrder } + val first = ordered.first() + TransferQueueUiState( + groupId = groupId, + title = if (ordered.size == 1) first.fileName else "${ordered.size} файлов", + status = first.status, + progressPercent = ordered.maxOfOrNull { it.progressPercent } ?: 0, + errorMessage = ordered.firstNotNullOfOrNull { it.errorMessage } + ) + } + .sortedBy { it.title } + +internal fun MessageDto.isDeleted(): Boolean = deletedAt != null + +internal fun AttachmentDto.isImageAttachment(): Boolean = + contentType.startsWith("image/", ignoreCase = true) || + fileName.endsWith(".jpg", ignoreCase = true) || + fileName.endsWith(".jpeg", ignoreCase = true) || + fileName.endsWith(".png", ignoreCase = true) || + fileName.endsWith(".webp", ignoreCase = true) || + fileName.endsWith(".gif", ignoreCase = true) + +internal fun buildBotQuickActions(message: MessageDto): List<BotQuickAction> { + if (!message.sender.isBot || message.text.isBlank()) { + return emptyList() + } + + val normalizedText = message.text.replace("\r\n", "\n") + if (!normalizedText.startsWith("Текущие thread:") && + !normalizedText.startsWith("Thread по запросу") + ) { + return if (normalizedText.contains("Создать новый thread:")) { + listOf(BotQuickAction(title = "Создать новый поток", commandText = "/newthread")) + } else { + emptyList() + } + } + + return normalizedText + .split('\n') + .mapNotNull { rawLine -> + val match = BotThreadOptionRegex.matchEntire(rawLine.trim()) ?: return@mapNotNull null + val index = match.groups["index"]?.value?.trim().orEmpty() + val title = match.groups["title"]?.value?.trim().orEmpty() + if (index.isBlank() || title.isBlank()) { + null + } else { + BotQuickAction(title = "$index. $title", commandText = "/use $index") + } + } +} + +internal fun formatDurationMs(value: Long): String { + val totalSeconds = (value / 1000L).coerceAtLeast(0L) + val minutes = totalSeconds / 60L + val seconds = totalSeconds % 60L + return String.format(Locale.US, "%02d:%02d", minutes, seconds) +} + +private fun formatTimestamp(value: String): String = + runCatching { + OffsetDateTime.parse(value) + .atZoneSameInstant(ZoneId.systemDefault()) + .toOffsetDateTime() + .format(ChatTimestampFormatter) + }.getOrDefault(value) + +private fun MessageDto.toReplyPreview(): MessageReplyDto = + MessageReplyDto( + messageId = id, + senderId = sender.id, + senderDisplayName = sender.displayName, + previewText = when { + isDeleted() -> "Сообщение удалено" + text.isNotBlank() && attachments.isNotEmpty() -> "$text (${attachments.size})" + text.isNotBlank() -> text + attachments.size == 1 -> attachments.first().fileName + attachments.isNotEmpty() -> "${attachments.size} файлов" + else -> "Сообщение" + } + ) diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/chat/EmojiCatalog.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/chat/EmojiCatalog.kt new file mode 100644 index 00000000..5140c6ad --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/chat/EmojiCatalog.kt @@ -0,0 +1,224 @@ +package com.seven.ikar.kotlin.feature.chat + +import android.content.Context + +internal data class EmojiCategory( + val key: String, + val title: String, + val icon: String, + val emojis: List<String> +) + +private const val EmojiPrefsName = "ikar_emoji_picker" +private const val FrequentEmojiKey = "frequent_emojis" +private const val EmojiSeparator = "\u001F" +private const val MaxFrequentEmoji = 48 + +internal val DefaultFrequentEmojis = listOf( + "😀", "😂", "😍", "👍", "❤️", "🔥", "🎉", "🙏", + "😊", "🥰", "😁", "😎", "👏", "🤔", "😢", "😮" +) + +private val StandardEmojiCategories = listOf( + EmojiCategory( + key = "smiles_people", + title = "Смайлы и люди", + icon = "😀", + emojis = listOf( + "😀", "😃", "😄", "😁", "😆", "😅", "😂", "🤣", + "😊", "😇", "🙂", "🙃", "😉", "😌", "😍", "🥰", + "😘", "😗", "😙", "😚", "😋", "😛", "😜", "🤪", + "😝", "🤑", "🤗", "🤭", "🤫", "🤔", "🤐", "🤨", + "😐", "😑", "😶", "😏", "😒", "🙄", "😬", "🤥", + "😌", "😔", "😪", "🤤", "😴", "😷", "🤒", "🤕", + "🤢", "🤮", "🤧", "🥵", "🥶", "🥴", "😵", "🤯", + "🤠", "🥳", "😎", "🤓", "🧐", "😕", "😟", "🙁", + "☹️", "😮", "😯", "😲", "😳", "🥺", "😦", "😧", + "😨", "😰", "😥", "😢", "😭", "😱", "😖", "😣", + "😞", "😓", "😩", "😫", "😤", "😡", "😠", "🤬", + "👍", "👎", "👌", "🤌", "🤏", "✌️", "🤞", "🤟", + "🤘", "🤙", "👈", "👉", "👆", "👇", "☝️", "👋", + "🤚", "🖐️", "✋", "🖖", "👏", "🙌", "👐", "🤲", + "🙏", "✍️", "💪", "🦾", "🧠", "👀", "👂", "👃" + ) + ), + EmojiCategory( + key = "animals_nature", + title = "Животные и природа", + icon = "🌿", + emojis = listOf( + "🐶", "🐱", "🐭", "🐹", "🐰", "🦊", "🐻", "🐼", + "🐨", "🐯", "🦁", "🐮", "🐷", "🐸", "🐵", "🙈", + "🙉", "🙊", "🐒", "🐔", "🐧", "🐦", "🐤", "🦆", + "🦅", "🦉", "🦇", "🐺", "🐗", "🐴", "🦄", "🐝", + "🪲", "🦋", "🐌", "🐞", "🐜", "🪰", "🪱", "🦗", + "🕷️", "🦂", "🐢", "🐍", "🦎", "🦖", "🦕", "🐙", + "🦑", "🦐", "🦞", "🦀", "🐡", "🐠", "🐟", "🐬", + "🐳", "🐋", "🦈", "🐊", "🐅", "🐆", "🦓", "🦍", + "🦧", "🐘", "🦛", "🦏", "🐪", "🐫", "🦒", "🦘", + "🌵", "🎄", "🌲", "🌳", "🌴", "🪵", "🌱", "🌿", + "☘️", "🍀", "🎍", "🪴", "🎋", "🍃", "🍂", "🍁", + "🌾", "🌺", "🌻", "🌹", "🥀", "🌷", "🌼", "🌸", + "💐", "🍄", "🌰", "🌍", "🌎", "🌏", "🌕", "🌙", + "⭐", "🌟", "✨", "⚡", "🔥", "🌈", "☀️", "☁️", + "⛄", "❄️", "💧", "🌊" + ) + ), + EmojiCategory( + key = "food_drinks", + title = "Еда и напитки", + icon = "🍔", + emojis = listOf( + "🍏", "🍎", "🍐", "🍊", "🍋", "🍌", "🍉", "🍇", + "🍓", "🫐", "🍈", "🍒", "🍑", "🥭", "🍍", "🥥", + "🥝", "🍅", "🍆", "🥑", "🥦", "🥬", "🥒", "🌶️", + "🫑", "🌽", "🥕", "🫒", "🧄", "🧅", "🥔", "🍠", + "🥐", "🥯", "🍞", "🥖", "🥨", "🧀", "🥚", "🍳", + "🧈", "🥞", "🧇", "🥓", "🥩", "🍗", "🍖", "🌭", + "🍔", "🍟", "🍕", "🫓", "🥪", "🥙", "🧆", "🌮", + "🌯", "🫔", "🥗", "🥘", "🫕", "🥫", "🍝", "🍜", + "🍲", "🍛", "🍣", "🍱", "🥟", "🦪", "🍤", "🍙", + "🍚", "🍘", "🍥", "🥠", "🥮", "🍢", "🍡", "🍧", + "🍨", "🍦", "🥧", "🧁", "🍰", "🎂", "🍮", "🍭", + "🍬", "🍫", "🍿", "🍩", "🍪", "🌰", "🥜", "🍯", + "🥛", "🍼", "☕", "🫖", "🍵", "🧃", "🥤", "🧋", + "🍶", "🍺", "🍻", "🥂", "🍷", "🥃", "🍸", "🍹" + ) + ), + EmojiCategory( + key = "activities", + title = "Занятия", + icon = "⚽", + emojis = listOf( + "⚽", "🏀", "🏈", "⚾", "🥎", "🎾", "🏐", "🏉", + "🥏", "🎱", "🪀", "🏓", "🏸", "🏒", "🏑", "🥍", + "🏏", "🪃", "🥅", "⛳", "🪁", "🏹", "🎣", "🤿", + "🥊", "🥋", "🎽", "🛹", "🛼", "🛷", "⛸️", "🥌", + "🎿", "⛷️", "🏂", "🪂", "🏋️", "🤼", "🤸", "⛹️", + "🤺", "🤾", "🏌️", "🏇", "🧘", "🏄", "🏊", "🤽", + "🚣", "🧗", "🚵", "🚴", "🏆", "🥇", "🥈", "🥉", + "🏅", "🎖️", "🏵️", "🎗️", "🎫", "🎟️", "🎪", "🤹", + "🎭", "🩰", "🎨", "🎬", "🎤", "🎧", "🎼", "🎹", + "🥁", "🪘", "🎷", "🎺", "🪗", "🎸", "🪕", "🎻", + "🎲", "♟️", "🎯", "🎳", "🎮", "🎰", "🧩" + ) + ), + EmojiCategory( + key = "travel_places", + title = "Места и путешествия", + icon = "✈️", + emojis = listOf( + "🚗", "🚕", "🚙", "🚌", "🚎", "🏎️", "🚓", "🚑", + "🚒", "🚐", "🛻", "🚚", "🚛", "🚜", "🛵", "🏍️", + "🛺", "🚲", "🛴", "🚏", "🛣️", "🛤️", "🛢️", "⛽", + "🚨", "🚥", "🚦", "🛑", "🚧", "⚓", "⛵", "🛶", + "🚤", "🛳️", "⛴️", "🚢", "✈️", "🛩️", "🛫", "🛬", + "🪂", "💺", "🚁", "🚟", "🚠", "🚡", "🛰️", "🚀", + "🛸", "🛎️", "🧳", "⌛", "⏳", "⌚", "⏰", "⏱️", + "🗺️", "🗿", "🗽", "🗼", "🏰", "🏯", "🏟️", "🎡", + "🎢", "🎠", "⛲", "⛱️", "🏖️", "🏝️", "🏜️", "🌋", + "⛰️", "🏔️", "🗻", "🏕️", "⛺", "🏠", "🏡", "🏘️", + "🏚️", "🏗️", "🏭", "🏢", "🏬", "🏣", "🏤", "🏥", + "🏦", "🏨", "🏪", "🏫", "🏩", "💒", "🏛️", "⛪", + "🕌", "🛕", "🕍", "⛩️", "🕋" + ) + ), + EmojiCategory( + key = "objects", + title = "Предметы", + icon = "💡", + emojis = listOf( + "⌚", "📱", "📲", "💻", "⌨️", "🖥️", "🖨️", "🖱️", + "🖲️", "🕹️", "🗜️", "💽", "💾", "💿", "📀", "📼", + "📷", "📸", "📹", "🎥", "📽️", "🎞️", "📞", "☎️", + "📟", "📠", "📺", "📻", "🎙️", "🎚️", "🎛️", "🧭", + "⏱️", "⏲️", "⏰", "🕰️", "⌛", "⏳", "📡", "🔋", + "🔌", "💡", "🔦", "🕯️", "🪔", "🧯", "🛢️", "💸", + "💵", "💴", "💶", "💷", "🪙", "💰", "💳", "💎", + "⚖️", "🪜", "🧰", "🪛", "🔧", "🔨", "⚒️", "🛠️", + "⛏️", "🪚", "🔩", "⚙️", "🪤", "🧱", "⛓️", "🧲", + "🔫", "💣", "🧨", "🪓", "🔪", "🗡️", "⚔️", "🛡️", + "🚬", "⚰️", "🪦", "⚱️", "🏺", "🔮", "📿", "🧿", + "💈", "⚗️", "🔭", "🔬", "🕳️", "🩹", "🩺", "💊", + "💉", "🩸", "🧬", "🦠", "🧫", "🧪", "🌡️", "🧹", + "🧺", "🧻", "🚽", "🚰", "🚿", "🛁", "🪒", "🧴", + "🧷", "🧵", "🪡", "🧶", "👓", "🕶️", "🥽", "🥼", + "🦺", "👔", "👕", "👖", "🧣", "🧤", "🧥", "🧦", + "👗", "👘", "🥻", "🩱", "🩲", "🩳", "👙", "👚", + "👛", "👜", "👝", "🛍️", "🎒", "🩴", "👞", "👟" + ) + ), + EmojiCategory( + key = "symbols", + title = "Символы", + icon = "❤️", + emojis = listOf( + "❤️", "🧡", "💛", "💚", "💙", "💜", "🖤", "🤍", + "🤎", "💔", "❣️", "💕", "💞", "💓", "💗", "💖", + "💘", "💝", "💟", "☮️", "✝️", "☪️", "🕉️", "☸️", + "✡️", "🔯", "🕎", "☯️", "☦️", "🛐", "⛎", "♈", + "♉", "♊", "♋", "♌", "♍", "♎", "♏", "♐", + "♑", "♒", "♓", "🆔", "⚛️", "🉑", "☢️", "☣️", + "📴", "📳", "🈶", "🈚", "🈸", "🈺", "🈷️", "✴️", + "🆚", "💮", "🉐", "㊙️", "㊗️", "🈴", "🈵", "🈹", + "🈲", "🅰️", "🅱️", "🆎", "🆑", "🅾️", "🆘", "❌", + "⭕", "🛑", "⛔", "📛", "🚫", "💯", "💢", "♨️", + "🚷", "🚯", "🚳", "🚱", "🔞", "📵", "🚭", "❗", + "❕", "❓", "❔", "‼️", "⁉️", "🔅", "🔆", "〽️", + "⚠️", "🚸", "🔱", "⚜️", "🔰", "♻️", "✅", "🈯", + "💹", "❇️", "✳️", "❎", "🌐", "💠", "Ⓜ️", "🌀", + "💤", "🏧", "🚾", "♿", "🅿️", "🛗", "🈳", "🈂️", + "🔵", "🔴", "🟠", "🟡", "🟢", "🟣", "⚫", "⚪", + "🟤", "🔶", "🔷", "🔸", "🔹", "🔺", "🔻", "💬" + ) + ), + EmojiCategory( + key = "flags", + title = "Флаги", + icon = "🏳️", + emojis = listOf( + "🏳️", "🏴", "🏁", "🚩", "🇷🇺", "🇺🇸", "🇬🇧", "🇩🇪", + "🇫🇷", "🇮🇹", "🇪🇸", "🇵🇹", "🇳🇱", "🇧🇪", "🇨🇭", "🇦🇹", + "🇵🇱", "🇨🇿", "🇸🇰", "🇭🇺", "🇷🇴", "🇧🇬", "🇬🇷", "🇹🇷", + "🇺🇦", "🇧🇾", "🇰🇿", "🇬🇪", "🇦🇲", "🇦🇿", "🇨🇳", "🇯🇵", + "🇰🇷", "🇮🇳", "🇮🇩", "🇹🇭", "🇻🇳", "🇦🇺", "🇳🇿", "🇨🇦", + "🇲🇽", "🇧🇷", "🇦🇷", "🇨🇱", "🇿🇦", "🇪🇬", "🇸🇦", "🇦🇪", + "🇮🇱", "🇮🇷" + ) + ) +) + +internal fun emojiPickerCategories(frequentEmojis: List<String>): List<EmojiCategory> = + listOf( + EmojiCategory( + key = "frequent", + title = "Частые", + icon = "🕘", + emojis = frequentEmojis.ifEmpty { DefaultFrequentEmojis } + ) + ) + StandardEmojiCategories + +internal fun loadFrequentEmojis(context: Context): List<String> { + val value = context.getSharedPreferences(EmojiPrefsName, Context.MODE_PRIVATE) + .getString(FrequentEmojiKey, null) + val stored = value + ?.split(EmojiSeparator) + ?.map { it.trim() } + ?.filter { it.isNotEmpty() } + ?.distinct() + ?.take(MaxFrequentEmoji) + .orEmpty() + return stored.ifEmpty { DefaultFrequentEmojis } +} + +internal fun storeFrequentEmoji(context: Context, current: List<String>, emoji: String): List<String> { + val updated = listOf(emoji) + .plus(current) + .distinct() + .take(MaxFrequentEmoji) + context.getSharedPreferences(EmojiPrefsName, Context.MODE_PRIVATE) + .edit() + .putString(FrequentEmojiKey, updated.joinToString(EmojiSeparator)) + .apply() + return updated +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/chatinfo/ChatInfoScreen.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/chatinfo/ChatInfoScreen.kt new file mode 100644 index 00000000..36d36ead --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/chatinfo/ChatInfoScreen.kt @@ -0,0 +1,261 @@ +package com.seven.ikar.kotlin.feature.chatinfo + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.WindowInsetsSides +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.only +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.safeDrawing +import androidx.compose.foundation.layout.windowInsetsPadding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.Checkbox +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import com.seven.ikar.kotlin.core.model.ChatInviteLinkDto +import com.seven.ikar.kotlin.core.model.ChatTopicDto +import com.seven.ikar.kotlin.core.model.ChatType +import com.seven.ikar.kotlin.ui.IkarRowDivider +import com.seven.ikar.kotlin.ui.IkarScreenSurface +import com.seven.ikar.kotlin.ui.IkarSearchCard +import com.seven.ikar.kotlin.ui.IkarSectionCard +import com.seven.ikar.kotlin.ui.IkarSectionTitle +import com.seven.ikar.kotlin.ui.IkarSimpleHeader +import com.seven.ikar.kotlin.ui.theme.TelegramBlue +import com.seven.ikar.kotlin.ui.theme.TelegramDanger +import com.seven.ikar.kotlin.ui.theme.TelegramInkMuted + +@Composable +fun ChatInfoScreen( + state: ChatInfoUiState, + onBackClick: () -> Unit, + onRefreshClick: () -> Unit, + onMembersClick: () -> Unit, + onSearchClick: () -> Unit, + onInviteTitleChanged: (String) -> Unit, + onInviteJoinRequestChanged: (Boolean) -> Unit, + onCreateInviteClick: () -> Unit, + onRevokeInviteClick: (ChatInviteLinkDto) -> Unit, + onTopicTitleChanged: (String) -> Unit, + onCreateTopicClick: () -> Unit +) { + val info = state.info + IkarScreenSurface(modifier = Modifier.fillMaxSize()) { + Column( + modifier = Modifier + .fillMaxSize() + .windowInsetsPadding(WindowInsets.safeDrawing.only(WindowInsetsSides.Vertical)) + .verticalScroll(rememberScrollState()) + .padding(horizontal = 18.dp, vertical = 16.dp), + verticalArrangement = Arrangement.spacedBy(16.dp) + ) { + IkarSimpleHeader( + title = info?.chat?.title?.ifBlank { "Информация о чате" } ?: "Информация о чате", + onBackClick = onBackClick + ) + + state.errorMessage?.let { + Text(it, color = TelegramDanger, style = MaterialTheme.typography.bodySmall) + } + if (state.isLoading && info == null) { + CircularProgressIndicator(color = TelegramBlue) + } + + if (info != null) { + IkarSectionCard { + IkarSectionTitle("Обзор", modifier = Modifier.padding(bottom = 8.dp)) + Text(info.chat.type.label(), style = MaterialTheme.typography.bodyMedium, color = TelegramInkMuted) + Text(info.channelAudienceText(), style = MaterialTheme.typography.titleMedium) + if (info.chat.type == ChatType.Channel && info.adminCount > 0) { + Text("${info.adminCount} ${russianPlural(info.adminCount, "администратор", "администратора", "администраторов")}", style = MaterialTheme.typography.bodySmall, color = TelegramInkMuted) + } + val description = info.description ?: info.chat.description + if (!description.isNullOrBlank()) { + Text(description, style = MaterialTheme.typography.bodyMedium) + } + if (!info.publicUsername.isNullOrBlank()) { + Text("@${info.publicUsername}", color = TelegramBlue) + } + Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) { + TextButton(onClick = onMembersClick) { Text("Участники") } + TextButton(onClick = onSearchClick) { Text("Поиск") } + TextButton(onClick = onRefreshClick) { Text("Обновить") } + } + } + + IkarSectionCard { + IkarSectionTitle("Общие материалы", modifier = Modifier.padding(bottom = 8.dp)) + InfoStatRow("Медиа", info.mediaCount) + InfoStatRow("Файлы", info.fileCount) + InfoStatRow("Ссылки", info.linkCount) + InfoStatRow("Голосовые", info.voiceCount) + InfoStatRow("Закреплённые", info.pinnedCount) + } + + IkarSectionCard { + IkarSectionTitle("Пригласительные ссылки", modifier = Modifier.padding(bottom = 8.dp)) + IkarSearchCard( + value = state.inviteTitle, + onValueChange = onInviteTitleChanged, + placeholder = "Название ссылки" + ) + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.spacedBy(8.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Checkbox( + checked = state.inviteCreatesJoinRequest, + onCheckedChange = onInviteJoinRequestChanged, + enabled = !state.isSaving + ) + Column(modifier = Modifier.weight(1f)) { + Text("Требовать одобрение администратора", style = MaterialTheme.typography.bodyMedium) + Text( + "Новые пользователи попадут в заявки на вступление, а не войдут сразу.", + style = MaterialTheme.typography.bodySmall, + color = TelegramInkMuted + ) + } + } + TextButton(enabled = !state.isSaving, onClick = onCreateInviteClick) { + Text(if (state.isSaving) "Сохранение..." else "Создать ссылку") + } + if (info.inviteLinks.isEmpty()) { + Text("Пригласительных ссылок пока нет.", style = MaterialTheme.typography.bodySmall, color = TelegramInkMuted) + } + info.inviteLinks.forEachIndexed { index, link -> + InviteLinkRow(link = link, onRevokeClick = { onRevokeInviteClick(link) }) + if (index != info.inviteLinks.lastIndex) { + IkarRowDivider() + } + } + } + + IkarSectionCard { + IkarSectionTitle("Темы", modifier = Modifier.padding(bottom = 8.dp)) + IkarSearchCard( + value = state.topicTitle, + onValueChange = onTopicTitleChanged, + placeholder = "Новая тема" + ) + TextButton(enabled = !state.isSaving, onClick = onCreateTopicClick) { + Text(if (state.isSaving) "Сохранение..." else "Создать тему") + } + info.topics.forEachIndexed { index, topic -> + TopicRow(topic) + if (index != info.topics.lastIndex) { + IkarRowDivider() + } + } + } + } + } + } +} + +@Composable +private fun InfoStatRow(label: String, value: Int) { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + Text(label, style = MaterialTheme.typography.bodyMedium) + Text(value.toString(), style = MaterialTheme.typography.titleMedium, color = TelegramBlue) + } +} + +@Composable +private fun InviteLinkRow( + link: ChatInviteLinkDto, + onRevokeClick: () -> Unit +) { + Column( + modifier = Modifier.padding(vertical = 10.dp), + verticalArrangement = Arrangement.spacedBy(4.dp) + ) { + Text(link.title ?: "Пригласительная ссылка", style = MaterialTheme.typography.titleMedium) + Text( + text = link.link, + style = MaterialTheme.typography.bodySmall, + color = if (link.isRevoked) TelegramInkMuted else TelegramBlue, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + Text( + text = when { + link.isRevoked -> "Отозвана" + link.createsJoinRequest -> "Требует одобрения" + else -> "Мгновенный вход" + }, + style = MaterialTheme.typography.bodySmall, + color = if (link.isRevoked) TelegramDanger else TelegramInkMuted + ) + if (!link.isRevoked) { + TextButton(onClick = onRevokeClick) { Text("Отозвать") } + } + } +} + +@Composable +private fun TopicRow(topic: ChatTopicDto) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 10.dp), + horizontalArrangement = Arrangement.spacedBy(10.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Text(topic.icon, style = MaterialTheme.typography.titleLarge) + Column(modifier = Modifier.weight(1f)) { + Text(topic.title, style = MaterialTheme.typography.titleMedium, fontWeight = FontWeight.SemiBold) + Text("${topic.messageCount} сообщений", style = MaterialTheme.typography.bodySmall, color = TelegramInkMuted) + } + } +} + +private fun ChatType.label(): String = when (this) { + ChatType.Direct -> "Личный чат" + ChatType.Group -> "Группа" + ChatType.Channel -> "Канал" +} + +private fun com.seven.ikar.kotlin.core.model.ChatInfoDto.channelAudienceText(): String { + if (chat.type != ChatType.Channel) { + return "${chat.participants.size} участников" + } + + val count = when { + subscriberCount > 0 -> subscriberCount + chat.subscriberCount > 0 -> chat.subscriberCount + else -> chat.participants.size + } + return "$count ${russianPlural(count, "подписчик", "подписчика", "подписчиков")}" +} + +private fun russianPlural(count: Int, one: String, few: String, many: String): String { + val value = kotlin.math.abs(count) % 100 + val lastDigit = value % 10 + if (value in 11..14) { + return many + } + + return when (lastDigit) { + 1 -> one + in 2..4 -> few + else -> many + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/chatinfo/ChatInfoViewModel.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/chatinfo/ChatInfoViewModel.kt new file mode 100644 index 00000000..efe9f57e --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/chatinfo/ChatInfoViewModel.kt @@ -0,0 +1,123 @@ +package com.seven.ikar.kotlin.feature.chatinfo + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.seven.ikar.kotlin.app.AppContainer +import com.seven.ikar.kotlin.core.model.ChatInfoDto +import com.seven.ikar.kotlin.core.model.ChatInviteLinkDto +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch + +data class ChatInfoUiState( + val info: ChatInfoDto? = null, + val inviteTitle: String = "", + val inviteCreatesJoinRequest: Boolean = false, + val topicTitle: String = "", + val isLoading: Boolean = false, + val isSaving: Boolean = false, + val errorMessage: String? = null +) + +class ChatInfoViewModel( + private val container: AppContainer, + private val chatId: String +) : ViewModel() { + private val _uiState = MutableStateFlow(ChatInfoUiState()) + val uiState: StateFlow<ChatInfoUiState> = _uiState.asStateFlow() + + init { + refresh() + } + + fun refresh() { + viewModelScope.launch { + _uiState.value = _uiState.value.copy(isLoading = true, errorMessage = null) + runCatching { + container.executeAuthorized { session -> + container.apiClient.getChatInfo(session.accessToken, chatId) + } + }.onSuccess { info -> + _uiState.value = _uiState.value.copy(info = info, isLoading = false) + }.onFailure { error -> + _uiState.value = _uiState.value.copy(isLoading = false, errorMessage = error.message) + } + } + } + + fun updateInviteTitle(value: String) { + _uiState.value = _uiState.value.copy(inviteTitle = value.take(64)) + } + + fun updateInviteCreatesJoinRequest(value: Boolean) { + _uiState.value = _uiState.value.copy(inviteCreatesJoinRequest = value) + } + + fun updateTopicTitle(value: String) { + _uiState.value = _uiState.value.copy(topicTitle = value.take(80)) + } + + fun createInviteLink() { + val state = _uiState.value + if (state.isSaving) return + viewModelScope.launch { + _uiState.value = _uiState.value.copy(isSaving = true, errorMessage = null) + runCatching { + container.executeAuthorized { session -> + container.apiClient.createChatInviteLink( + accessToken = session.accessToken, + chatId = chatId, + title = state.inviteTitle, + createsJoinRequest = state.inviteCreatesJoinRequest + ) + } + }.onSuccess { + _uiState.value = _uiState.value.copy( + inviteTitle = "", + inviteCreatesJoinRequest = false, + isSaving = false + ) + refresh() + }.onFailure { error -> + _uiState.value = _uiState.value.copy(isSaving = false, errorMessage = error.message) + } + } + } + + fun revokeInviteLink(link: ChatInviteLinkDto) { + if (_uiState.value.isSaving) return + viewModelScope.launch { + _uiState.value = _uiState.value.copy(isSaving = true, errorMessage = null) + runCatching { + container.executeAuthorized { session -> + container.apiClient.revokeChatInviteLink(session.accessToken, chatId, link.id) + } + }.onSuccess { + _uiState.value = _uiState.value.copy(isSaving = false) + refresh() + }.onFailure { error -> + _uiState.value = _uiState.value.copy(isSaving = false, errorMessage = error.message) + } + } + } + + fun createTopic() { + val state = _uiState.value + val title = state.topicTitle.trim() + if (state.isSaving || title.length < 2) return + viewModelScope.launch { + _uiState.value = _uiState.value.copy(isSaving = true, errorMessage = null) + runCatching { + container.executeAuthorized { session -> + container.apiClient.createChatTopic(session.accessToken, chatId, title) + } + }.onSuccess { + _uiState.value = _uiState.value.copy(topicTitle = "", isSaving = false) + refresh() + }.onFailure { error -> + _uiState.value = _uiState.value.copy(isSaving = false, errorMessage = error.message) + } + } + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/chats/ChatsScreen.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/chats/ChatsScreen.kt new file mode 100644 index 00000000..5acbb650 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/chats/ChatsScreen.kt @@ -0,0 +1,1007 @@ +package com.seven.ikar.kotlin.feature.chats + +import androidx.compose.foundation.ExperimentalFoundationApi +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.combinedClickable +import androidx.compose.foundation.border +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.WindowInsetsSides +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.only +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.safeDrawing +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.layout.windowInsetsPadding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.LazyRow +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.lazy.rememberLazyListState +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.outlined.Archive +import androidx.compose.material.icons.outlined.CheckCircle +import androidx.compose.material.icons.outlined.Close +import androidx.compose.material.icons.outlined.Delete +import androidx.compose.material.icons.outlined.Edit +import androidx.compose.material.icons.outlined.Image +import androidx.compose.material.icons.outlined.NotificationsOff +import androidx.compose.material.icons.outlined.PlayArrow +import androidx.compose.material.icons.outlined.PushPin +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.Checkbox +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.input.nestedscroll.NestedScrollConnection +import androidx.compose.ui.input.nestedscroll.NestedScrollSource +import androidx.compose.ui.input.nestedscroll.nestedScroll +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.seven.ikar.kotlin.core.model.AttachmentDto +import com.seven.ikar.kotlin.core.model.AttachmentKind +import com.seven.ikar.kotlin.core.model.ChatSummaryDto +import com.seven.ikar.kotlin.core.model.ChatType +import com.seven.ikar.kotlin.core.model.StoryDto +import com.seven.ikar.kotlin.core.network.ServerConfig +import com.seven.ikar.kotlin.core.settings.ChatListLayoutOption +import com.seven.ikar.kotlin.core.settings.ChatSettingsSnapshot +import com.seven.ikar.kotlin.feature.share.PendingExternalShare +import com.seven.ikar.kotlin.ui.AuthenticatedAsyncImage +import com.seven.ikar.kotlin.ui.AvatarView +import com.seven.ikar.kotlin.ui.IkarFab +import com.seven.ikar.kotlin.ui.IkarFloatingMainMenu +import com.seven.ikar.kotlin.ui.IkarMainMenuTab +import com.seven.ikar.kotlin.ui.IkarRowDivider +import com.seven.ikar.kotlin.ui.IkarScreenSurface +import com.seven.ikar.kotlin.ui.IkarSearchCard +import com.seven.ikar.kotlin.ui.IkarSectionCard +import com.seven.ikar.kotlin.ui.chatPreview +import com.seven.ikar.kotlin.ui.theme.TelegramBlue +import com.seven.ikar.kotlin.ui.theme.TelegramInkMuted + +@Composable +fun ChatsScreen( + state: ChatsUiState, + chatSettings: ChatSettingsSnapshot, + onChatClick: (ChatSummaryDto) -> Unit, + onChatSelectionClick: (ChatSummaryDto) -> Unit, + onChatLongPress: (ChatSummaryDto) -> Unit, + onClearSelection: () -> Unit, + onSendSelectedChatsClick: () -> Unit, + onDismissPendingShare: () -> Unit, + onDeleteSelectedClick: () -> Unit, + onPinSelectedChatsClick: () -> Unit, + onArchiveSelectedChatsClick: () -> Unit, + onMuteSelectedChatsClick: () -> Unit, + onDismissDeleteDialog: () -> Unit, + onDeleteForEveryoneChanged: (Boolean) -> Unit, + onConfirmDeleteSelected: () -> Unit, + onLogoutClick: () -> Unit, + onRefreshClick: () -> Unit, + onProfileClick: () -> Unit, + onContactsClick: () -> Unit, + onDiscoverClick: () -> Unit, + onComposeStoryClick: () -> Unit, + onStoryClick: (StoryDto) -> Unit, + onSettingsClick: () -> Unit, + onNotificationsClick: () -> Unit, + onGlobalSearchClick: () -> Unit, + onQueryChanged: (String) -> Unit +) { + val isRealtimeConnected = !state.isLoading || state.chats.isNotEmpty() + val previewMaxLines = if (chatSettings.chatListLayout == ChatListLayoutOption.ThreeLine) 2 else 1 + val chatListState = rememberLazyListState() + var isStoriesHeaderVisible by remember { mutableStateOf(false) } + var storyHeaderDragOffset by remember { mutableStateOf(0f) } + val canToggleStoriesHeader = !state.isSelectionMode && !state.isShareMode + val storyHeaderDragThresholdPx = with(LocalDensity.current) { 42.dp.toPx() } + + LaunchedEffect(canToggleStoriesHeader) { + if (!canToggleStoriesHeader) { + isStoriesHeaderVisible = false + storyHeaderDragOffset = 0f + } + } + + val storyHeaderNestedScrollConnection = remember( + canToggleStoriesHeader, + chatListState, + storyHeaderDragThresholdPx + ) { + object : NestedScrollConnection { + override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset { + if (!canToggleStoriesHeader || source != NestedScrollSource.UserInput) { + return Offset.Zero + } + + val isChatListAtTop = chatListState.firstVisibleItemIndex == 0 && + chatListState.firstVisibleItemScrollOffset == 0 + when { + available.y > 0f && !isStoriesHeaderVisible && isChatListAtTop -> { + storyHeaderDragOffset += available.y + if (storyHeaderDragOffset >= storyHeaderDragThresholdPx) { + isStoriesHeaderVisible = true + storyHeaderDragOffset = 0f + } + } + + available.y < 0f && isStoriesHeaderVisible -> { + storyHeaderDragOffset += available.y + if (storyHeaderDragOffset <= -storyHeaderDragThresholdPx) { + isStoriesHeaderVisible = false + storyHeaderDragOffset = 0f + } + } + + else -> { + storyHeaderDragOffset = 0f + } + } + + return Offset.Zero + } + } + } + + IkarScreenSurface(modifier = Modifier.fillMaxSize()) { + Column( + modifier = Modifier + .fillMaxSize() + .windowInsetsPadding(WindowInsets.safeDrawing.only(WindowInsetsSides.Vertical)) + .nestedScroll(storyHeaderNestedScrollConnection) + ) { + Column( + modifier = Modifier.padding(start = 18.dp, top = 16.dp, end = 18.dp, bottom = 12.dp), + verticalArrangement = Arrangement.spacedBy(12.dp) + ) { + when { + state.isSelectionMode && state.isShareMode -> { + ShareSelectionHeader( + selectedChatsCount = state.selectedChatsCount, + isSendingShare = state.isSendingShare, + onClearSelection = onClearSelection, + onSendSelectedChatsClick = onSendSelectedChatsClick + ) + } + + state.isSelectionMode -> { + SelectionHeader( + selectedChatsCount = state.selectedChatsCount, + isDeleteEnabled = !state.isDeletingSelected, + onClearSelection = onClearSelection, + onPinSelectedChatsClick = onPinSelectedChatsClick, + onArchiveSelectedChatsClick = onArchiveSelectedChatsClick, + onMuteSelectedChatsClick = onMuteSelectedChatsClick, + onDeleteSelectedClick = onDeleteSelectedClick + ) + } + + else -> { + if (isStoriesHeaderVisible) { + StoriesTray( + stories = state.stories, + accessToken = state.session?.accessToken, + currentUserId = state.session?.user?.id, + onComposeStoryClick = onComposeStoryClick, + onStoryClick = onStoryClick + ) + } else { + ChatsBrandHeader( + isRealtimeConnected = isRealtimeConnected, + stories = state.stories, + accessToken = state.session?.accessToken, + currentUserId = state.session?.user?.id, + onStoriesClick = { isStoriesHeaderVisible = true } + ) + } + } + } + + IkarSearchCard( + value = state.query, + onValueChange = onQueryChanged, + placeholder = "Поиск чатов" + ) + + TextButton(onClick = onGlobalSearchClick) { + Text("Глобальный поиск: сообщения, медиа, файлы и ссылки") + } + + state.pendingShare?.let { pendingShare -> + PendingShareCard( + pendingShare = pendingShare, + isSendingShare = state.isSendingShare, + onDismiss = onDismissPendingShare + ) + } + + state.errorMessage?.let { + Text(it, color = MaterialTheme.colorScheme.error, style = MaterialTheme.typography.bodySmall) + } + } + + Box(modifier = Modifier.weight(1f).fillMaxWidth()) { + LazyColumn( + state = chatListState, + modifier = Modifier.fillMaxSize(), + verticalArrangement = Arrangement.spacedBy(0.dp) + ) { + if (state.chats.isEmpty()) { + item { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 24.dp, vertical = 48.dp), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(8.dp) + ) { + Text("Пока нет чатов", style = MaterialTheme.typography.headlineMedium) + Text( + if (state.isShareMode) { + "Поделиться пока некуда: сначала создайте хотя бы один чат." + } else { + "Найдите пользователя или откройте новый чат." + }, + color = TelegramInkMuted, + style = MaterialTheme.typography.bodyMedium + ) + } + } + } else { + items(state.chats, key = { it.chat.id }) { chatItem -> + ChatListRow( + chatItem = chatItem, + currentUserId = state.session?.user?.id, + accessToken = state.session?.accessToken, + previewMaxLines = previewMaxLines, + onClick = { + if (state.isSelectionMode) { + onChatSelectionClick(chatItem.chat) + } else { + onChatClick(chatItem.chat) + } + }, + onLongClick = { onChatLongPress(chatItem.chat) } + ) + } + } + item { Box(modifier = Modifier.padding(bottom = 132.dp)) } + } + + if (!state.isSelectionMode && !state.isShareMode) { + IkarFab( + icon = Icons.Outlined.Edit, + contentDescription = "Новое сообщение", + modifier = Modifier + .align(Alignment.BottomEnd) + .padding(end = 20.dp, bottom = 126.dp), + onClick = onDiscoverClick + ) + } + } + } + + IkarFloatingMainMenu( + selectedTab = IkarMainMenuTab.Chats, + modifier = Modifier + .align(Alignment.BottomCenter) + .padding(horizontal = 8.dp, vertical = 18.dp), + onChatsClick = {}, + onContactsClick = onContactsClick, + onSettingsClick = onSettingsClick, + onProfileClick = onProfileClick + ) + + if (state.isDeleteDialogVisible) { + DeleteChatsDialog( + selectedChatsCount = state.selectedChatsCount, + showDeleteForEveryoneOption = state.showDeleteForEveryoneOption, + deleteForEveryone = state.deleteForEveryone, + isDeletingSelected = state.isDeletingSelected, + onDismiss = onDismissDeleteDialog, + onDeleteForEveryoneChanged = onDeleteForEveryoneChanged, + onConfirmDeleteSelected = onConfirmDeleteSelected + ) + } + } +} + +@Composable +private fun ChatsBrandHeader( + isRealtimeConnected: Boolean, + stories: List<StoryDto>, + accessToken: String?, + currentUserId: String?, + onStoriesClick: () -> Unit +) { + Row( + horizontalArrangement = Arrangement.spacedBy(12.dp), + verticalAlignment = Alignment.CenterVertically + ) { + StoriesClusterButton( + stories = stories, + accessToken = accessToken, + currentUserId = currentUserId, + onClick = onStoriesClick + ) + Column(verticalArrangement = Arrangement.spacedBy(0.dp)) { + Text( + text = if (isRealtimeConnected) "ИКАР" else "Соединение...", + style = MaterialTheme.typography.displayMedium.copy( + letterSpacing = if (isRealtimeConnected) 3.sp else 0.sp + ), + color = TelegramBlue + ) + Text("Чаты", style = MaterialTheme.typography.bodySmall, color = TelegramInkMuted) + } + } +} + +@Composable +private fun StoriesClusterButton( + stories: List<StoryDto>, + accessToken: String?, + currentUserId: String?, + onClick: () -> Unit +) { + val previewStories = stories.take(3) + val placeholderColors = listOf( + TelegramBlue, + Color(0xFF7C4DFF), + Color(0xFF00A884) + ) + + Box( + modifier = Modifier + .width(58.dp) + .height(36.dp) + .clickable(onClick = onClick), + contentAlignment = Alignment.CenterStart + ) { + repeat(3) { index -> + val story = previewStories.getOrNull(index) + Box( + modifier = Modifier + .padding(start = (index * 13).dp) + .size(30.dp) + .clip(CircleShape) + .background(placeholderColors[index].copy(alpha = if (story == null) 0.18f else 1f)) + .border(2.dp, Color.White, CircleShape) + .padding(2.dp) + .clip(CircleShape), + contentAlignment = Alignment.Center + ) { + if (story != null) { + val title = if (story.author.id == currentUserId) "Моя" else story.author.displayName + val previewUrl = ServerConfig.normalizeMediaUrl( + story.attachments.firstOrNull { it.contentType.startsWith("image/", ignoreCase = true) }?.downloadPath + ) + if (previewUrl != null) { + AuthenticatedAsyncImage( + imageUrl = previewUrl, + accessToken = accessToken, + contentDescription = title, + modifier = Modifier.fillMaxSize(), + contentScale = ContentScale.Crop + ) + } else { + AvatarView( + imageUrl = ServerConfig.normalizeMediaUrl(story.author.avatarPath), + title = title, + accessToken = accessToken, + size = 26.dp + ) + } + } + } + } + } +} + +@Composable +private fun StoriesTray( + stories: List<StoryDto>, + accessToken: String?, + currentUserId: String?, + onComposeStoryClick: () -> Unit, + onStoryClick: (StoryDto) -> Unit +) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(bottom = 2.dp), + verticalArrangement = Arrangement.spacedBy(0.dp) + ) { + LazyRow( + horizontalArrangement = Arrangement.spacedBy(12.dp), + modifier = Modifier.fillMaxWidth() + ) { + item { + StoryBubble( + title = "Моя", + avatarUrl = null, + previewUrl = null, + accessToken = accessToken, + viewed = false, + onClick = onComposeStoryClick, + modifier = Modifier.padding(start = 18.dp) + ) + } + + items(stories, key = { it.id }) { story -> + StoryBubble( + title = if (story.author.id == currentUserId) "Моя" else story.author.displayName, + avatarUrl = ServerConfig.normalizeMediaUrl(story.author.avatarPath), + previewUrl = ServerConfig.normalizeMediaUrl( + story.attachments.firstOrNull { it.contentType.startsWith("image/") }?.downloadPath + ), + accessToken = accessToken, + viewed = story.viewedByMe || story.author.id == currentUserId, + onClick = { onStoryClick(story) } + ) + } + + item { + Spacer(modifier = Modifier.width(6.dp)) + } + } + } +} + +@Composable +private fun StoryBubble( + title: String, + avatarUrl: String?, + previewUrl: String?, + accessToken: String?, + viewed: Boolean, + onClick: () -> Unit, + modifier: Modifier = Modifier +) { + Column( + modifier = modifier + .width(74.dp) + .clickable(onClick = onClick), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(6.dp) + ) { + Box( + modifier = Modifier + .size(62.dp) + .clip(CircleShape) + .border( + width = 2.dp, + color = if (viewed) Color(0xFFD8DEE6) else TelegramBlue, + shape = CircleShape + ) + .padding(3.dp) + .clip(CircleShape), + contentAlignment = Alignment.Center + ) { + if (previewUrl != null) { + AuthenticatedAsyncImage( + imageUrl = previewUrl, + accessToken = accessToken, + contentDescription = title, + modifier = Modifier.fillMaxSize(), + contentScale = androidx.compose.ui.layout.ContentScale.Crop + ) + } else { + AvatarView( + imageUrl = avatarUrl, + title = title, + accessToken = accessToken, + size = 56.dp + ) + } + } + Text( + title, + style = MaterialTheme.typography.bodySmall, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + } +} + +@Composable +private fun ShareSelectionHeader( + selectedChatsCount: Int, + isSendingShare: Boolean, + onClearSelection: () -> Unit, + onSendSelectedChatsClick: () -> Unit +) { + Row( + modifier = Modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(14.dp) + ) { + Icon( + imageVector = Icons.Outlined.Close, + contentDescription = "Снять выделение", + tint = TelegramInkMuted, + modifier = Modifier.clickable(enabled = !isSendingShare, onClick = onClearSelection) + ) + + Column( + modifier = Modifier.weight(1f), + verticalArrangement = Arrangement.spacedBy(2.dp) + ) { + Text( + text = selectionCountLabel(selectedChatsCount), + style = MaterialTheme.typography.titleLarge, + fontWeight = FontWeight.SemiBold + ) + Text( + text = "Можно отправить в выбранные чаты", + style = MaterialTheme.typography.bodySmall, + color = TelegramInkMuted + ) + } + + TextButton( + enabled = !isSendingShare, + onClick = onSendSelectedChatsClick + ) { + Text( + text = if (isSendingShare) "Отправка..." else "Отправить", + color = if (isSendingShare) TelegramInkMuted else TelegramBlue + ) + } + } +} + +@Composable +private fun SelectionHeader( + selectedChatsCount: Int, + isDeleteEnabled: Boolean, + onClearSelection: () -> Unit, + onPinSelectedChatsClick: () -> Unit, + onArchiveSelectedChatsClick: () -> Unit, + onMuteSelectedChatsClick: () -> Unit, + onDeleteSelectedClick: () -> Unit +) { + Row( + modifier = Modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(14.dp) + ) { + Icon( + imageVector = Icons.Outlined.Close, + contentDescription = "Снять выделение", + tint = TelegramInkMuted, + modifier = Modifier.clickable(onClick = onClearSelection) + ) + + Column( + modifier = Modifier.weight(1f), + verticalArrangement = Arrangement.spacedBy(2.dp) + ) { + Text( + text = selectionCountLabel(selectedChatsCount), + style = MaterialTheme.typography.titleLarge, + fontWeight = FontWeight.SemiBold + ) + Text( + text = "Можно удалить выбранные чаты", + style = MaterialTheme.typography.bodySmall, + color = TelegramInkMuted + ) + } + + Icon( + imageVector = Icons.Outlined.PushPin, + contentDescription = "Закрепить выбранные чаты", + tint = TelegramBlue, + modifier = Modifier.clickable(onClick = onPinSelectedChatsClick) + ) + + Icon( + imageVector = Icons.Outlined.Archive, + contentDescription = "Архивировать выбранные чаты", + tint = TelegramBlue, + modifier = Modifier.clickable(onClick = onArchiveSelectedChatsClick) + ) + + Icon( + imageVector = Icons.Outlined.NotificationsOff, + contentDescription = "Отключить уведомления в выбранных чатах", + tint = TelegramBlue, + modifier = Modifier.clickable(onClick = onMuteSelectedChatsClick) + ) + + Icon( + imageVector = Icons.Outlined.Delete, + contentDescription = "Удалить выбранные чаты", + tint = if (isDeleteEnabled) MaterialTheme.colorScheme.error else TelegramInkMuted, + modifier = Modifier.clickable(enabled = isDeleteEnabled, onClick = onDeleteSelectedClick) + ) + } +} + +@Composable +private fun PendingShareCard( + pendingShare: PendingExternalShare, + isSendingShare: Boolean, + onDismiss: () -> Unit +) { + IkarSectionCard { + Column(verticalArrangement = Arrangement.spacedBy(8.dp)) { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.spacedBy(12.dp), + verticalAlignment = Alignment.Top + ) { + Column( + modifier = Modifier.weight(1f), + verticalArrangement = Arrangement.spacedBy(2.dp) + ) { + Text( + text = if (isSendingShare) "Отправка..." else "Будет отправлено", + style = MaterialTheme.typography.labelLarge, + color = TelegramBlue + ) + Text( + text = if (isSendingShare) { + "Подождите, отправка уже выполняется." + } else { + "Коснитесь чата, чтобы отправить сразу. Удерживайте, чтобы выбрать несколько." + }, + style = MaterialTheme.typography.bodySmall, + color = TelegramInkMuted + ) + } + Icon( + imageVector = Icons.Outlined.Close, + contentDescription = "Отменить поделиться", + tint = TelegramInkMuted, + modifier = Modifier.clickable(enabled = !isSendingShare, onClick = onDismiss) + ) + } + + pendingShare.text?.takeIf { it.isNotBlank() }?.let { sharedText -> + Text( + text = sharedText, + style = MaterialTheme.typography.bodyMedium, + maxLines = 3, + overflow = TextOverflow.Ellipsis + ) + } + + if (pendingShare.attachments.isNotEmpty()) { + Text( + text = pendingShareAttachmentSummary(pendingShare), + style = MaterialTheme.typography.bodySmall, + color = TelegramInkMuted + ) + pendingShare.attachments.take(3).forEach { attachment -> + Text( + text = attachment.fileName, + style = MaterialTheme.typography.bodyMedium, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + } + } + } + } +} + +@Composable +private fun DeleteChatsDialog( + selectedChatsCount: Int, + showDeleteForEveryoneOption: Boolean, + deleteForEveryone: Boolean, + isDeletingSelected: Boolean, + onDismiss: () -> Unit, + onDeleteForEveryoneChanged: (Boolean) -> Unit, + onConfirmDeleteSelected: () -> Unit +) { + AlertDialog( + onDismissRequest = { + if (!isDeletingSelected) { + onDismiss() + } + }, + title = { + Text(deleteDialogTitle(selectedChatsCount)) + }, + text = { + Column(verticalArrangement = Arrangement.spacedBy(12.dp)) { + Text( + text = deleteDialogMessage(selectedChatsCount), + color = TelegramInkMuted + ) + if (showDeleteForEveryoneOption) { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(10.dp) + ) { + Checkbox( + checked = deleteForEveryone, + enabled = !isDeletingSelected, + onCheckedChange = onDeleteForEveryoneChanged + ) + Text( + text = "Также удалить чат для собеседника", + style = MaterialTheme.typography.bodyMedium + ) + } + } + } + }, + confirmButton = { + TextButton( + enabled = !isDeletingSelected, + onClick = onConfirmDeleteSelected + ) { + Text("Удалить", color = MaterialTheme.colorScheme.error) + } + }, + dismissButton = { + TextButton( + enabled = !isDeletingSelected, + onClick = onDismiss + ) { + Text("Отмена") + } + } + ) +} + +@Composable +@OptIn(ExperimentalFoundationApi::class) +private fun ChatListRow( + chatItem: ChatListItemUiState, + currentUserId: String?, + accessToken: String?, + previewMaxLines: Int, + onClick: () -> Unit, + onLongClick: () -> Unit +) { + val chat = chatItem.chat + val avatarUser = if (chat.type == ChatType.Direct) { + chat.participants.firstOrNull { it.id != currentUserId } ?: chat.participants.firstOrNull() + } else { + null + } + val avatarUrl = ServerConfig.normalizeMediaUrl(avatarUser?.avatarPath) + val rowBackground = if (chatItem.isSelected) { + TelegramBlue.copy(alpha = 0.12f) + } else { + Color.Transparent + } + + Column { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 8.dp, vertical = 2.dp) + .clip(MaterialTheme.shapes.large) + .background(rowBackground) + .combinedClickable(onClick = onClick, onLongClick = onLongClick) + .padding(horizontal = 8.dp, vertical = 10.dp), + horizontalArrangement = Arrangement.spacedBy(14.dp), + verticalAlignment = Alignment.CenterVertically + ) { + AvatarView( + imageUrl = avatarUrl, + title = chatItem.resolvedTitle, + size = 56.dp + ) + + Column( + modifier = Modifier.weight(1f), + verticalArrangement = Arrangement.spacedBy(3.dp) + ) { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.spacedBy(12.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = chatItem.resolvedTitle, + modifier = Modifier.weight(1f), + style = MaterialTheme.typography.titleLarge, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + if (chatItem.lastActivityLabel.isNotBlank()) { + Text( + text = chatItem.lastActivityLabel, + style = MaterialTheme.typography.bodySmall, + color = TelegramInkMuted, + maxLines = 1 + ) + } + } + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.spacedBy(8.dp), + verticalAlignment = Alignment.CenterVertically + ) { + ChatLastMessagePreview( + chat = chat, + accessToken = accessToken, + modifier = Modifier.weight(1f), + maxLines = previewMaxLines + ) + if (chat.unreadCount > 0) { + Box( + modifier = Modifier + .background(TelegramBlue, CircleShape) + .padding(horizontal = 8.dp, vertical = 4.dp), + contentAlignment = Alignment.Center + ) { + Text( + text = chat.unreadCount.toString(), + color = Color.White, + style = MaterialTheme.typography.labelMedium, + fontWeight = FontWeight.SemiBold, + maxLines = 1 + ) + } + } + } + } + + if (chatItem.isSelected) { + Spacer(modifier = Modifier.width(4.dp)) + Icon( + imageVector = Icons.Outlined.CheckCircle, + contentDescription = "Чат выбран", + tint = TelegramBlue + ) + } + } + IkarRowDivider(startIndent = 86.dp) + } +} + +@Composable +private fun ChatLastMessagePreview( + chat: ChatSummaryDto, + accessToken: String?, + modifier: Modifier = Modifier, + maxLines: Int +) { + val attachment = chat.lastMessageAttachment + when { + attachment?.isChatPreviewImage() == true -> { + Row( + modifier = modifier, + horizontalArrangement = Arrangement.spacedBy(6.dp), + verticalAlignment = Alignment.CenterVertically + ) { + val imageUrl = ServerConfig.normalizeMediaUrl(attachment.downloadPath) + Box( + modifier = Modifier + .size(18.dp) + .clip(RoundedCornerShape(4.dp)) + .background(TelegramBlue.copy(alpha = 0.12f)), + contentAlignment = Alignment.Center + ) { + if (imageUrl != null) { + AuthenticatedAsyncImage( + imageUrl = imageUrl, + accessToken = accessToken, + contentDescription = "Фотография", + modifier = Modifier.fillMaxSize(), + contentScale = ContentScale.Crop + ) + } else { + Icon( + imageVector = Icons.Outlined.Image, + contentDescription = null, + tint = TelegramInkMuted, + modifier = Modifier.size(14.dp) + ) + } + } + Text( + text = "фотография", + modifier = Modifier.weight(1f), + style = MaterialTheme.typography.bodySmall, + color = TelegramInkMuted, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + } + } + + attachment?.isChatPreviewVoiceNote() == true -> { + Row( + modifier = modifier, + horizontalArrangement = Arrangement.spacedBy(6.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Icon( + imageVector = Icons.Outlined.PlayArrow, + contentDescription = null, + tint = TelegramInkMuted, + modifier = Modifier.size(16.dp) + ) + Text( + text = "голосовое сообщение", + modifier = Modifier.weight(1f), + style = MaterialTheme.typography.bodySmall, + color = TelegramInkMuted, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + } + } + + else -> { + Text( + text = chatPreview(chat), + modifier = modifier, + style = MaterialTheme.typography.bodySmall, + color = TelegramInkMuted, + maxLines = maxLines, + overflow = TextOverflow.Ellipsis + ) + } + } +} + +private fun AttachmentDto.isChatPreviewImage(): Boolean = + contentType.startsWith("image/", ignoreCase = true) || + fileName.endsWith(".jpg", ignoreCase = true) || + fileName.endsWith(".jpeg", ignoreCase = true) || + fileName.endsWith(".png", ignoreCase = true) || + fileName.endsWith(".webp", ignoreCase = true) || + fileName.endsWith(".gif", ignoreCase = true) + +private fun AttachmentDto.isChatPreviewVoiceNote(): Boolean = + kind == AttachmentKind.VoiceNote || + contentType.startsWith("audio/", ignoreCase = true) + +private fun selectionCountLabel(selectedChatsCount: Int): String = when { + selectedChatsCount % 10 == 1 && selectedChatsCount % 100 != 11 -> "Выбран $selectedChatsCount чат" + selectedChatsCount % 10 in 2..4 && selectedChatsCount % 100 !in 12..14 -> "Выбрано $selectedChatsCount чата" + else -> "Выбрано $selectedChatsCount чатов" +} + +private fun deleteDialogTitle(selectedChatsCount: Int): String = + if (selectedChatsCount == 1) "Удалить чат?" else "Удалить выбранные чаты?" + +private fun deleteDialogMessage(selectedChatsCount: Int): String = + if (selectedChatsCount == 1) { + "Чат исчезнет из вашего списка после подтверждения." + } else { + "Выбранные чаты исчезнут из вашего списка после подтверждения." + } + +private fun pendingShareAttachmentSummary(pendingShare: PendingExternalShare): String = when (pendingShare.attachments.size) { + 0 -> "" + 1 -> "1 файл" + 2, 3, 4 -> "${pendingShare.attachments.size} файла" + else -> "${pendingShare.attachments.size} файлов" +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/chats/ChatsViewModel.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/chats/ChatsViewModel.kt new file mode 100644 index 00000000..a2539dfe --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/chats/ChatsViewModel.kt @@ -0,0 +1,588 @@ +package com.seven.ikar.kotlin.feature.chats + +import android.Manifest +import android.content.pm.PackageManager +import androidx.core.content.ContextCompat +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.seven.ikar.kotlin.app.AppContainer +import com.seven.ikar.kotlin.core.contacts.PhoneNumberNormalizer +import com.seven.ikar.kotlin.core.model.AndroidAppReleaseDto +import com.seven.ikar.kotlin.core.model.AuthSessionDto +import com.seven.ikar.kotlin.core.model.ChatStateRequest +import com.seven.ikar.kotlin.core.model.ChatSummaryDto +import com.seven.ikar.kotlin.core.model.ChatType +import com.seven.ikar.kotlin.core.model.StoryDto +import com.seven.ikar.kotlin.feature.share.PendingExternalShare +import com.seven.ikar.kotlin.ui.formatLastActivity +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import java.time.OffsetDateTime +import java.time.ZoneOffset +import java.time.format.DateTimeFormatter + +data class ChatListItemUiState( + val chat: ChatSummaryDto, + val resolvedTitle: String, + val lastActivityLabel: String, + val isSelected: Boolean +) + +data class PendingShareNavigationTarget( + val chatId: String, + val messageId: String?, + val scrollToLatest: Boolean, + val requestId: Long = System.nanoTime() +) + +enum class ChatListFilter { + All, + Unread, + Pinned, + Archive +} + +data class ChatsUiState( + val session: AuthSessionDto? = null, + val query: String = "", + val filter: ChatListFilter = ChatListFilter.All, + val chats: List<ChatListItemUiState> = emptyList(), + val stories: List<StoryDto> = emptyList(), + val isLoading: Boolean = false, + val errorMessage: String? = null, + val latestRelease: AndroidAppReleaseDto? = null, + val pendingShare: PendingExternalShare? = null, + val pendingShareNavigation: PendingShareNavigationTarget? = null, + val isSendingShare: Boolean = false, + val selectedChatIds: Set<String> = emptySet(), + val isDeleteDialogVisible: Boolean = false, + val deleteForEveryone: Boolean = false, + val showDeleteForEveryoneOption: Boolean = false, + val isDeletingSelected: Boolean = false +) { + val isShareMode: Boolean + get() = pendingShare != null + + val isSelectionMode: Boolean + get() = selectedChatIds.isNotEmpty() + + val selectedChatsCount: Int + get() = selectedChatIds.size +} + +class ChatsViewModel(private val container: AppContainer) : ViewModel() { + private val _uiState = MutableStateFlow(ChatsUiState(session = container.sessionStore.read())) + private val _allChats = mutableListOf<ChatSummaryDto>() + private var contactNamesByNormalizedPhone: Map<String, String> = emptyMap() + private var refreshJob: Job? = null + val uiState: StateFlow<ChatsUiState> = _uiState.asStateFlow() + + init { + attachIncomingShare() + attachRealtime() + loadCachedChats() + refresh() + refreshLatestRelease() + } + + fun updateQuery(value: String) { + _uiState.value = _uiState.value.copy(query = value) + applyFilter() + } + + fun updateFilter(value: ChatListFilter) { + _uiState.value = _uiState.value.copy(filter = value) + applyFilter() + } + + fun handleChatSelectionTap(chat: ChatSummaryDto) { + val selectedChatIds = _uiState.value.selectedChatIds + val nextSelectedChatIds = if (selectedChatIds.contains(chat.id)) { + selectedChatIds - chat.id + } else { + selectedChatIds + chat.id + } + + _uiState.value = _uiState.value.copy(selectedChatIds = nextSelectedChatIds) + applyFilter() + } + + fun handleChatLongPress(chat: ChatSummaryDto) { + if (_uiState.value.selectedChatIds.contains(chat.id)) { + return + } + + _uiState.value = _uiState.value.copy(selectedChatIds = _uiState.value.selectedChatIds + chat.id) + applyFilter() + } + + fun clearSelection() { + _uiState.value = _uiState.value.copy( + selectedChatIds = emptySet(), + isDeleteDialogVisible = false, + deleteForEveryone = false, + showDeleteForEveryoneOption = false, + isDeletingSelected = false + ) + applyFilter() + } + + fun showDeleteDialog() { + val state = _uiState.value + if (state.isShareMode || state.selectedChatIds.isEmpty() || state.isDeletingSelected) { + return + } + + val showDeleteForEveryoneOption = canDeleteSelectedForEveryone(state.selectedChatIds) + _uiState.value = state.copy( + isDeleteDialogVisible = true, + deleteForEveryone = state.deleteForEveryone && showDeleteForEveryoneOption, + showDeleteForEveryoneOption = showDeleteForEveryoneOption + ) + } + + fun dismissDeleteDialog() { + _uiState.value = _uiState.value.copy( + isDeleteDialogVisible = false, + deleteForEveryone = false + ) + } + + fun updateDeleteForEveryone(value: Boolean) { + if (!_uiState.value.showDeleteForEveryoneOption) { + return + } + + _uiState.value = _uiState.value.copy(deleteForEveryone = value) + } + + fun confirmDeleteSelected() { + val state = _uiState.value + if (state.isShareMode || state.selectedChatIds.isEmpty() || state.isDeletingSelected) { + return + } + + val selectedChats = _allChats.filter { state.selectedChatIds.contains(it.id) } + if (selectedChats.isEmpty()) { + clearSelection() + return + } + + val deleteForEveryone = state.deleteForEveryone && state.showDeleteForEveryoneOption + + viewModelScope.launch { + _uiState.value = _uiState.value.copy(isDeletingSelected = true, errorMessage = null) + runCatching { + container.executeAuthorized { session -> + selectedChats.forEach { chat -> + container.apiClient.deleteChat( + accessToken = session.accessToken, + chatId = chat.id, + forEveryone = deleteForEveryone + ) + } + } + }.onSuccess { + clearSelection() + refresh() + }.onFailure { error -> + _uiState.value = _uiState.value.copy(isDeletingSelected = false, errorMessage = error.message) + } + } + } + + fun togglePinSelectedChats() { + val selectedChats = _allChats.filter { _uiState.value.selectedChatIds.contains(it.id) } + if (selectedChats.isEmpty()) return + val shouldPin = selectedChats.any { !it.isPinned } + updateSelectedChatState(ChatStateRequest(isPinned = shouldPin)) + } + + fun archiveSelectedChats() { + val selectedChats = _allChats.filter { _uiState.value.selectedChatIds.contains(it.id) } + if (selectedChats.isEmpty()) return + val shouldArchive = selectedChats.any { !it.isArchived } + updateSelectedChatState(ChatStateRequest(isArchived = shouldArchive)) + } + + fun muteSelectedChats() { + val selectedChats = _allChats.filter { _uiState.value.selectedChatIds.contains(it.id) } + if (selectedChats.isEmpty()) return + val shouldMute = selectedChats.any { !it.isMuted } + updateSelectedChatState( + ChatStateRequest( + mutedUntil = if (shouldMute) { + OffsetDateTime.now(ZoneOffset.UTC).plusYears(1).format(DateTimeFormatter.ISO_OFFSET_DATE_TIME) + } else { + null + }, + isMuted = shouldMute + ) + ) + } + + private fun updateSelectedChatState(request: ChatStateRequest) { + val selectedChatIds = _uiState.value.selectedChatIds.toList() + if (selectedChatIds.isEmpty()) { + return + } + + viewModelScope.launch { + _uiState.value = _uiState.value.copy(errorMessage = null) + runCatching { + container.executeAuthorized { session -> + selectedChatIds.forEach { chatId -> + container.apiClient.updateChatState(session.accessToken, chatId, request) + } + } + }.onSuccess { + clearSelection() + refresh() + }.onFailure { error -> + _uiState.value = _uiState.value.copy(errorMessage = error.message) + } + } + } + + fun refresh() { + if (container.sessionStore.read() == null) { + _allChats.clear() + contactNamesByNormalizedPhone = emptyMap() + _uiState.value = _uiState.value.copy(session = null, chats = emptyList(), stories = emptyList(), selectedChatIds = emptySet()) + return + } + + viewModelScope.launch { + val currentSession = container.sessionStore.read() + _uiState.value = _uiState.value.copy(session = currentSession, isLoading = true, errorMessage = null) + runCatching { + container.executeAuthorized { session -> + container.realtimeService.connect(session.accessToken) + val chats = container.apiClient.getChats(session.accessToken) + val stories = runCatching { container.apiClient.getStories(session.accessToken) }.getOrDefault(emptyList()) + Triple(session, chats, stories) + } + }.onSuccess { result -> + updateContactNames(loadDeviceContactNames()) + _allChats.clear() + _allChats.addAll(result.second) + cacheChatList(result.first.user.id, result.second) + _uiState.value = _uiState.value.copy( + session = result.first, + stories = result.third.sortedByDescending { it.createdAt }, + isLoading = false, + errorMessage = null + ) + applyFilter() + }.onFailure { error -> + updateContactNames(loadDeviceContactNames()) + _uiState.value = _uiState.value.copy(isLoading = false, errorMessage = error.message) + applyFilter() + } + } + } + + fun logout() { + container.realtimeService.disconnect() + viewModelScope.launch { + runCatching { container.pushRegistrationManager.unregisterCurrentDeviceAsync() } + } + container.incomingShareStore.clear() + container.sessionStore.clear() + _allChats.clear() + contactNamesByNormalizedPhone = emptyMap() + _uiState.value = ChatsUiState() + } + + fun sendShareToChat(chat: ChatSummaryDto) { + if (_uiState.value.pendingShare == null) { + return + } + + sendShare(chatIds = listOf(chat.id), navigateToChatId = chat.id) + } + + fun sendShareToSelectedChats() { + val state = _uiState.value + if (state.pendingShare == null || state.selectedChatIds.isEmpty()) { + return + } + + sendShare(chatIds = state.selectedChatIds.toList(), navigateToChatId = null) + } + + fun dismissPendingShare() { + container.incomingShareStore.clear() + _uiState.value = _uiState.value.copy( + errorMessage = null, + isSendingShare = false, + selectedChatIds = emptySet() + ) + applyFilter() + } + + fun consumePendingShareNavigation() { + _uiState.value = _uiState.value.copy(pendingShareNavigation = null) + } + + private fun refreshLatestRelease() { + viewModelScope.launch { + runCatching { container.apiClient.getLatestAndroidRelease() } + .onSuccess { release -> _uiState.value = _uiState.value.copy(latestRelease = release) } + } + } + + private fun loadCachedChats() { + val session = container.sessionStore.read() ?: return + viewModelScope.launch { + val cachedContactNames = loadDeviceContactNames() + val cachedChats = withContext(Dispatchers.IO) { + runCatching { container.chatListCache.loadChats(session.user.id) }.getOrDefault(emptyList()) + } + if (cachedChats.isEmpty() || _allChats.isNotEmpty()) { + return@launch + } + + updateContactNames(cachedContactNames) + _allChats.clear() + _allChats.addAll(cachedChats) + _uiState.value = _uiState.value.copy(session = session) + applyFilter() + } + } + + private fun cacheChatList(ownerUserId: String, chats: List<ChatSummaryDto>) { + viewModelScope.launch(Dispatchers.IO) { + runCatching { container.chatListCache.replaceChats(ownerUserId, chats) } + } + } + + private fun updateContactNames(contactNames: Map<String, String>) { + if (contactNames.isNotEmpty() || contactNamesByNormalizedPhone.isEmpty()) { + contactNamesByNormalizedPhone = contactNames + } + } + + private fun applyFilter() { + val currentState = _uiState.value + val query = currentState.query.trim() + val existingChatIds = _allChats.mapTo(linkedSetOf(), ChatSummaryDto::id) + val selectedChatIds = currentState.selectedChatIds.intersect(existingChatIds) + val showDeleteForEveryoneOption = if (currentState.isShareMode) { + false + } else { + canDeleteSelectedForEveryone(selectedChatIds) + } + val deleteForEveryone = !currentState.isShareMode && + currentState.deleteForEveryone && + showDeleteForEveryoneOption + val chatItems = _allChats + .asSequence() + .filter { chat -> + when (currentState.filter) { + ChatListFilter.All -> !chat.isArchived + ChatListFilter.Unread -> chat.unreadCount > 0 && !chat.isArchived + ChatListFilter.Pinned -> chat.isPinned + ChatListFilter.Archive -> chat.isArchived + } + } + .sortedWith( + compareByDescending<ChatSummaryDto> { it.isPinned } + .thenByDescending { it.lastActivityAt.orEmpty() } + ) + .map { chat -> toChatListItem(chat, selectedChatIds) } + .toList() + val filtered = if (query.isBlank()) { + chatItems + } else { + chatItems.filter { item -> + item.resolvedTitle.contains(query, ignoreCase = true) || + item.chat.title.contains(query, ignoreCase = true) || + item.chat.secondaryText.orEmpty().contains(query, ignoreCase = true) || + item.chat.lastMessagePreview.orEmpty().contains(query, ignoreCase = true) + } + } + _uiState.value = currentState.copy( + chats = filtered, + selectedChatIds = selectedChatIds, + showDeleteForEveryoneOption = showDeleteForEveryoneOption, + deleteForEveryone = deleteForEveryone, + isDeleteDialogVisible = !currentState.isShareMode && + currentState.isDeleteDialogVisible && + selectedChatIds.isNotEmpty(), + isDeletingSelected = !currentState.isShareMode && + currentState.isDeletingSelected && + selectedChatIds.isNotEmpty() + ) + } + + private fun toChatListItem(chat: ChatSummaryDto, selectedChatIds: Set<String>): ChatListItemUiState { + val currentUserId = _uiState.value.session?.user?.id + return ChatListItemUiState( + chat = chat, + resolvedTitle = resolveChatTitle(chat, currentUserId), + lastActivityLabel = formatLastActivity(chat.lastActivityAt), + isSelected = selectedChatIds.contains(chat.id) + ) + } + + private fun resolveChatTitle(chat: ChatSummaryDto, currentUserId: String?): String { + if (chat.type != ChatType.Direct) { + return chat.title + } + + val peer = chat.participants.firstOrNull { it.id != currentUserId } ?: chat.participants.firstOrNull() + val normalizedPhone = PhoneNumberNormalizer.normalize(peer?.phoneNumber) + val contactName = normalizedPhone?.let(contactNamesByNormalizedPhone::get) + return contactName?.takeIf { it.isNotBlank() } + ?: peer?.displayName?.takeIf { it.isNotBlank() } + ?: chat.title + } + + private suspend fun loadDeviceContactNames(): Map<String, String> = withContext(Dispatchers.IO) { + if (!hasContactsPermission()) { + return@withContext emptyMap() + } + + runCatching { + container.contactDiscoveryService + .getContacts() + .associate { contact -> contact.normalizedPhoneNumber to contact.displayName } + }.getOrDefault(emptyMap()) + } + + private fun hasContactsPermission(): Boolean = + ContextCompat.checkSelfPermission( + container.appContext, + Manifest.permission.READ_CONTACTS + ) == PackageManager.PERMISSION_GRANTED + + private fun canDeleteSelectedForEveryone(selectedChatIds: Set<String>): Boolean { + if (selectedChatIds.size != 1) { + return false + } + + val chat = _allChats.firstOrNull { selectedChatIds.contains(it.id) } ?: return false + return chat.type == ChatType.Direct + } + + private fun attachRealtime() { + viewModelScope.launch { + container.realtimeService.chatCreated.collect { scheduleRefresh() } + } + viewModelScope.launch { + container.realtimeService.chatsChanged.collect { scheduleRefresh() } + } + viewModelScope.launch { + container.realtimeService.messagesCreated.collect { scheduleRefresh() } + } + viewModelScope.launch { + container.realtimeService.messagesUpdated.collect { scheduleRefresh() } + } + viewModelScope.launch { + container.realtimeService.appUpdateAvailable.collect { release -> + _uiState.value = _uiState.value.copy(latestRelease = release) + } + } + } + + private fun scheduleRefresh() { + refreshJob?.cancel() + refreshJob = viewModelScope.launch { + delay(400) + refresh() + } + } + + private fun attachIncomingShare() { + viewModelScope.launch { + container.incomingShareStore.pendingShare.collect { pendingShare -> + val currentState = _uiState.value + _uiState.value = currentState.copy( + pendingShare = pendingShare, + selectedChatIds = if (pendingShare == null) emptySet() else currentState.selectedChatIds, + isDeleteDialogVisible = if (pendingShare == null) currentState.isDeleteDialogVisible else false, + deleteForEveryone = if (pendingShare == null) currentState.deleteForEveryone else false, + showDeleteForEveryoneOption = if (pendingShare == null) currentState.showDeleteForEveryoneOption else false, + isDeletingSelected = if (pendingShare == null) currentState.isDeletingSelected else false, + isSendingShare = currentState.isSendingShare && pendingShare != null + ) + applyFilter() + } + } + } + + private fun sendShare(chatIds: List<String>, navigateToChatId: String?) { + val state = _uiState.value + val pendingShare = state.pendingShare ?: return + if (chatIds.isEmpty() || state.isSendingShare) { + return + } + + viewModelScope.launch { + _uiState.value = state.copy(isSendingShare = true, errorMessage = null) + runCatching { + container.executeAuthorized { session -> + var navigatedMessageId: String? = null + chatIds.forEach { chatId -> + val messageId = sendPendingShare( + accessToken = session.accessToken, + chatId = chatId, + pendingShare = pendingShare + ) + if (chatId == navigateToChatId) { + navigatedMessageId = messageId + } + } + navigatedMessageId + } + }.onSuccess { navigatedMessageId -> + _uiState.value = _uiState.value.copy( + isSendingShare = false, + errorMessage = null, + pendingShareNavigation = navigateToChatId?.let { chatId -> + PendingShareNavigationTarget( + chatId = chatId, + messageId = navigatedMessageId, + scrollToLatest = navigatedMessageId == null + ) + }, + selectedChatIds = emptySet() + ) + container.incomingShareStore.clear() + refresh() + }.onFailure { error -> + _uiState.value = _uiState.value.copy( + isSendingShare = false, + errorMessage = error.message + ) + } + } + } + + private suspend fun sendPendingShare( + accessToken: String, + chatId: String, + pendingShare: PendingExternalShare + ): String? { + val sharedText = pendingShare.text?.trim().orEmpty() + if (pendingShare.attachments.isEmpty()) { + check(sharedText.isNotBlank()) { "Нечего отправлять." } + return container.apiClient.sendMessage(chatId, sharedText, accessToken).id + } + + container.transferQueueRepository.enqueueUpload( + chatId = chatId, + text = sharedText.takeIf { it.isNotBlank() }, + replyToMessageId = null, + files = pendingShare.attachments + ) + return null + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/contacts/ContactsScreen.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/contacts/ContactsScreen.kt new file mode 100644 index 00000000..5e4233e5 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/contacts/ContactsScreen.kt @@ -0,0 +1,251 @@ +package com.seven.ikar.kotlin.feature.contacts + +import android.Manifest +import android.content.pm.PackageManager +import androidx.activity.compose.rememberLauncherForActivityResult +import androidx.activity.result.contract.ActivityResultContracts +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.WindowInsetsSides +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.only +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.safeDrawing +import androidx.compose.foundation.layout.windowInsetsPadding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.outlined.Add +import androidx.compose.material.icons.outlined.Menu +import androidx.compose.material.icons.outlined.PersonAddAlt1 +import androidx.compose.material.icons.outlined.PhoneInTalk +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import androidx.core.content.ContextCompat +import com.seven.ikar.kotlin.core.contacts.DiscoverUserItem +import com.seven.ikar.kotlin.ui.AvatarView +import com.seven.ikar.kotlin.ui.IkarFab +import com.seven.ikar.kotlin.ui.IkarFloatingMainMenu +import com.seven.ikar.kotlin.ui.IkarMainMenuTab +import com.seven.ikar.kotlin.ui.IkarRowDivider +import com.seven.ikar.kotlin.ui.IkarScreenSurface +import com.seven.ikar.kotlin.ui.IkarSearchCard +import com.seven.ikar.kotlin.ui.IkarSectionCard +import com.seven.ikar.kotlin.ui.formatDiscoverPresence +import com.seven.ikar.kotlin.ui.formatPresenceColor +import com.seven.ikar.kotlin.ui.theme.TelegramBlue +import com.seven.ikar.kotlin.ui.theme.TelegramInkMuted + +@Composable +fun ContactsScreen( + state: ContactsUiState, + items: List<DiscoverUserItem>, + onQueryChanged: (String) -> Unit, + onContactClick: (DiscoverUserItem) -> Unit, + onRefresh: () -> Unit, + onChatsClick: () -> Unit, + onContactsClick: () -> Unit, + onSettingsClick: () -> Unit, + onProfileClick: () -> Unit, + onOpenNewMessageClick: () -> Unit +) { + val context = LocalContext.current + val permissionLauncher = rememberLauncherForActivityResult(ActivityResultContracts.RequestPermission()) { granted -> + if (granted) { + onRefresh() + } + } + val hasContactsPermission = + ContextCompat.checkSelfPermission(context, Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED + + LaunchedEffect(hasContactsPermission) { + if (hasContactsPermission) { + onRefresh() + } + } + + IkarScreenSurface(modifier = Modifier.fillMaxSize()) { + Column( + modifier = Modifier + .fillMaxSize() + .windowInsetsPadding(WindowInsets.safeDrawing.only(WindowInsetsSides.Vertical)) + ) { + Column( + modifier = Modifier.padding(start = 18.dp, top = 16.dp, end = 18.dp, bottom = 12.dp), + verticalArrangement = Arrangement.spacedBy(12.dp) + ) { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + Text("Контакты", style = MaterialTheme.typography.headlineLarge) + Icon(Icons.Outlined.Menu, contentDescription = null, tint = MaterialTheme.colorScheme.onSurface) + } + + if (!hasContactsPermission) { + IkarSectionCard { + Text("Нужен доступ к контактам", style = MaterialTheme.typography.headlineMedium) + Text( + "Разрешите доступ к телефонной книге, чтобы видеть знакомых из контактов.", + style = MaterialTheme.typography.bodyMedium, + color = TelegramInkMuted + ) + androidx.compose.foundation.layout.Spacer(modifier = Modifier.padding(top = 8.dp)) + androidx.compose.material3.Button(onClick = { permissionLauncher.launch(Manifest.permission.READ_CONTACTS) }) { + Text("Разрешить доступ") + } + } + } + + IkarSearchCard( + value = state.query, + onValueChange = onQueryChanged, + placeholder = "Поиск контактов" + ) + + IkarSectionCard(padding = androidx.compose.foundation.layout.PaddingValues(0.dp)) { + ContactsActionRow( + icon = Icons.Outlined.PersonAddAlt1, + title = "Пригласить друзей", + subtitle = "Поделиться ссылкой на Икар." + ) + IkarRowDivider(startIndent = 56.dp) + ContactsActionRow( + icon = Icons.Outlined.PhoneInTalk, + title = "Недавние звонки", + subtitle = "История звонков внутри Икар." + ) + } + + state.errorMessage?.let { + Text(it, color = MaterialTheme.colorScheme.error, style = MaterialTheme.typography.bodyMedium) + } + } + + Box(modifier = Modifier.weight(1f).fillMaxWidth()) { + IkarSectionCard( + modifier = Modifier + .fillMaxSize() + .padding(horizontal = 18.dp), + padding = androidx.compose.foundation.layout.PaddingValues(0.dp) + ) { + Text( + "Сортировка по времени захода", + modifier = Modifier.padding(start = 18.dp, top = 16.dp, end = 18.dp, bottom = 8.dp), + style = MaterialTheme.typography.labelLarge, + color = TelegramBlue + ) + + LazyColumn { + if (items.isEmpty()) { + item { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 24.dp, vertical = 28.dp), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(8.dp) + ) { + Text("Контакты не найдены", style = MaterialTheme.typography.headlineMedium) + Text( + "Разрешите доступ к контактам и убедитесь, что нужные люди зарегистрированы по номеру телефона.", + color = TelegramInkMuted, + style = MaterialTheme.typography.bodyMedium + ) + } + } + } else { + items(items, key = { it.id }) { item -> + ContactsUserRow(item = item, onClick = { onContactClick(item) }) + } + } + item { Box(modifier = Modifier.padding(bottom = 132.dp)) } + } + } + + IkarFab( + icon = Icons.Outlined.Add, + contentDescription = "Новое сообщение", + modifier = Modifier + .align(Alignment.BottomEnd) + .padding(end = 20.dp, bottom = 126.dp), + onClick = onOpenNewMessageClick + ) + } + } + + IkarFloatingMainMenu( + selectedTab = IkarMainMenuTab.Contacts, + modifier = Modifier + .align(Alignment.BottomCenter) + .padding(horizontal = 8.dp, vertical = 18.dp), + onChatsClick = onChatsClick, + onContactsClick = onContactsClick, + onSettingsClick = onSettingsClick, + onProfileClick = onProfileClick + ) + } +} + +@Composable +private fun ContactsActionRow( + icon: androidx.compose.ui.graphics.vector.ImageVector, + title: String, + subtitle: String +) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 18.dp, vertical = 16.dp), + horizontalArrangement = Arrangement.spacedBy(14.dp) + ) { + Icon(icon, contentDescription = null, tint = TelegramBlue, modifier = Modifier.size(24.dp)) + Column(verticalArrangement = Arrangement.spacedBy(2.dp)) { + Text(title, style = MaterialTheme.typography.headlineMedium) + Text(subtitle, style = MaterialTheme.typography.bodySmall, color = TelegramInkMuted) + } + } +} + +@Composable +private fun ContactsUserRow( + item: DiscoverUserItem, + onClick: () -> Unit +) { + Column { + Row( + modifier = Modifier + .fillMaxWidth() + .clickable(onClick = onClick) + .padding(horizontal = 18.dp, vertical = 12.dp), + horizontalArrangement = Arrangement.spacedBy(14.dp), + verticalAlignment = Alignment.CenterVertically + ) { + AvatarView(imageUrl = item.avatarUrl, title = item.displayName, size = 54.dp) + Column(modifier = Modifier.weight(1f), verticalArrangement = Arrangement.spacedBy(3.dp)) { + Text(item.displayName, style = MaterialTheme.typography.titleLarge, maxLines = 1, overflow = TextOverflow.Ellipsis) + Text( + formatDiscoverPresence(item), + style = MaterialTheme.typography.bodySmall, + color = formatPresenceColor(item) + ) + } + } + IkarRowDivider(startIndent = 86.dp) + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/contacts/ContactsViewModel.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/contacts/ContactsViewModel.kt new file mode 100644 index 00000000..f0f0ed52 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/contacts/ContactsViewModel.kt @@ -0,0 +1,71 @@ +package com.seven.ikar.kotlin.feature.contacts + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.seven.ikar.kotlin.app.AppContainer +import com.seven.ikar.kotlin.core.contacts.DiscoverUserItem +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch + +data class ContactsUiState( + val query: String = "", + val items: List<DiscoverUserItem> = emptyList(), + val isLoading: Boolean = false, + val errorMessage: String? = null, + val pendingChatId: String? = null +) + +class ContactsViewModel(private val container: AppContainer) : ViewModel() { + private val _uiState = MutableStateFlow(ContactsUiState()) + val uiState: StateFlow<ContactsUiState> = _uiState.asStateFlow() + + fun updateQuery(value: String) { + _uiState.value = _uiState.value.copy(query = value) + } + + fun refresh() { + viewModelScope.launch { + _uiState.value = _uiState.value.copy(isLoading = true, errorMessage = null) + runCatching { container.resolvedContactsRepository.loadResolvedContacts() } + .onSuccess { items -> + _uiState.value = _uiState.value.copy(items = items, isLoading = false, errorMessage = null) + } + .onFailure { error -> + _uiState.value = _uiState.value.copy(isLoading = false, errorMessage = error.message) + } + } + } + + fun startDirectChat(user: DiscoverUserItem) { + viewModelScope.launch { + runCatching { + container.executeAuthorized { session -> + container.apiClient.createDirectChat(session.accessToken, user.id) + } + }.onSuccess { chat -> + _uiState.value = _uiState.value.copy(pendingChatId = chat.id) + }.onFailure { error -> + _uiState.value = _uiState.value.copy(errorMessage = error.message) + } + } + } + + fun consumePendingChatNavigation() { + _uiState.value = _uiState.value.copy(pendingChatId = null) + } + + fun filteredItems(): List<DiscoverUserItem> { + val query = _uiState.value.query.trim() + if (query.isBlank()) { + return _uiState.value.items + } + + return _uiState.value.items.filter { + it.displayName.contains(query, ignoreCase = true) || + it.secondaryLine.contains(query, ignoreCase = true) || + it.normalizedPhoneNumber.contains(query, ignoreCase = true) + } + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/devices/DevicesScreen.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/devices/DevicesScreen.kt new file mode 100644 index 00000000..bb034951 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/devices/DevicesScreen.kt @@ -0,0 +1,99 @@ +package com.seven.ikar.kotlin.feature.devices + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.WindowInsetsSides +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.only +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.safeDrawing +import androidx.compose.foundation.layout.windowInsetsPadding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import com.seven.ikar.kotlin.core.model.UserSessionDto +import com.seven.ikar.kotlin.ui.IkarRowDivider +import com.seven.ikar.kotlin.ui.IkarScreenSurface +import com.seven.ikar.kotlin.ui.IkarSectionCard +import com.seven.ikar.kotlin.ui.IkarSectionTitle +import com.seven.ikar.kotlin.ui.IkarSimpleHeader +import com.seven.ikar.kotlin.ui.theme.TelegramBlue +import com.seven.ikar.kotlin.ui.theme.TelegramDanger +import com.seven.ikar.kotlin.ui.theme.TelegramInkMuted + +@Composable +fun DevicesScreen( + state: DevicesUiState, + onBackClick: () -> Unit, + onRefreshClick: () -> Unit, + onRevokeClick: (UserSessionDto) -> Unit +) { + IkarScreenSurface(modifier = Modifier.fillMaxSize()) { + Column( + modifier = Modifier + .fillMaxSize() + .windowInsetsPadding(WindowInsets.safeDrawing.only(WindowInsetsSides.Vertical)) + .verticalScroll(rememberScrollState()) + .padding(horizontal = 18.dp, vertical = 16.dp), + verticalArrangement = Arrangement.spacedBy(16.dp) + ) { + IkarSimpleHeader(title = "Устройства", onBackClick = onBackClick) + state.errorMessage?.let { + Text(it, color = TelegramDanger, style = MaterialTheme.typography.bodySmall) + } + if (state.isLoading && state.sessions.isEmpty()) { + CircularProgressIndicator(color = TelegramBlue) + } + IkarSectionCard { + IkarSectionTitle("Активные сеансы", modifier = Modifier.padding(bottom = 8.dp)) + state.sessions.forEachIndexed { index, session -> + DeviceRow(session = session, enabled = !state.isSaving, onRevokeClick = { onRevokeClick(session) }) + if (index != state.sessions.lastIndex) { + IkarRowDivider() + } + } + } + TextButton(onClick = onRefreshClick) { Text("Обновить") } + } + } +} + +@Composable +private fun DeviceRow( + session: UserSessionDto, + enabled: Boolean, + onRevokeClick: () -> Unit +) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 12.dp), + horizontalArrangement = Arrangement.spacedBy(10.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Column(modifier = Modifier.weight(1f)) { + Text(session.deviceName, style = MaterialTheme.typography.titleMedium, fontWeight = FontWeight.SemiBold) + Text( + text = "Последняя активность: ${session.lastSeenAt}", + style = MaterialTheme.typography.bodySmall, + color = TelegramInkMuted + ) + } + if (session.isCurrent) { + Text("Текущий", color = TelegramBlue) + } else { + TextButton(enabled = enabled, onClick = onRevokeClick) { Text("Завершить") } + } + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/devices/DevicesViewModel.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/devices/DevicesViewModel.kt new file mode 100644 index 00000000..ab90ee44 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/devices/DevicesViewModel.kt @@ -0,0 +1,58 @@ +package com.seven.ikar.kotlin.feature.devices + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.seven.ikar.kotlin.app.AppContainer +import com.seven.ikar.kotlin.core.model.UserSessionDto +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch + +data class DevicesUiState( + val sessions: List<UserSessionDto> = emptyList(), + val isLoading: Boolean = false, + val isSaving: Boolean = false, + val errorMessage: String? = null +) + +class DevicesViewModel(private val container: AppContainer) : ViewModel() { + private val _uiState = MutableStateFlow(DevicesUiState()) + val uiState: StateFlow<DevicesUiState> = _uiState.asStateFlow() + + init { + refresh() + } + + fun refresh() { + viewModelScope.launch { + _uiState.value = _uiState.value.copy(isLoading = true, errorMessage = null) + runCatching { + container.executeAuthorized { session -> + container.apiClient.getMySessions(session.accessToken) + } + }.onSuccess { sessions -> + _uiState.value = _uiState.value.copy(sessions = sessions, isLoading = false) + }.onFailure { error -> + _uiState.value = _uiState.value.copy(isLoading = false, errorMessage = error.message) + } + } + } + + fun revoke(session: UserSessionDto) { + if (session.isCurrent || _uiState.value.isSaving) return + viewModelScope.launch { + _uiState.value = _uiState.value.copy(isSaving = true, errorMessage = null) + runCatching { + container.executeAuthorized { auth -> + container.apiClient.revokeMySession(auth.accessToken, session.id) + } + }.onSuccess { + _uiState.value = _uiState.value.copy(isSaving = false) + refresh() + }.onFailure { error -> + _uiState.value = _uiState.value.copy(isSaving = false, errorMessage = error.message) + } + } + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/discover/DiscoverScreen.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/discover/DiscoverScreen.kt new file mode 100644 index 00000000..db96bb58 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/discover/DiscoverScreen.kt @@ -0,0 +1,560 @@ +package com.seven.ikar.kotlin.feature.discover + +import android.Manifest +import android.content.pm.PackageManager +import androidx.activity.compose.rememberLauncherForActivityResult +import androidx.activity.result.contract.ActivityResultContracts +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.ArrowBack +import androidx.compose.material.icons.outlined.Group +import androidx.compose.material.icons.outlined.Menu +import androidx.compose.material.icons.outlined.Speaker +import androidx.compose.material3.Button +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.RadioButton +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import androidx.core.content.ContextCompat +import com.seven.ikar.kotlin.core.contacts.DiscoverUserItem +import com.seven.ikar.kotlin.ui.AvatarView +import com.seven.ikar.kotlin.ui.IkarCenteredHeader +import com.seven.ikar.kotlin.ui.IkarHeaderIconBubble +import com.seven.ikar.kotlin.ui.IkarRowDivider +import com.seven.ikar.kotlin.ui.IkarScreenSurface +import com.seven.ikar.kotlin.ui.IkarSearchCard +import com.seven.ikar.kotlin.ui.IkarSectionCard +import com.seven.ikar.kotlin.ui.IkarToggleRow +import com.seven.ikar.kotlin.ui.formatDiscoverPresence +import com.seven.ikar.kotlin.ui.formatPresenceColor +import com.seven.ikar.kotlin.ui.theme.TelegramBlue +import com.seven.ikar.kotlin.ui.theme.TelegramBluePanel +import com.seven.ikar.kotlin.ui.theme.TelegramInkMuted + +@Composable +fun DiscoverScreen( + state: DiscoverUiState, + onBackClick: () -> Unit, + onQueryChanged: (String) -> Unit, + onRefreshClick: () -> Unit, + onUserClick: (DiscoverUserItem) -> Unit, + onBeginGroupSelection: () -> Unit, + onBeginChannelSelection: () -> Unit, + onCancelSelection: () -> Unit, + onChannelBackClick: () -> Unit, + onChannelTitleChanged: (String) -> Unit, + onChannelDescriptionChanged: (String) -> Unit, + onChannelVisibilityChanged: (ChannelVisibility) -> Unit, + onChannelPublicUsernameChanged: (String) -> Unit, + onChannelSignaturesChanged: (Boolean) -> Unit, + onContinueChannelWizard: () -> Unit, + onCompleteSelection: () -> Unit +) { + val context = LocalContext.current + val permissionLauncher = rememberLauncherForActivityResult(ActivityResultContracts.RequestPermission()) { granted -> + if (granted) { + onRefreshClick() + } + } + val hasContactsPermission = + ContextCompat.checkSelfPermission(context, Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED + val isChannelWizard = state.channelWizardStep != null + val showContacts = state.selectionMode != null || state.channelWizardStep == null + + LaunchedEffect(hasContactsPermission) { + if (hasContactsPermission) { + onRefreshClick() + } + } + + IkarScreenSurface(modifier = Modifier.fillMaxSize()) { + Column(modifier = Modifier.fillMaxSize()) { + Column( + modifier = Modifier.padding(start = 18.dp, top = 16.dp, end = 18.dp, bottom = 12.dp), + verticalArrangement = Arrangement.spacedBy(12.dp) + ) { + IkarCenteredHeader( + title = when { + isChannelWizard -> "Новый канал" + state.selectionMode == DiscoverSelectionMode.Group -> "Новая группа" + else -> "Новое сообщение" + }, + left = { + IkarHeaderIconBubble( + onClick = if (isChannelWizard) onChannelBackClick else onBackClick + ) { + Icon(Icons.AutoMirrored.Outlined.ArrowBack, contentDescription = "Назад", tint = MaterialTheme.colorScheme.onSurface) + } + }, + right = { + if (!isChannelWizard && state.selectionMode == null) { + IkarHeaderIconBubble { + Icon(Icons.Outlined.Menu, contentDescription = null, tint = MaterialTheme.colorScheme.onSurface) + } + } + } + ) + + if (!hasContactsPermission && showContacts) { + IkarPermissionCard(onGrantClick = { permissionLauncher.launch(Manifest.permission.READ_CONTACTS) }) + } + + if (showContacts) { + IkarSearchCard( + value = state.query, + onValueChange = onQueryChanged, + placeholder = if (state.selectionMode == DiscoverSelectionMode.Channel) "Поиск подписчиков" else "Поиск контактов" + ) + } + + when (state.channelWizardStep) { + ChannelWizardStep.Details -> ChannelDetailsStep( + state = state, + onTitleChanged = onChannelTitleChanged, + onDescriptionChanged = onChannelDescriptionChanged, + onCancelClick = onCancelSelection, + onNextClick = onContinueChannelWizard + ) + + ChannelWizardStep.Type -> ChannelTypeStep( + state = state, + onVisibilityChanged = onChannelVisibilityChanged, + onPublicUsernameChanged = onChannelPublicUsernameChanged, + onSignaturesChanged = onChannelSignaturesChanged, + onBackClick = onChannelBackClick, + onNextClick = onContinueChannelWizard + ) + + ChannelWizardStep.Subscribers -> SelectionBanner( + title = "Добавить подписчиков", + subtitle = "Можно создать канал сейчас и пригласить людей позже.", + selectedCount = state.selectedUserIds.size, + actionText = if (state.isLoading) "Создание..." else "Создать", + onBackClick = onChannelBackClick, + onActionClick = onCompleteSelection, + enabled = !state.isLoading + ) + + null -> { + if (state.selectionMode == null) { + IkarSectionCard(padding = PaddingValues(0.dp)) { + DiscoverActionRow( + icon = Icons.Outlined.Group, + title = "Создать группу", + subtitle = "Выбрать участников и открыть общий чат.", + onClick = onBeginGroupSelection + ) + IkarRowDivider(startIndent = 56.dp) + DiscoverActionRow( + icon = Icons.Outlined.Speaker, + title = "Создать канал", + subtitle = "Открыть канал и пригласить подписчиков.", + onClick = onBeginChannelSelection + ) + } + } else { + SelectionBanner( + title = "Новая группа", + subtitle = "Выберите участников", + selectedCount = state.selectedUserIds.size, + actionText = if (state.isLoading) "Создание..." else "Создать", + onBackClick = onCancelSelection, + onActionClick = onCompleteSelection, + enabled = !state.isLoading + ) + } + } + } + + state.errorMessage?.let { + Text(it, color = MaterialTheme.colorScheme.error, style = MaterialTheme.typography.bodyMedium) + } + } + + if (showContacts) { + ContactsSection( + modifier = Modifier.weight(1f), + state = state, + onUserClick = onUserClick + ) + } + } + } +} + +@Composable +private fun ChannelDetailsStep( + state: DiscoverUiState, + onTitleChanged: (String) -> Unit, + onDescriptionChanged: (String) -> Unit, + onCancelClick: () -> Unit, + onNextClick: () -> Unit +) { + IkarSectionCard { + WizardStepIndicator(currentStep = 1) + Row( + horizontalArrangement = Arrangement.spacedBy(14.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Surface( + modifier = Modifier.size(64.dp), + color = TelegramBluePanel, + shape = CircleShape + ) { + Box(contentAlignment = Alignment.Center) { + Icon(Icons.Outlined.Speaker, contentDescription = null, tint = TelegramBlue, modifier = Modifier.size(30.dp)) + } + } + Column(modifier = Modifier.weight(1f), verticalArrangement = Arrangement.spacedBy(10.dp)) { + OutlinedTextField( + value = state.channelTitle, + onValueChange = onTitleChanged, + modifier = Modifier.fillMaxWidth(), + singleLine = true, + label = { Text("Название канала") } + ) + OutlinedTextField( + value = state.channelDescription, + onValueChange = onDescriptionChanged, + modifier = Modifier.fillMaxWidth(), + minLines = 3, + maxLines = 4, + label = { Text("Описание") } + ) + } + } + StepActions( + backText = "Отмена", + nextText = "Далее", + onBackClick = onCancelClick, + onNextClick = onNextClick, + nextEnabled = state.channelTitle.isNotBlank() + ) + } +} + +@Composable +private fun ChannelTypeStep( + state: DiscoverUiState, + onVisibilityChanged: (ChannelVisibility) -> Unit, + onPublicUsernameChanged: (String) -> Unit, + onSignaturesChanged: (Boolean) -> Unit, + onBackClick: () -> Unit, + onNextClick: () -> Unit +) { + val isPublic = state.channelVisibility == ChannelVisibility.Public + IkarSectionCard { + WizardStepIndicator(currentStep = 2) + ChannelVisibilityRow( + title = "Публичный канал", + subtitle = "Канал будет виден в поиске и доступен по короткой ссылке.", + selected = isPublic, + onClick = { onVisibilityChanged(ChannelVisibility.Public) } + ) + IkarRowDivider(startIndent = 0.dp) + ChannelVisibilityRow( + title = "Приватный канал", + subtitle = "Войти можно будет по приглашению или invite-ссылке.", + selected = state.channelVisibility == ChannelVisibility.Private, + onClick = { onVisibilityChanged(ChannelVisibility.Private) } + ) + if (isPublic) { + OutlinedTextField( + value = state.channelPublicUsername, + onValueChange = onPublicUsernameChanged, + modifier = Modifier + .fillMaxWidth() + .padding(top = 10.dp), + singleLine = true, + prefix = { Text("@") }, + label = { Text("Публичная ссылка") }, + supportingText = { Text("Минимум 5 символов: латиница, цифры и _") } + ) + } + IkarToggleRow( + title = "Подписи администраторов", + subtitle = "Имя автора будет показано рядом с публикацией.", + checked = state.channelSignaturesEnabled, + onCheckedChange = onSignaturesChanged, + leading = { + Icon(Icons.Outlined.Speaker, contentDescription = null, tint = TelegramInkMuted) + } + ) + StepActions( + backText = "Назад", + nextText = "Далее", + onBackClick = onBackClick, + onNextClick = onNextClick, + nextEnabled = !isPublic || state.channelPublicUsername.length >= 5 + ) + } +} + +@Composable +private fun ChannelVisibilityRow( + title: String, + subtitle: String, + selected: Boolean, + onClick: () -> Unit +) { + Row( + modifier = Modifier + .fillMaxWidth() + .clickable(onClick = onClick) + .padding(vertical = 12.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(12.dp) + ) { + RadioButton(selected = selected, onClick = onClick) + Column(modifier = Modifier.weight(1f), verticalArrangement = Arrangement.spacedBy(2.dp)) { + Text(title, style = MaterialTheme.typography.titleLarge) + Text(subtitle, style = MaterialTheme.typography.bodySmall, color = TelegramInkMuted) + } + } +} + +@Composable +private fun SelectionBanner( + title: String, + subtitle: String, + selectedCount: Int, + actionText: String, + onBackClick: () -> Unit, + onActionClick: () -> Unit, + enabled: Boolean +) { + Surface( + modifier = Modifier.fillMaxWidth(), + color = TelegramBluePanel, + shape = RoundedCornerShape(20.dp) + ) { + Row( + modifier = Modifier.padding(horizontal = 14.dp, vertical = 12.dp), + horizontalArrangement = Arrangement.spacedBy(12.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Icon( + Icons.AutoMirrored.Outlined.ArrowBack, + contentDescription = "Назад", + tint = TelegramBlue, + modifier = Modifier.clickable(enabled = enabled, onClick = onBackClick) + ) + Column(modifier = Modifier.weight(1f), verticalArrangement = Arrangement.spacedBy(2.dp)) { + Text(title, style = MaterialTheme.typography.titleMedium, color = TelegramBlue) + Text(subtitle, style = MaterialTheme.typography.bodySmall, color = TelegramInkMuted) + } + Text(selectedCount.toString(), style = MaterialTheme.typography.titleMedium) + Button(onClick = onActionClick, enabled = enabled) { + Text(actionText) + } + } + } +} + +@Composable +private fun StepActions( + backText: String, + nextText: String, + onBackClick: () -> Unit, + onNextClick: () -> Unit, + nextEnabled: Boolean +) { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.End, + verticalAlignment = Alignment.CenterVertically + ) { + TextButton(onClick = onBackClick) { + Text(backText) + } + Button(onClick = onNextClick, enabled = nextEnabled) { + Text(nextText) + } + } +} + +@Composable +private fun WizardStepIndicator(currentStep: Int) { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.spacedBy(8.dp), + verticalAlignment = Alignment.CenterVertically + ) { + (1..3).forEach { step -> + Surface( + modifier = Modifier + .height(4.dp) + .weight(1f), + color = if (step <= currentStep) TelegramBlue else TelegramBluePanel, + shape = RoundedCornerShape(2.dp) + ) {} + } + Text( + "$currentStep/3", + style = MaterialTheme.typography.labelMedium, + color = TelegramInkMuted, + fontWeight = FontWeight.SemiBold + ) + } +} + +@Composable +private fun ContactsSection( + modifier: Modifier = Modifier, + state: DiscoverUiState, + onUserClick: (DiscoverUserItem) -> Unit +) { + IkarSectionCard( + modifier = modifier + .fillMaxWidth() + .padding(horizontal = 18.dp) + .padding(bottom = 24.dp), + padding = PaddingValues(0.dp) + ) { + Text( + "Сортировка по времени захода", + modifier = Modifier.padding(start = 18.dp, top = 16.dp, end = 18.dp, bottom = 8.dp), + style = MaterialTheme.typography.labelLarge, + color = TelegramBlue + ) + + LazyColumn { + if (state.items.isEmpty()) { + item { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 24.dp, vertical = 28.dp), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(8.dp) + ) { + Text("Контакты не найдены", style = MaterialTheme.typography.headlineMedium) + Text( + "Разрешите доступ к контактам и убедитесь, что нужные люди зарегистрированы по номеру телефона.", + color = TelegramInkMuted, + style = MaterialTheme.typography.bodyMedium + ) + } + } + } else { + items(state.items, key = { it.id }) { item -> + DiscoverUserRow( + item = item, + isSelected = state.selectedUserIds.contains(item.id), + onClick = { onUserClick(item) } + ) + } + } + } + } +} + +@Composable +private fun IkarPermissionCard(onGrantClick: () -> Unit) { + IkarSectionCard { + Text("Нужен доступ к контактам", style = MaterialTheme.typography.headlineMedium) + Text( + "Без него не получится показать знакомых из телефонной книги.", + style = MaterialTheme.typography.bodyMedium, + color = TelegramInkMuted + ) + Spacer(modifier = Modifier.padding(top = 8.dp)) + Button(onClick = onGrantClick) { + Text("Разрешить доступ") + } + } +} + +@Composable +private fun DiscoverActionRow( + icon: androidx.compose.ui.graphics.vector.ImageVector, + title: String, + subtitle: String, + onClick: () -> Unit +) { + Row( + modifier = Modifier + .fillMaxWidth() + .clickable(onClick = onClick) + .padding(horizontal = 18.dp, vertical = 16.dp), + horizontalArrangement = Arrangement.spacedBy(14.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Icon(icon, contentDescription = null, tint = TelegramBlue, modifier = Modifier.size(24.dp)) + Column(verticalArrangement = Arrangement.spacedBy(2.dp)) { + Text(title, style = MaterialTheme.typography.headlineMedium) + Text(subtitle, style = MaterialTheme.typography.bodySmall, color = TelegramInkMuted) + } + } +} + +@Composable +private fun DiscoverUserRow( + item: DiscoverUserItem, + isSelected: Boolean, + onClick: () -> Unit +) { + Column { + Row( + modifier = Modifier + .fillMaxWidth() + .clickable(onClick = onClick) + .padding(horizontal = 18.dp, vertical = 12.dp), + horizontalArrangement = Arrangement.spacedBy(14.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Box { + AvatarView(imageUrl = item.avatarUrl, title = item.displayName, size = 54.dp) + if (isSelected) { + Surface( + modifier = Modifier + .align(Alignment.BottomEnd) + .size(20.dp), + color = TelegramBlue, + shape = CircleShape + ) { + Box(contentAlignment = Alignment.Center) { + Text("✓", color = Color.White, style = MaterialTheme.typography.labelSmall) + } + } + } + } + Column(modifier = Modifier.weight(1f), verticalArrangement = Arrangement.spacedBy(3.dp)) { + Text(item.displayName, style = MaterialTheme.typography.titleLarge, maxLines = 1, overflow = TextOverflow.Ellipsis) + Text( + formatDiscoverPresence(item), + style = MaterialTheme.typography.bodySmall, + color = formatPresenceColor(item) + ) + } + } + IkarRowDivider(startIndent = 86.dp) + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/discover/DiscoverViewModel.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/discover/DiscoverViewModel.kt new file mode 100644 index 00000000..84288810 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/discover/DiscoverViewModel.kt @@ -0,0 +1,261 @@ +package com.seven.ikar.kotlin.feature.discover + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.seven.ikar.kotlin.app.AppContainer +import com.seven.ikar.kotlin.core.contacts.DiscoverUserItem +import kotlinx.coroutines.Job +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch +import java.util.Locale + +enum class DiscoverSelectionMode { + Group, + Channel +} + +enum class ChannelWizardStep { + Details, + Type, + Subscribers +} + +enum class ChannelVisibility { + Public, + Private +} + +data class DiscoverUiState( + val query: String = "", + val items: List<DiscoverUserItem> = emptyList(), + val isLoading: Boolean = false, + val errorMessage: String? = null, + val pendingChatId: String? = null, + val selectionMode: DiscoverSelectionMode? = null, + val selectedUserIds: Set<String> = emptySet(), + val channelWizardStep: ChannelWizardStep? = null, + val channelTitle: String = "", + val channelDescription: String = "", + val channelVisibility: ChannelVisibility = ChannelVisibility.Private, + val channelPublicUsername: String = "", + val channelSignaturesEnabled: Boolean = false +) + +class DiscoverViewModel(private val container: AppContainer) : ViewModel() { + private val _uiState = MutableStateFlow(DiscoverUiState()) + val uiState: StateFlow<DiscoverUiState> = _uiState.asStateFlow() + + private var searchJob: Job? = null + + init { + refresh() + } + + fun updateQuery(value: String) { + _uiState.value = _uiState.value.copy(query = value) + searchJob?.cancel() + searchJob = viewModelScope.launch { + delay(250) + refresh() + } + } + + fun refresh() { + viewModelScope.launch { + val query = _uiState.value.query + _uiState.value = _uiState.value.copy(isLoading = true, errorMessage = null) + runCatching { container.resolvedContactsRepository.loadMergedCandidates(query) } + .onSuccess { items -> + _uiState.value = _uiState.value.copy(items = items, isLoading = false, errorMessage = null) + } + .onFailure { error -> + _uiState.value = _uiState.value.copy(isLoading = false, errorMessage = error.message) + } + } + } + + fun beginGroupSelection() { + _uiState.value = _uiState.value.copy( + selectionMode = DiscoverSelectionMode.Group, + selectedUserIds = emptySet(), + channelWizardStep = null, + errorMessage = null + ) + } + + fun beginChannelSelection() { + _uiState.value = _uiState.value.copy( + selectionMode = null, + selectedUserIds = emptySet(), + channelWizardStep = ChannelWizardStep.Details, + channelTitle = "", + channelDescription = "", + channelVisibility = ChannelVisibility.Private, + channelPublicUsername = "", + channelSignaturesEnabled = false, + errorMessage = null + ) + } + + fun cancelSelection() { + _uiState.value = _uiState.value.copy( + selectionMode = null, + selectedUserIds = emptySet(), + channelWizardStep = null, + errorMessage = null + ) + } + + fun previousChannelWizardStep() { + val state = _uiState.value + when (state.channelWizardStep) { + ChannelWizardStep.Details, null -> cancelSelection() + ChannelWizardStep.Type -> _uiState.value = state.copy(channelWizardStep = ChannelWizardStep.Details, errorMessage = null) + ChannelWizardStep.Subscribers -> _uiState.value = state.copy( + channelWizardStep = ChannelWizardStep.Type, + selectionMode = null, + selectedUserIds = emptySet(), + errorMessage = null + ) + } + } + + fun updateChannelTitle(value: String) { + _uiState.value = _uiState.value.copy(channelTitle = value.take(80), errorMessage = null) + } + + fun updateChannelDescription(value: String) { + _uiState.value = _uiState.value.copy(channelDescription = value.take(255), errorMessage = null) + } + + fun updateChannelVisibility(value: ChannelVisibility) { + _uiState.value = _uiState.value.copy(channelVisibility = value, errorMessage = null) + } + + fun updateChannelPublicUsername(value: String) { + val normalized = normalizePublicUsernameInput(value) + _uiState.value = _uiState.value.copy(channelPublicUsername = normalized, errorMessage = null) + } + + fun updateChannelSignaturesEnabled(value: Boolean) { + _uiState.value = _uiState.value.copy(channelSignaturesEnabled = value, errorMessage = null) + } + + fun continueChannelWizard() { + val state = _uiState.value + when (state.channelWizardStep) { + ChannelWizardStep.Details -> { + if (state.channelTitle.isBlank()) { + _uiState.value = state.copy(errorMessage = "Введите название канала.") + return + } + _uiState.value = state.copy(channelWizardStep = ChannelWizardStep.Type, errorMessage = null) + } + + ChannelWizardStep.Type -> { + if (state.channelVisibility == ChannelVisibility.Public && state.channelPublicUsername.length < 5) { + _uiState.value = state.copy(errorMessage = "Публичная ссылка должна содержать минимум 5 символов.") + return + } + _uiState.value = state.copy( + channelWizardStep = ChannelWizardStep.Subscribers, + selectionMode = DiscoverSelectionMode.Channel, + selectedUserIds = emptySet(), + errorMessage = null + ) + } + + ChannelWizardStep.Subscribers -> completeSelection() + null -> Unit + } + } + + fun handleUserTap(user: DiscoverUserItem) { + val selectionMode = _uiState.value.selectionMode + if (selectionMode == null) { + startDirectChat(user) + return + } + + val selected = _uiState.value.selectedUserIds.toMutableSet() + if (!selected.add(user.id)) { + selected.remove(user.id) + } + _uiState.value = _uiState.value.copy(selectedUserIds = selected, errorMessage = null) + } + + fun completeSelection() { + val mode = _uiState.value.selectionMode ?: return + val state = _uiState.value + val selectedIds = state.selectedUserIds.toList() + if (mode == DiscoverSelectionMode.Group && selectedIds.isEmpty()) { + _uiState.value = state.copy(errorMessage = "Выберите хотя бы одного участника.") + return + } + + viewModelScope.launch { + _uiState.value = _uiState.value.copy(isLoading = true, errorMessage = null) + runCatching { + container.executeAuthorized { session -> + when (mode) { + DiscoverSelectionMode.Group -> container.apiClient.createGroupChat( + accessToken = session.accessToken, + title = "Новая группа", + memberIds = selectedIds + ) + + DiscoverSelectionMode.Channel -> container.apiClient.createChannel( + accessToken = session.accessToken, + title = state.channelTitle.trim(), + memberIds = selectedIds, + description = state.channelDescription.trim().takeIf { it.isNotEmpty() }, + publicUsername = state.channelPublicUsername.takeIf { state.channelVisibility == ChannelVisibility.Public }, + createInviteLink = state.channelVisibility == ChannelVisibility.Private, + channelSignaturesEnabled = state.channelSignaturesEnabled + ) + } + } + }.onSuccess { chat -> + _uiState.value = _uiState.value.copy( + pendingChatId = chat.id, + isLoading = false, + selectionMode = null, + selectedUserIds = emptySet(), + channelWizardStep = null, + errorMessage = null + ) + }.onFailure { error -> + _uiState.value = _uiState.value.copy(isLoading = false, errorMessage = error.message) + } + } + } + + fun startDirectChat(user: DiscoverUserItem) { + viewModelScope.launch { + runCatching { + container.executeAuthorized { session -> + container.apiClient.createDirectChat(session.accessToken, user.id) + } + }.onSuccess { chat -> + _uiState.value = _uiState.value.copy(pendingChatId = chat.id) + }.onFailure { error -> + _uiState.value = _uiState.value.copy(errorMessage = error.message) + } + } + } + + fun consumePendingChatNavigation() { + _uiState.value = _uiState.value.copy(pendingChatId = null) + } + + private fun normalizePublicUsernameInput(value: String): String = + value + .trim() + .trimStart('@') + .filter { it in 'a'..'z' || it in 'A'..'Z' || it.isDigit() || it == '_' } + .take(32) + .lowercase(Locale.US) +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/folders/ChatFoldersScreen.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/folders/ChatFoldersScreen.kt new file mode 100644 index 00000000..067e32df --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/folders/ChatFoldersScreen.kt @@ -0,0 +1,179 @@ +package com.seven.ikar.kotlin.feature.folders + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.WindowInsetsSides +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.only +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.safeDrawing +import androidx.compose.foundation.layout.windowInsetsPadding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.Checkbox +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import com.seven.ikar.kotlin.core.model.ChatFolderDto +import com.seven.ikar.kotlin.core.model.ChatSummaryDto +import com.seven.ikar.kotlin.ui.IkarRowDivider +import com.seven.ikar.kotlin.ui.IkarScreenSurface +import com.seven.ikar.kotlin.ui.IkarSearchCard +import com.seven.ikar.kotlin.ui.IkarSectionCard +import com.seven.ikar.kotlin.ui.IkarSectionTitle +import com.seven.ikar.kotlin.ui.IkarSimpleHeader +import com.seven.ikar.kotlin.ui.chatPreview +import com.seven.ikar.kotlin.ui.theme.TelegramBlue +import com.seven.ikar.kotlin.ui.theme.TelegramDanger +import com.seven.ikar.kotlin.ui.theme.TelegramInkMuted + +@Composable +fun ChatFoldersScreen( + state: ChatFoldersUiState, + onBackClick: () -> Unit, + onRefreshClick: () -> Unit, + onNewFolderKeyChanged: (String) -> Unit, + onFolderSelected: (String?) -> Unit, + onChatToggled: (String) -> Unit, + onAssignSelected: () -> Unit, + onClearSelected: () -> Unit +) { + IkarScreenSurface(modifier = Modifier.fillMaxSize()) { + Column( + modifier = Modifier + .fillMaxSize() + .windowInsetsPadding(WindowInsets.safeDrawing.only(WindowInsetsSides.Vertical)) + .verticalScroll(rememberScrollState()) + .padding(horizontal = 18.dp, vertical = 16.dp), + verticalArrangement = Arrangement.spacedBy(16.dp) + ) { + IkarSimpleHeader(title = "Папки чатов", onBackClick = onBackClick) + + state.errorMessage?.let { + Text(it, color = TelegramDanger, style = MaterialTheme.typography.bodySmall) + } + + if (state.isLoading && state.chats.isEmpty()) { + CircularProgressIndicator(color = TelegramBlue) + } + + IkarSectionCard { + IkarSectionTitle("Папки", modifier = Modifier.padding(bottom = 8.dp)) + FolderChipRow( + folders = state.folders, + selectedFolderKey = state.selectedFolderKey, + onFolderSelected = onFolderSelected + ) + IkarSearchCard( + value = state.newFolderKey, + onValueChange = onNewFolderKeyChanged, + placeholder = "новая-папка" + ) + Text( + text = "Выберите чаты ниже, введите ключ папки и назначьте. Пустое назначение убирает чат из пользовательских папок.", + style = MaterialTheme.typography.bodySmall, + color = TelegramInkMuted + ) + } + + IkarSectionCard { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + IkarSectionTitle("Чаты (выбрано: ${state.selectedChatIds.size})") + Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) { + TextButton(enabled = !state.isSaving, onClick = onClearSelected) { + Text("Очистить") + } + TextButton(enabled = !state.isSaving, onClick = onAssignSelected) { + Text(if (state.isSaving) "Сохранение..." else "Назначить") + } + } + } + + state.chats.forEachIndexed { index, chat -> + FolderChatRow( + chat = chat, + checked = state.selectedChatIds.contains(chat.id), + onClick = { onChatToggled(chat.id) } + ) + if (index != state.chats.lastIndex) { + IkarRowDivider(startIndent = 42.dp) + } + } + } + + TextButton(onClick = onRefreshClick) { + Text("Обновить") + } + } + } +} + +@Composable +private fun FolderChipRow( + folders: List<ChatFolderDto>, + selectedFolderKey: String?, + onFolderSelected: (String?) -> Unit +) { + Column(verticalArrangement = Arrangement.spacedBy(4.dp)) { + folders.forEach { folder -> + TextButton(onClick = { onFolderSelected(folder.key.takeUnless { it in BuiltInFolderKeys }) }) { + Text( + text = "${folder.title} (${folder.totalCount})", + color = if (folder.key == selectedFolderKey) TelegramBlue else MaterialTheme.colorScheme.onSurface, + fontWeight = if (folder.key == selectedFolderKey) FontWeight.SemiBold else FontWeight.Normal + ) + } + } + } +} + +@Composable +private fun FolderChatRow( + chat: ChatSummaryDto, + checked: Boolean, + onClick: () -> Unit +) { + Row( + modifier = Modifier + .fillMaxWidth() + .clickable(onClick = onClick) + .padding(vertical = 10.dp), + horizontalArrangement = Arrangement.spacedBy(10.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Checkbox(checked = checked, onCheckedChange = { onClick() }) + Column(modifier = Modifier.weight(1f)) { + Text( + text = chat.title, + style = MaterialTheme.typography.titleMedium, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + Text( + text = listOfNotNull(chat.folderKey?.let { "папка: $it" }, chatPreview(chat).takeIf { it.isNotBlank() }) + .joinToString(" • "), + style = MaterialTheme.typography.bodySmall, + color = TelegramInkMuted, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + } + } +} + +private val BuiltInFolderKeys = setOf("all", "unread", "pinned", "archive") diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/folders/ChatFoldersViewModel.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/folders/ChatFoldersViewModel.kt new file mode 100644 index 00000000..9dc6f677 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/folders/ChatFoldersViewModel.kt @@ -0,0 +1,113 @@ +package com.seven.ikar.kotlin.feature.folders + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.seven.ikar.kotlin.app.AppContainer +import com.seven.ikar.kotlin.core.model.ChatFolderDto +import com.seven.ikar.kotlin.core.model.ChatStateRequest +import com.seven.ikar.kotlin.core.model.ChatSummaryDto +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch + +data class ChatFoldersUiState( + val folders: List<ChatFolderDto> = emptyList(), + val chats: List<ChatSummaryDto> = emptyList(), + val selectedChatIds: Set<String> = emptySet(), + val newFolderKey: String = "", + val selectedFolderKey: String? = null, + val isLoading: Boolean = false, + val isSaving: Boolean = false, + val errorMessage: String? = null +) + +class ChatFoldersViewModel(private val container: AppContainer) : ViewModel() { + private val _uiState = MutableStateFlow(ChatFoldersUiState()) + val uiState: StateFlow<ChatFoldersUiState> = _uiState.asStateFlow() + + init { + refresh() + } + + fun refresh() { + viewModelScope.launch { + _uiState.value = _uiState.value.copy(isLoading = true, errorMessage = null) + runCatching { + container.executeAuthorized { session -> + val folders = container.apiClient.getChatFolders(session.accessToken) + val chats = container.apiClient.getChats(session.accessToken) + folders to chats + } + }.onSuccess { (folders, chats) -> + _uiState.value = _uiState.value.copy( + folders = folders, + chats = chats, + selectedChatIds = _uiState.value.selectedChatIds.intersect(chats.mapTo(mutableSetOf(), ChatSummaryDto::id)), + isLoading = false + ) + }.onFailure { error -> + _uiState.value = _uiState.value.copy(isLoading = false, errorMessage = error.message) + } + } + } + + fun updateNewFolderKey(value: String) { + val normalized = normalizeFolderKey(value) + _uiState.value = _uiState.value.copy(newFolderKey = normalized, selectedFolderKey = normalized.ifBlank { null }) + } + + fun selectFolder(folderKey: String?) { + _uiState.value = _uiState.value.copy(selectedFolderKey = folderKey, newFolderKey = folderKey.orEmpty()) + } + + fun toggleChat(chatId: String) { + val current = _uiState.value.selectedChatIds + _uiState.value = _uiState.value.copy( + selectedChatIds = if (current.contains(chatId)) current - chatId else current + chatId + ) + } + + fun assignSelectedToFolder() { + val state = _uiState.value + val folderKey = normalizeFolderKey(state.selectedFolderKey ?: state.newFolderKey) + if (folderKey.isBlank() || state.selectedChatIds.isEmpty() || state.isSaving) { + return + } + updateSelectedChats(ChatStateRequest(folderKey = folderKey)) + } + + fun clearSelectedFolders() { + val state = _uiState.value + if (state.selectedChatIds.isEmpty() || state.isSaving) { + return + } + updateSelectedChats(ChatStateRequest(folderKey = "")) + } + + private fun updateSelectedChats(request: ChatStateRequest) { + val chatIds = _uiState.value.selectedChatIds.toList() + viewModelScope.launch { + _uiState.value = _uiState.value.copy(isSaving = true, errorMessage = null) + runCatching { + container.executeAuthorized { session -> + chatIds.forEach { chatId -> + container.apiClient.updateChatState(session.accessToken, chatId, request) + } + } + }.onSuccess { + _uiState.value = _uiState.value.copy(isSaving = false, selectedChatIds = emptySet()) + refresh() + }.onFailure { error -> + _uiState.value = _uiState.value.copy(isSaving = false, errorMessage = error.message) + } + } + } +} + +private fun normalizeFolderKey(value: String): String = + value.trim() + .lowercase() + .replace(Regex("\\s+"), "-") + .replace(Regex("[^a-z0-9_-]"), "") + .take(32) diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/forward/ForwardScreen.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/forward/ForwardScreen.kt new file mode 100644 index 00000000..8b2c3117 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/forward/ForwardScreen.kt @@ -0,0 +1,119 @@ +package com.seven.ikar.kotlin.feature.forward + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material.icons.Icons +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import com.seven.ikar.kotlin.core.contacts.DiscoverUserItem +import com.seven.ikar.kotlin.ui.AvatarView +import com.seven.ikar.kotlin.ui.IkarScreenSurface +import com.seven.ikar.kotlin.ui.IkarSearchCard +import com.seven.ikar.kotlin.ui.IkarSectionCard +import com.seven.ikar.kotlin.ui.IkarSimpleHeader +import com.seven.ikar.kotlin.ui.IkarRowDivider +import com.seven.ikar.kotlin.ui.formatDiscoverPresence +import com.seven.ikar.kotlin.ui.formatPresenceColor +import com.seven.ikar.kotlin.ui.theme.TelegramBlue +import com.seven.ikar.kotlin.ui.theme.TelegramInkMuted + +@Composable +fun ForwardScreen( + state: ForwardUiState, + onBackClick: () -> Unit, + onQueryChanged: (String) -> Unit, + onUserClick: (DiscoverUserItem) -> Unit +) { + IkarScreenSurface(modifier = Modifier.fillMaxSize()) { + Column(modifier = Modifier.fillMaxSize()) { + Column( + modifier = Modifier.padding(start = 18.dp, top = 16.dp, end = 18.dp, bottom = 12.dp), + verticalArrangement = Arrangement.spacedBy(12.dp) + ) { + IkarSimpleHeader(title = "Переслать", onBackClick = onBackClick) + + IkarSearchCard( + value = state.query, + onValueChange = onQueryChanged, + placeholder = "Поиск контакта" + ) + + state.errorMessage?.let { + Text(it, color = MaterialTheme.colorScheme.error, style = MaterialTheme.typography.bodyMedium) + } + } + + IkarSectionCard( + modifier = Modifier + .weight(1f) + .padding(horizontal = 18.dp, vertical = 0.dp) + .padding(bottom = 24.dp), + padding = androidx.compose.foundation.layout.PaddingValues(0.dp) + ) { + Text( + "Выберите получателя", + modifier = Modifier.padding(start = 18.dp, top = 16.dp, end = 18.dp, bottom = 8.dp), + style = MaterialTheme.typography.labelLarge, + color = TelegramBlue + ) + + LazyColumn { + if (state.items.isEmpty()) { + item { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 24.dp, vertical = 28.dp), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(8.dp) + ) { + Text("Контакты не найдены", style = MaterialTheme.typography.headlineMedium) + Text( + "Откройте доступ к контактам или уточните поиск.", + color = TelegramInkMuted, + style = MaterialTheme.typography.bodyMedium + ) + } + } + } else { + items(state.items, key = { it.id }) { item -> + Column { + Row( + modifier = Modifier + .fillMaxWidth() + .clickable { onUserClick(item) } + .padding(horizontal = 18.dp, vertical = 12.dp), + horizontalArrangement = Arrangement.spacedBy(14.dp), + verticalAlignment = Alignment.CenterVertically + ) { + AvatarView(imageUrl = item.avatarUrl, title = item.displayName, size = 54.dp) + Column(modifier = Modifier.weight(1f), verticalArrangement = Arrangement.spacedBy(3.dp)) { + Text(item.displayName, style = MaterialTheme.typography.titleLarge, maxLines = 1, overflow = TextOverflow.Ellipsis) + Text( + formatDiscoverPresence(item), + style = MaterialTheme.typography.bodySmall, + color = formatPresenceColor(item) + ) + } + } + IkarRowDivider(startIndent = 86.dp) + } + } + } + } + } + } + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/forward/ForwardViewModel.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/forward/ForwardViewModel.kt new file mode 100644 index 00000000..12ea90d7 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/forward/ForwardViewModel.kt @@ -0,0 +1,90 @@ +package com.seven.ikar.kotlin.feature.forward + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.seven.ikar.kotlin.app.AppContainer +import com.seven.ikar.kotlin.core.contacts.DiscoverUserItem +import kotlinx.coroutines.Job +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch + +data class ForwardUiState( + val sourceChatId: String, + val sourceMessageId: String, + val query: String = "", + val items: List<DiscoverUserItem> = emptyList(), + val isLoading: Boolean = false, + val errorMessage: String? = null, + val pendingChatId: String? = null +) + +class ForwardViewModel( + private val container: AppContainer, + private val sourceChatId: String, + private val sourceMessageId: String +) : ViewModel() { + private val _uiState = MutableStateFlow( + ForwardUiState( + sourceChatId = sourceChatId, + sourceMessageId = sourceMessageId + ) + ) + val uiState: StateFlow<ForwardUiState> = _uiState.asStateFlow() + + private var searchJob: Job? = null + + init { + refresh() + } + + fun updateQuery(value: String) { + _uiState.value = _uiState.value.copy(query = value) + searchJob?.cancel() + searchJob = viewModelScope.launch { + delay(250) + refresh() + } + } + + fun refresh() { + viewModelScope.launch { + val query = _uiState.value.query + _uiState.value = _uiState.value.copy(isLoading = true, errorMessage = null) + runCatching { container.resolvedContactsRepository.loadMergedCandidates(query) } + .onSuccess { items -> + _uiState.value = _uiState.value.copy(items = items, isLoading = false, errorMessage = null) + } + .onFailure { error -> + _uiState.value = _uiState.value.copy(isLoading = false, errorMessage = error.message) + } + } + } + + fun forwardToUser(user: DiscoverUserItem) { + viewModelScope.launch { + runCatching { + container.executeAuthorized { session -> + val chat = container.apiClient.createDirectChat(session.accessToken, user.id) + container.apiClient.forwardMessage( + accessToken = session.accessToken, + sourceChatId = sourceChatId, + messageId = sourceMessageId, + targetChatId = chat.id + ) + chat.id + } + }.onSuccess { chatId -> + _uiState.value = _uiState.value.copy(pendingChatId = chatId) + }.onFailure { error -> + _uiState.value = _uiState.value.copy(errorMessage = error.message) + } + } + } + + fun consumePendingChatNavigation() { + _uiState.value = _uiState.value.copy(pendingChatId = null) + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/login/LoginScreen.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/login/LoginScreen.kt new file mode 100644 index 00000000..430b60f8 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/login/LoginScreen.kt @@ -0,0 +1,236 @@ +package com.seven.ikar.kotlin.feature.login + +import androidx.compose.foundation.background +import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Brush +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.input.KeyboardType +import androidx.compose.ui.unit.dp +import androidx.compose.foundation.text.KeyboardOptions + +@Composable +fun LoginScreen( + state: LoginUiState, + onPhoneNumberChanged: (String) -> Unit, + onDisplayNameChanged: (String) -> Unit, + onVerificationCodeChanged: (String) -> Unit, + onRequestCodeClick: () -> Unit, + onVerifyCodeClick: () -> Unit, + onChangePhoneNumberClick: () -> Unit +) { + Box( + modifier = Modifier + .fillMaxSize() + .background( + Brush.linearGradient( + colors = listOf( + Color(0xFF3DA9F5), + Color(0xFF229AF0), + Color(0xFF1A9CEF) + ) + ) + ) + ) { + Column( + modifier = Modifier + .fillMaxSize() + .verticalScroll(rememberScrollState()) + .padding(horizontal = 24.dp, vertical = 32.dp), + verticalArrangement = Arrangement.spacedBy(20.dp) + ) { + Column( + modifier = Modifier.fillMaxWidth(), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(12.dp) + ) { + Surface( + shape = CircleShape, + color = Color.White.copy(alpha = 0.14f) + ) { + Box( + modifier = Modifier.padding(28.dp), + contentAlignment = Alignment.Center + ) { + Text( + text = "ИКАР", + style = MaterialTheme.typography.headlineSmall, + color = Color.White, + fontWeight = FontWeight.SemiBold + ) + } + } + + Column( + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(4.dp) + ) { + Text( + text = state.pageTitle, + style = MaterialTheme.typography.headlineSmall, + color = Color.White, + fontWeight = FontWeight.SemiBold + ) + Text( + text = state.subtitle, + style = MaterialTheme.typography.bodyMedium, + color = Color(0xFFDDEEFF) + ) + } + } + + Surface( + modifier = Modifier.fillMaxWidth(), + shape = RoundedCornerShape(28.dp), + color = Color.White + ) { + Column( + modifier = Modifier.padding(22.dp), + verticalArrangement = Arrangement.spacedBy(16.dp) + ) { + Text( + text = "АККАУНТ", + style = MaterialTheme.typography.labelLarge, + color = Color(0xFF5A8EB2), + fontWeight = FontWeight.SemiBold + ) + + if (state.showPhoneStep) { + OutlinedTextField( + value = state.phoneNumber, + onValueChange = onPhoneNumberChanged, + modifier = Modifier.fillMaxWidth(), + label = { Text("Номер телефона") }, + keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Phone), + singleLine = true + ) + + Button( + onClick = onRequestCodeClick, + enabled = !state.isLoading, + contentPadding = PaddingValues(horizontal = 20.dp, vertical = 14.dp) + ) { + if (state.isLoading) { + CircularProgressIndicator( + strokeWidth = 2.dp, + modifier = Modifier.padding(horizontal = 8.dp) + ) + } else { + Text("Получить тестовый код") + } + } + } + + if (state.showCodeStep) { + Surface( + modifier = Modifier.fillMaxWidth(), + shape = RoundedCornerShape(18.dp), + color = Color(0xFFF5FAFF), + border = BorderStroke(1.dp, Color(0xFFD7E8F7)) + ) { + Column( + modifier = Modifier.padding(14.dp), + verticalArrangement = Arrangement.spacedBy(10.dp) + ) { + Text( + text = "Подтверждение номера", + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.SemiBold + ) + Text( + text = "Для тестового режима код показывается прямо в приложении. После подключения SMS-провайдера это сообщение исчезнет.", + style = MaterialTheme.typography.bodyMedium, + color = Color(0xFF617A8F) + ) + + if (state.hasTestCodeHint) { + Text( + text = "Тестовый код: ${state.testCodeHint}", + style = MaterialTheme.typography.bodyMedium, + color = Color(0xFF229AF0), + fontWeight = FontWeight.SemiBold + ) + } + + OutlinedTextField( + value = state.verificationCode, + onValueChange = onVerificationCodeChanged, + modifier = Modifier.fillMaxWidth(), + label = { Text("Код подтверждения") }, + keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number), + singleLine = true + ) + + if (state.showDisplayName) { + OutlinedTextField( + value = state.displayName, + onValueChange = onDisplayNameChanged, + modifier = Modifier.fillMaxWidth(), + label = { Text("Ваше имя") }, + singleLine = true + ) + } + + Button( + onClick = onVerifyCodeClick, + enabled = !state.isLoading, + contentPadding = PaddingValues(horizontal = 20.dp, vertical = 14.dp) + ) { + if (state.isLoading) { + CircularProgressIndicator( + strokeWidth = 2.dp, + modifier = Modifier.padding(horizontal = 8.dp) + ) + } else { + Text("Продолжить") + } + } + + Button( + onClick = onChangePhoneNumberClick, + enabled = !state.isLoading, + colors = ButtonDefaults.buttonColors( + containerColor = Color.Transparent, + contentColor = Color(0xFF229AF0) + ), + contentPadding = PaddingValues(horizontal = 0.dp, vertical = 12.dp) + ) { + Text("Изменить номер") + } + } + } + } + + state.errorMessage?.let { + Text( + text = it, + color = MaterialTheme.colorScheme.error, + style = MaterialTheme.typography.bodyMedium + ) + } + } + } + } + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/login/LoginViewModel.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/login/LoginViewModel.kt new file mode 100644 index 00000000..8e105e6f --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/login/LoginViewModel.kt @@ -0,0 +1,135 @@ +package com.seven.ikar.kotlin.feature.login + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.seven.ikar.kotlin.app.AppContainer +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch + +data class LoginUiState( + val phoneNumber: String = "", + val displayName: String = "", + val verificationCode: String = "", + val challengeId: String = "", + val testCodeHint: String = "", + val isAwaitingCode: Boolean = false, + val isNewAccount: Boolean = false, + val isLoading: Boolean = false, + val errorMessage: String? = null, + val isAuthenticated: Boolean = false +) { + val pageTitle: String + get() = if (isAwaitingCode) "Подтвердите номер" else "Вход в ИКАР" + + val subtitle: String + get() = if (isAwaitingCode) { + "Введите тестовый код. Когда подключим SMS-провайдера, здесь будет код из сообщения." + } else { + "Введите номер телефона, чтобы получить тестовый код входа." + } + + val showPhoneStep: Boolean + get() = !isAwaitingCode + + val showCodeStep: Boolean + get() = isAwaitingCode + + val showDisplayName: Boolean + get() = isAwaitingCode && isNewAccount + + val hasTestCodeHint: Boolean + get() = testCodeHint.isNotBlank() +} + +class LoginViewModel(private val container: AppContainer) : ViewModel() { + private val _uiState = MutableStateFlow(LoginUiState()) + val uiState: StateFlow<LoginUiState> = _uiState.asStateFlow() + + fun updatePhoneNumber(value: String) { + _uiState.value = _uiState.value.copy(phoneNumber = value, errorMessage = null) + } + + fun updateDisplayName(value: String) { + _uiState.value = _uiState.value.copy(displayName = value, errorMessage = null) + } + + fun updateVerificationCode(value: String) { + _uiState.value = _uiState.value.copy(verificationCode = value, errorMessage = null) + } + + fun requestCode() { + val state = _uiState.value + if (state.phoneNumber.isBlank() || state.isLoading) { + return + } + + viewModelScope.launch(Dispatchers.IO) { + _uiState.value = state.copy(isLoading = true, errorMessage = null) + runCatching { + container.apiClient.requestPhoneCode(state.phoneNumber.trim()) + }.onSuccess { challenge -> + _uiState.value = _uiState.value.copy( + isLoading = false, + challengeId = challenge.challengeId, + testCodeHint = challenge.testCode, + isAwaitingCode = true, + isNewAccount = !challenge.isRegistered, + verificationCode = "", + errorMessage = null + ) + }.onFailure { error -> + _uiState.value = _uiState.value.copy( + isLoading = false, + errorMessage = error.message ?: "Не удалось запросить код." + ) + } + } + } + + fun verifyCode() { + val state = _uiState.value + if (state.isLoading || + state.challengeId.isBlank() || + state.phoneNumber.isBlank() || + state.verificationCode.isBlank() || + (state.isNewAccount && state.displayName.isBlank()) + ) { + return + } + + viewModelScope.launch(Dispatchers.IO) { + _uiState.value = state.copy(isLoading = true, errorMessage = null) + runCatching { + container.apiClient.verifyPhoneCode( + challengeId = state.challengeId, + phoneNumber = state.phoneNumber.trim(), + code = state.verificationCode.trim(), + displayName = state.displayName.trim().ifBlank { null } + ) + }.onSuccess { session -> + container.sessionStore.save(session) + runCatching { container.pushRegistrationManager.registerCurrentDeviceAsync() } + _uiState.value = _uiState.value.copy(isLoading = false, isAuthenticated = true) + }.onFailure { error -> + _uiState.value = _uiState.value.copy( + isLoading = false, + errorMessage = error.message ?: "Не удалось подтвердить код." + ) + } + } + } + + fun changePhoneNumber() { + _uiState.value = _uiState.value.copy( + challengeId = "", + testCodeHint = "", + verificationCode = "", + isAwaitingCode = false, + isNewAccount = false, + errorMessage = null + ) + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/mainmenu/MainMenuViewModel.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/mainmenu/MainMenuViewModel.kt new file mode 100644 index 00000000..119f6b97 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/mainmenu/MainMenuViewModel.kt @@ -0,0 +1,108 @@ +package com.seven.ikar.kotlin.feature.mainmenu + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.seven.ikar.kotlin.app.AppContainer +import com.seven.ikar.kotlin.core.model.ChatSummaryDto +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch + +data class MainMenuUiState( + val unreadChatsCount: Int = 0 +) + +class MainMenuViewModel(private val container: AppContainer) : ViewModel() { + private val _uiState = MutableStateFlow(MainMenuUiState()) + val uiState: StateFlow<MainMenuUiState> = _uiState.asStateFlow() + + private var debounceJob: Job? = null + private var refreshJob: Job? = null + + init { + attachRealtime() + loadCachedUnreadChatsCount() + refresh() + } + + fun refresh() { + val currentSession = container.sessionStore.read() + if (currentSession == null) { + clear() + return + } + + refreshJob?.cancel() + refreshJob = viewModelScope.launch { + runCatching { + container.executeAuthorized { session -> + val chats = container.apiClient.getChats(session.accessToken) + session.user.id to chats + } + }.onSuccess { (ownerUserId, chats) -> + if (container.sessionStore.read()?.user?.id != ownerUserId) { + return@onSuccess + } + _uiState.value = MainMenuUiState(unreadChatsCount = countUnreadChats(chats)) + cacheChatList(ownerUserId, chats) + }.onFailure { + loadCachedUnreadChatsCount() + } + } + } + + fun clear() { + debounceJob?.cancel() + refreshJob?.cancel() + _uiState.value = MainMenuUiState() + } + + private fun loadCachedUnreadChatsCount() { + val session = container.sessionStore.read() ?: return + val ownerUserId = session.user.id + viewModelScope.launch(Dispatchers.IO) { + val chats = runCatching { + container.chatListCache.loadChats(ownerUserId) + }.getOrDefault(emptyList()) + if (container.sessionStore.read()?.user?.id == ownerUserId) { + _uiState.value = MainMenuUiState(unreadChatsCount = countUnreadChats(chats)) + } + } + } + + private fun cacheChatList(ownerUserId: String, chats: List<ChatSummaryDto>) { + viewModelScope.launch(Dispatchers.IO) { + runCatching { container.chatListCache.replaceChats(ownerUserId, chats) } + } + } + + private fun attachRealtime() { + viewModelScope.launch { + container.realtimeService.chatCreated.collect { scheduleRefresh() } + } + viewModelScope.launch { + container.realtimeService.chatsChanged.collect { scheduleRefresh() } + } + viewModelScope.launch { + container.realtimeService.messagesCreated.collect { scheduleRefresh() } + } + viewModelScope.launch { + container.realtimeService.messagesUpdated.collect { scheduleRefresh() } + } + } + + private fun scheduleRefresh() { + debounceJob?.cancel() + debounceJob = viewModelScope.launch { + delay(400) + refresh() + } + } + + private fun countUnreadChats(chats: List<ChatSummaryDto>): Int = + chats.count { chat -> chat.unreadCount > 0 } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/members/ChatMembersScreen.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/members/ChatMembersScreen.kt new file mode 100644 index 00000000..8b310897 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/members/ChatMembersScreen.kt @@ -0,0 +1,443 @@ +package com.seven.ikar.kotlin.feature.members + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.WindowInsetsSides +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.only +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.safeDrawing +import androidx.compose.foundation.layout.windowInsetsPadding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import com.seven.ikar.kotlin.core.model.ChatJoinRequestDto +import com.seven.ikar.kotlin.core.model.ChatJoinRequestStatus +import com.seven.ikar.kotlin.core.model.ChatMemberDto +import com.seven.ikar.kotlin.core.model.ChatMemberRole +import com.seven.ikar.kotlin.core.model.ModerationLogDto +import com.seven.ikar.kotlin.core.model.ModerationLogTargetType +import com.seven.ikar.kotlin.core.model.UserSummaryDto +import com.seven.ikar.kotlin.ui.AvatarView +import com.seven.ikar.kotlin.ui.IkarSearchCard +import com.seven.ikar.kotlin.ui.IkarRowDivider +import com.seven.ikar.kotlin.ui.IkarScreenSurface +import com.seven.ikar.kotlin.ui.IkarSectionCard +import com.seven.ikar.kotlin.ui.IkarSectionTitle +import com.seven.ikar.kotlin.ui.IkarSimpleHeader +import com.seven.ikar.kotlin.ui.formatLastActivity +import com.seven.ikar.kotlin.ui.theme.TelegramBlue +import com.seven.ikar.kotlin.ui.theme.TelegramDanger +import com.seven.ikar.kotlin.ui.theme.TelegramInkMuted + +@Composable +fun ChatMembersScreen( + state: ChatMembersUiState, + onBackClick: () -> Unit, + onRefreshClick: () -> Unit, + onToggleAdmin: (ChatMemberDto) -> Unit, + onToggleCanPost: (ChatMemberDto) -> Unit, + onToggleCanPin: (ChatMemberDto) -> Unit, + onToggleCanDelete: (ChatMemberDto) -> Unit, + onToggleCanInvite: (ChatMemberDto) -> Unit, + onMemberSearchChanged: (String) -> Unit, + onAddMember: (UserSummaryDto) -> Unit, + onAddAdmin: (UserSummaryDto) -> Unit, + onApproveJoinRequest: (ChatJoinRequestDto) -> Unit, + onDeclineJoinRequest: (ChatJoinRequestDto) -> Unit +) { + IkarScreenSurface(modifier = Modifier.fillMaxSize()) { + Column( + modifier = Modifier + .fillMaxSize() + .windowInsetsPadding(WindowInsets.safeDrawing.only(WindowInsetsSides.Vertical)) + .verticalScroll(rememberScrollState()) + .padding(horizontal = 18.dp, vertical = 16.dp), + verticalArrangement = Arrangement.spacedBy(16.dp) + ) { + IkarSimpleHeader( + title = state.chat?.title?.ifBlank { "Участники" } ?: "Участники", + onBackClick = onBackClick + ) + + state.errorMessage?.let { + Text(it, color = TelegramDanger, style = MaterialTheme.typography.bodySmall) + } + + if (state.isLoading && state.chat == null) { + CircularProgressIndicator(color = TelegramBlue) + } + + if (state.canAddMembers) { + IkarSectionCard { + IkarSectionTitle("Добавить участника или бота", modifier = Modifier.padding(bottom = 8.dp)) + IkarSearchCard( + value = state.memberSearchQuery, + onValueChange = onMemberSearchChanged, + placeholder = "Имя, username или бот" + ) + if (state.isMemberSearchLoading) { + CircularProgressIndicator(color = TelegramBlue) + } + if (state.memberSearchQuery.trim().length >= 2 && + !state.isMemberSearchLoading && + state.memberSearchResults.isEmpty() + ) { + Text("Подходящих пользователей или ботов не найдено.", style = MaterialTheme.typography.bodySmall, color = TelegramInkMuted) + } + state.memberSearchResults.forEachIndexed { index, user -> + AddMemberCandidateRow( + user = user, + isAdding = state.addingUserIds.contains(user.id), + onAddMember = { onAddMember(user) }, + onAddAdmin = { onAddAdmin(user) } + ) + if (index != state.memberSearchResults.lastIndex) { + IkarRowDivider(startIndent = 58.dp) + } + } + } + } + + if (state.canManageMembers) { + IkarSectionCard { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + IkarSectionTitle("Заявки на вступление") + if (state.isAdminPanelLoading) { + CircularProgressIndicator(color = TelegramBlue) + } + } + val pendingRequests = state.joinRequests.filter { it.status == ChatJoinRequestStatus.Pending } + val resolvedRequests = state.joinRequests.filterNot { it.status == ChatJoinRequestStatus.Pending } + val displayedRequests = pendingRequests + resolvedRequests + if (state.joinRequests.isEmpty()) { + Text("Заявок на вступление пока нет.", style = MaterialTheme.typography.bodySmall, color = TelegramInkMuted) + } + displayedRequests.forEachIndexed { index, request -> + JoinRequestRow( + request = request, + isResolving = state.resolvingJoinRequestIds.contains(request.id), + onApproveClick = { onApproveJoinRequest(request) }, + onDeclineClick = { onDeclineJoinRequest(request) } + ) + if (index != displayedRequests.lastIndex) { + IkarRowDivider(startIndent = 58.dp) + } + } + } + } + + IkarSectionCard { + IkarSectionTitle( + text = if (state.canManageMembers) "Участники и права" else "Участники", + modifier = Modifier.padding(bottom = 8.dp) + ) + val members = state.chat?.members.orEmpty() + members.forEachIndexed { index, member -> + MemberPermissionRow( + member = member, + canManage = state.canManageMembers && !member.isOwner, + isUpdating = state.updatingUserIds.contains(member.user.id), + onToggleAdmin = { onToggleAdmin(member) }, + onToggleCanPost = { onToggleCanPost(member) }, + onToggleCanPin = { onToggleCanPin(member) }, + onToggleCanDelete = { onToggleCanDelete(member) }, + onToggleCanInvite = { onToggleCanInvite(member) } + ) + if (index != members.lastIndex) { + IkarRowDivider(startIndent = 58.dp) + } + } + } + + if (state.canManageMembers) { + IkarSectionCard { + IkarSectionTitle("Журнал модерации", modifier = Modifier.padding(bottom = 8.dp)) + if (state.moderationLog.isEmpty()) { + Text("Событий модерации пока нет.", style = MaterialTheme.typography.bodySmall, color = TelegramInkMuted) + } + state.moderationLog.forEachIndexed { index, entry -> + ModerationLogRow(entry) + if (index != state.moderationLog.lastIndex) { + IkarRowDivider() + } + } + } + } + + TextButton(onClick = onRefreshClick) { + Text("Обновить") + } + } + } +} + +@Composable +private fun AddMemberCandidateRow( + user: UserSummaryDto, + isAdding: Boolean, + onAddMember: () -> Unit, + onAddAdmin: () -> Unit +) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 10.dp), + verticalArrangement = Arrangement.spacedBy(8.dp) + ) { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.spacedBy(12.dp), + verticalAlignment = Alignment.CenterVertically + ) { + AvatarView( + imageUrl = user.avatarPath, + title = user.displayName, + size = 46.dp + ) + Column(modifier = Modifier.weight(1f)) { + Text( + text = user.displayName.ifBlank { "@${user.username}" }, + style = MaterialTheme.typography.titleMedium, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + Text( + text = if (user.isBot) "бот · @${user.username}" else "@${user.username}", + style = MaterialTheme.typography.bodySmall, + color = TelegramInkMuted, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + } + } + Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) { + TextButton(enabled = !isAdding, onClick = onAddMember) { + Text(if (isAdding) "Добавление..." else "Добавить") + } + TextButton(enabled = !isAdding, onClick = onAddAdmin) { + Text("Добавить админом", color = TelegramBlue) + } + } + } +} + +@Composable +private fun JoinRequestRow( + request: ChatJoinRequestDto, + isResolving: Boolean, + onApproveClick: () -> Unit, + onDeclineClick: () -> Unit +) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 10.dp), + verticalArrangement = Arrangement.spacedBy(8.dp) + ) { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.spacedBy(12.dp), + verticalAlignment = Alignment.CenterVertically + ) { + AvatarView( + imageUrl = request.user.avatarPath, + title = request.user.displayName, + size = 46.dp + ) + Column(modifier = Modifier.weight(1f)) { + Text( + text = request.user.displayName.ifBlank { "@${request.user.username}" }, + style = MaterialTheme.typography.titleMedium, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + Text( + text = "Запрос: ${formatLastActivity(request.requestedAt)} - ${joinRequestStatusLabel(request.status)}", + style = MaterialTheme.typography.bodySmall, + color = TelegramInkMuted + ) + } + } + if (request.status == ChatJoinRequestStatus.Pending) { + Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) { + TextButton(enabled = !isResolving, onClick = onApproveClick) { + Text(if (isResolving) "Обработка..." else "Одобрить") + } + TextButton(enabled = !isResolving, onClick = onDeclineClick) { + Text("Отклонить", color = TelegramDanger) + } + } + } else { + val resolvedBy = request.resolvedBy?.displayName?.takeIf { it.isNotBlank() } + ?: request.resolvedBy?.username + Text( + text = listOfNotNull(request.resolvedAt?.let { "Решено: ${formatLastActivity(it)}" }, resolvedBy?.let { "кем: $it" }) + .joinToString(" - "), + style = MaterialTheme.typography.bodySmall, + color = TelegramInkMuted + ) + } + } +} + +@Composable +private fun MemberPermissionRow( + member: ChatMemberDto, + canManage: Boolean, + isUpdating: Boolean, + onToggleAdmin: () -> Unit, + onToggleCanPost: () -> Unit, + onToggleCanPin: () -> Unit, + onToggleCanDelete: () -> Unit, + onToggleCanInvite: () -> Unit +) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 10.dp), + verticalArrangement = Arrangement.spacedBy(8.dp) + ) { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.spacedBy(12.dp), + verticalAlignment = Alignment.CenterVertically + ) { + AvatarView( + imageUrl = member.user.avatarPath, + title = member.user.displayName, + size = 46.dp + ) + Column(modifier = Modifier.weight(1f)) { + Text( + text = member.user.displayName.ifBlank { "@${member.user.username}" }, + style = MaterialTheme.typography.titleMedium, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + Text( + text = roleLabel(member), + style = MaterialTheme.typography.bodySmall, + color = TelegramInkMuted + ) + } + if (canManage) { + TextButton(enabled = !isUpdating, onClick = onToggleAdmin) { + Text(if (member.role == ChatMemberRole.Admin) "Сделать участником" else "Сделать администратором") + } + } + } + + if (canManage) { + Row(horizontalArrangement = Arrangement.spacedBy(6.dp)) { + PermissionChip("публикации", member.permissions.canPostMessages, isUpdating, onToggleCanPost) + PermissionChip("закрепление", member.permissions.canPinMessages, isUpdating, onToggleCanPin) + PermissionChip("удаление", member.permissions.canDeleteMessages, isUpdating, onToggleCanDelete) + PermissionChip("приглашения", member.permissions.canInviteUsers, isUpdating, onToggleCanInvite) + } + } + } +} + +@Composable +private fun ModerationLogRow(entry: ModerationLogDto) { + Column( + modifier = Modifier.padding(vertical = 10.dp), + verticalArrangement = Arrangement.spacedBy(4.dp) + ) { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = moderationActionLabel(entry.action), + style = MaterialTheme.typography.titleSmall, + fontWeight = FontWeight.SemiBold + ) + Text( + text = formatLastActivity(entry.createdAt), + style = MaterialTheme.typography.bodySmall, + color = TelegramInkMuted + ) + } + Text( + text = "${entry.actorDisplayName} - ${moderationTargetLabel(entry.targetType)}", + style = MaterialTheme.typography.bodySmall, + color = TelegramInkMuted, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + entry.reason?.takeIf { it.isNotBlank() }?.let { reason -> + Text(reason, style = MaterialTheme.typography.bodySmall) + } + } +} + +@Composable +private fun PermissionChip( + label: String, + checked: Boolean, + disabled: Boolean, + onClick: () -> Unit +) { + TextButton(enabled = !disabled, onClick = onClick) { + Text( + text = "$label: ${if (checked) "вкл" else "выкл"}", + color = if (checked) TelegramBlue else TelegramInkMuted, + fontWeight = if (checked) FontWeight.SemiBold else FontWeight.Normal + ) + } +} + +private fun roleLabel(member: ChatMemberDto): String = when { + member.isOwner || member.role == ChatMemberRole.Owner -> "владелец" + member.role == ChatMemberRole.Admin -> "администратор" + else -> "участник" +} + +private fun joinRequestStatusLabel(status: ChatJoinRequestStatus): String = when (status) { + ChatJoinRequestStatus.Pending -> "ожидает" + ChatJoinRequestStatus.Approved -> "одобрена" + ChatJoinRequestStatus.Declined -> "отклонена" +} + +private fun moderationTargetLabel(targetType: ModerationLogTargetType): String = when (targetType) { + ModerationLogTargetType.Chat -> "чат" + ModerationLogTargetType.Message -> "сообщение" + ModerationLogTargetType.User -> "участник" + ModerationLogTargetType.InviteLink -> "пригласительная ссылка" + ModerationLogTargetType.JoinRequest -> "заявка на вступление" + ModerationLogTargetType.Story -> "история" +} + +private fun moderationActionLabel(action: String): String = when (action) { + "chat.security.updated" -> "Настройки безопасности чата обновлены" + "invite_link.joined" -> "Вход по пригласительной ссылке" + "join_request.created" -> "Заявка на вступление создана" + "join_request.approved" -> "Заявка на вступление одобрена" + "join_request.declined" -> "Заявка на вступление отклонена" + "member.added" -> "Участник добавлен" + "member.admin.added" -> "Администратор добавлен" + "member.permissions.updated" -> "Права участника обновлены" + "message.deleted" -> "Сообщение удалено" + "message.pinned" -> "Сообщение закреплено" + "message.unpinned" -> "Сообщение откреплено" + else -> action.replace('.', ' ').replace('_', ' ') +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/members/ChatMembersViewModel.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/members/ChatMembersViewModel.kt new file mode 100644 index 00000000..2374cbcb --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/members/ChatMembersViewModel.kt @@ -0,0 +1,294 @@ +package com.seven.ikar.kotlin.feature.members + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.seven.ikar.kotlin.app.AppContainer +import com.seven.ikar.kotlin.core.model.AddChatMembersRequest +import com.seven.ikar.kotlin.core.model.ChatDetailsDto +import com.seven.ikar.kotlin.core.model.ChatJoinRequestDto +import com.seven.ikar.kotlin.core.model.ChatMemberDto +import com.seven.ikar.kotlin.core.model.ChatMemberRole +import com.seven.ikar.kotlin.core.model.ChatType +import com.seven.ikar.kotlin.core.model.ModerationLogDto +import com.seven.ikar.kotlin.core.model.UpdateChatMemberPermissionsRequest +import com.seven.ikar.kotlin.core.model.UserSummaryDto +import kotlinx.coroutines.Job +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch + +data class ChatMembersUiState( + val chat: ChatDetailsDto? = null, + val joinRequests: List<ChatJoinRequestDto> = emptyList(), + val moderationLog: List<ModerationLogDto> = emptyList(), + val isLoading: Boolean = false, + val isAdminPanelLoading: Boolean = false, + val memberSearchQuery: String = "", + val memberSearchResults: List<UserSummaryDto> = emptyList(), + val isMemberSearchLoading: Boolean = false, + val addingUserIds: Set<String> = emptySet(), + val updatingUserIds: Set<String> = emptySet(), + val resolvingJoinRequestIds: Set<String> = emptySet(), + val errorMessage: String? = null +) { + val canManageMembers: Boolean + get() = chat?.currentUserPermissions?.canManageMembers == true + + val canAddMembers: Boolean + get() = canManageMembers && chat?.type == ChatType.Channel +} + +class ChatMembersViewModel( + private val container: AppContainer, + private val chatId: String +) : ViewModel() { + private val _uiState = MutableStateFlow(ChatMembersUiState()) + val uiState: StateFlow<ChatMembersUiState> = _uiState.asStateFlow() + private var memberSearchJob: Job? = null + + init { + refresh() + } + + fun refresh() { + viewModelScope.launch { + _uiState.value = _uiState.value.copy(isLoading = true, isAdminPanelLoading = true, errorMessage = null) + runCatching { + container.executeAuthorized { session -> + val chat = container.apiClient.getChat(chatId, session.accessToken) + val canManageMembers = chat.currentUserPermissions?.canManageMembers == true + ChatMembersPayload( + chat = chat, + joinRequests = if (canManageMembers) { + container.apiClient.getChatJoinRequests(session.accessToken, chatId) + } else { + emptyList() + }, + moderationLog = if (canManageMembers) { + container.apiClient.getChatModerationLog(session.accessToken, chatId) + } else { + emptyList() + } + ) + } + }.onSuccess { payload -> + _uiState.value = _uiState.value.copy( + chat = payload.chat, + joinRequests = payload.joinRequests, + moderationLog = payload.moderationLog, + memberSearchResults = filterMemberSearchResults(_uiState.value.memberSearchResults, payload.chat), + isLoading = false, + isAdminPanelLoading = false, + errorMessage = null + ) + }.onFailure { error -> + _uiState.value = _uiState.value.copy( + isLoading = false, + isAdminPanelLoading = false, + errorMessage = error.message + ) + } + } + } + + fun updateMemberSearchQuery(value: String) { + val query = value.take(80) + _uiState.value = _uiState.value.copy(memberSearchQuery = query, errorMessage = null) + memberSearchJob?.cancel() + + if (query.trim().length < 2 || !_uiState.value.canAddMembers) { + _uiState.value = _uiState.value.copy(memberSearchResults = emptyList(), isMemberSearchLoading = false) + return + } + + memberSearchJob = viewModelScope.launch { + delay(250) + searchMembers(query.trim()) + } + } + + fun addMember(user: UserSummaryDto, asAdmin: Boolean) { + val state = _uiState.value + if (!state.canAddMembers || state.addingUserIds.contains(user.id)) { + return + } + + val role = if (asAdmin) ChatMemberRole.Admin else ChatMemberRole.Member + viewModelScope.launch { + _uiState.value = _uiState.value.copy( + addingUserIds = _uiState.value.addingUserIds + user.id, + errorMessage = null + ) + runCatching { + container.executeAuthorized { session -> + container.apiClient.addChatMembers( + accessToken = session.accessToken, + chatId = chatId, + request = AddChatMembersRequest( + memberIds = listOf(user.id), + role = role, + canPinMessages = asAdmin, + canDeleteMessages = asAdmin, + canInviteUsers = asAdmin, + canPostMessages = asAdmin + ) + ) + } + }.onSuccess { chat -> + val current = _uiState.value + _uiState.value = current.copy( + chat = chat, + addingUserIds = current.addingUserIds - user.id, + memberSearchResults = filterMemberSearchResults(current.memberSearchResults, chat) + ) + refresh() + }.onFailure { error -> + _uiState.value = _uiState.value.copy( + addingUserIds = _uiState.value.addingUserIds - user.id, + errorMessage = error.message + ) + } + } + } + + fun approveJoinRequest(request: ChatJoinRequestDto) { + resolveJoinRequest(request, approve = true) + } + + fun declineJoinRequest(request: ChatJoinRequestDto) { + resolveJoinRequest(request, approve = false) + } + + fun toggleAdmin(member: ChatMemberDto) { + val nextRole = if (member.role == ChatMemberRole.Admin) ChatMemberRole.Member else ChatMemberRole.Admin + updateMember(member, role = nextRole) + } + + fun toggleCanPost(member: ChatMemberDto) { + updateMember(member, canPostMessages = !member.permissions.canPostMessages) + } + + fun toggleCanPin(member: ChatMemberDto) { + updateMember(member, canPinMessages = !member.permissions.canPinMessages) + } + + fun toggleCanDelete(member: ChatMemberDto) { + updateMember(member, canDeleteMessages = !member.permissions.canDeleteMessages) + } + + fun toggleCanInvite(member: ChatMemberDto) { + updateMember(member, canInviteUsers = !member.permissions.canInviteUsers) + } + + private fun updateMember( + member: ChatMemberDto, + role: ChatMemberRole = member.role, + canPostMessages: Boolean = member.permissions.canPostMessages, + canPinMessages: Boolean = member.permissions.canPinMessages, + canDeleteMessages: Boolean = member.permissions.canDeleteMessages, + canInviteUsers: Boolean = member.permissions.canInviteUsers + ) { + if (member.isOwner || _uiState.value.updatingUserIds.contains(member.user.id)) { + return + } + + viewModelScope.launch { + _uiState.value = _uiState.value.copy( + updatingUserIds = _uiState.value.updatingUserIds + member.user.id, + errorMessage = null + ) + runCatching { + container.executeAuthorized { session -> + container.apiClient.updateChatMemberPermissions( + accessToken = session.accessToken, + chatId = chatId, + memberUserId = member.user.id, + request = UpdateChatMemberPermissionsRequest( + role = role, + canPinMessages = canPinMessages, + canDeleteMessages = canDeleteMessages, + canInviteUsers = canInviteUsers, + canPostMessages = canPostMessages + ) + ) + } + }.onSuccess { chat -> + _uiState.value = _uiState.value.copy( + chat = chat, + updatingUserIds = _uiState.value.updatingUserIds - member.user.id + ) + }.onFailure { error -> + _uiState.value = _uiState.value.copy( + updatingUserIds = _uiState.value.updatingUserIds - member.user.id, + errorMessage = error.message + ) + } + } + } + + private suspend fun searchMembers(query: String) { + _uiState.value = _uiState.value.copy(isMemberSearchLoading = true, errorMessage = null) + runCatching { + container.executeAuthorized { session -> + container.apiClient.searchUsers(session.accessToken, query) + } + }.onSuccess { users -> + val current = _uiState.value + _uiState.value = current.copy( + memberSearchResults = filterMemberSearchResults(users, current.chat), + isMemberSearchLoading = false + ) + }.onFailure { error -> + _uiState.value = _uiState.value.copy( + isMemberSearchLoading = false, + errorMessage = error.message + ) + } + } + + private fun filterMemberSearchResults(users: List<UserSummaryDto>, chat: ChatDetailsDto?): List<UserSummaryDto> { + val memberIds = chat?.members.orEmpty().mapTo(mutableSetOf()) { it.user.id } + return users.filterNot { user -> memberIds.contains(user.id) } + } + + private fun resolveJoinRequest(request: ChatJoinRequestDto, approve: Boolean) { + if (_uiState.value.resolvingJoinRequestIds.contains(request.id)) { + return + } + + viewModelScope.launch { + _uiState.value = _uiState.value.copy( + resolvingJoinRequestIds = _uiState.value.resolvingJoinRequestIds + request.id, + errorMessage = null + ) + runCatching { + container.executeAuthorized { session -> + container.apiClient.resolveChatJoinRequest( + accessToken = session.accessToken, + chatId = chatId, + joinRequestId = request.id, + approve = approve + ) + } + }.onSuccess { + _uiState.value = _uiState.value.copy( + resolvingJoinRequestIds = _uiState.value.resolvingJoinRequestIds - request.id + ) + refresh() + }.onFailure { error -> + _uiState.value = _uiState.value.copy( + resolvingJoinRequestIds = _uiState.value.resolvingJoinRequestIds - request.id, + errorMessage = error.message + ) + } + } + } +} + +private data class ChatMembersPayload( + val chat: ChatDetailsDto, + val joinRequests: List<ChatJoinRequestDto>, + val moderationLog: List<ModerationLogDto> +) diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/privacy/PrivacySecurityScreen.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/privacy/PrivacySecurityScreen.kt new file mode 100644 index 00000000..382498df --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/privacy/PrivacySecurityScreen.kt @@ -0,0 +1,123 @@ +package com.seven.ikar.kotlin.feature.privacy + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.WindowInsetsSides +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.only +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.safeDrawing +import androidx.compose.foundation.layout.windowInsetsPadding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import com.seven.ikar.kotlin.core.model.PrivacySettingsDto +import com.seven.ikar.kotlin.ui.IkarRowDivider +import com.seven.ikar.kotlin.ui.IkarScreenSurface +import com.seven.ikar.kotlin.ui.IkarSectionCard +import com.seven.ikar.kotlin.ui.IkarSectionTitle +import com.seven.ikar.kotlin.ui.IkarSettingRow +import com.seven.ikar.kotlin.ui.IkarSimpleHeader +import com.seven.ikar.kotlin.ui.theme.TelegramBlue +import com.seven.ikar.kotlin.ui.theme.TelegramDanger +import com.seven.ikar.kotlin.ui.theme.TelegramInkMuted + +@Composable +fun PrivacySecurityScreen( + state: PrivacySecurityUiState, + onBackClick: () -> Unit, + onRefreshClick: () -> Unit, + onBlockedUsersClick: () -> Unit, + onExceptionsClick: () -> Unit, + onUpdate: ((PrivacySettingsDto) -> PrivacySettingsDto) -> Unit +) { + IkarScreenSurface(modifier = Modifier.fillMaxSize()) { + Column( + modifier = Modifier + .fillMaxSize() + .windowInsetsPadding(WindowInsets.safeDrawing.only(WindowInsetsSides.Vertical)) + .verticalScroll(rememberScrollState()) + .padding(horizontal = 18.dp, vertical = 16.dp), + verticalArrangement = Arrangement.spacedBy(16.dp) + ) { + IkarSimpleHeader(title = "Конфиденциальность и безопасность", onBackClick = onBackClick) + state.errorMessage?.let { + Text(it, color = TelegramDanger, style = MaterialTheme.typography.bodySmall) + } + if (state.isLoading && state.settings == null) { + CircularProgressIndicator(color = TelegramBlue) + } + val settings = state.settings + if (settings != null) { + IkarSectionCard { + IkarSectionTitle("Конфиденциальность", modifier = Modifier.padding(bottom = 8.dp)) + PrivacyRow("Номер телефона", privacyValueLabel(settings.phoneNumberVisibility)) { + onUpdate { it.copy(phoneNumberVisibility = nextVisibility(it.phoneNumberVisibility)) } + } + IkarRowDivider() + PrivacyRow("Последняя активность и онлайн", privacyValueLabel(settings.lastSeenVisibility)) { + onUpdate { it.copy(lastSeenVisibility = nextVisibility(it.lastSeenVisibility)) } + } + IkarRowDivider() + PrivacyRow("Фотографии профиля", privacyValueLabel(settings.profilePhotoVisibility)) { + onUpdate { it.copy(profilePhotoVisibility = nextVisibility(it.profilePhotoVisibility)) } + } + IkarRowDivider() + PrivacyRow("Заблокированные пользователи", "${settings.blockedUserIds.size}") { + onBlockedUsersClick() + } + IkarRowDivider() + PrivacyRow("Исключения", "${settings.alwaysAllowUserIds.size + settings.neverAllowUserIds.size}") { + onExceptionsClick() + } + } + + IkarSectionCard { + IkarSectionTitle("Безопасность", modifier = Modifier.padding(bottom = 8.dp)) + PrivacyRow("Код-пароль", if (settings.passcodeLockEnabled) "включено" else "выключено") { + onUpdate { it.copy(passcodeLockEnabled = !it.passcodeLockEnabled) } + } + IkarRowDivider() + PrivacyRow("Предпросмотр сообщений", if (settings.showMessagePreview) "включено" else "выключено") { + onUpdate { it.copy(showMessagePreview = !it.showMessagePreview) } + } + } + } + TextButton(enabled = !state.isSaving, onClick = onRefreshClick) { + Text(if (state.isSaving) "Сохранение..." else "Обновить") + } + } + } +} + +@Composable +private fun PrivacyRow( + title: String, + value: String, + onClick: () -> Unit +) { + IkarSettingRow( + title = title, + subtitle = "Сейчас: $value", + onClick = onClick, + leading = { + Text(value.take(1).uppercase(), color = TelegramInkMuted) + } + ) +} + +private fun privacyValueLabel(value: String): String = when (value.lowercase()) { + "everyone" -> "все" + "contacts" -> "контакты" + "nobody" -> "никто" + "enabled" -> "включено" + "disabled" -> "выключено" + else -> value +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/privacy/PrivacySecurityViewModel.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/privacy/PrivacySecurityViewModel.kt new file mode 100644 index 00000000..85b88bb9 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/privacy/PrivacySecurityViewModel.kt @@ -0,0 +1,79 @@ +package com.seven.ikar.kotlin.feature.privacy + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.seven.ikar.kotlin.app.AppContainer +import com.seven.ikar.kotlin.core.model.PrivacySettingsDto +import com.seven.ikar.kotlin.core.model.UpdatePrivacySettingsRequest +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch + +data class PrivacySecurityUiState( + val settings: PrivacySettingsDto? = null, + val isLoading: Boolean = false, + val isSaving: Boolean = false, + val errorMessage: String? = null +) + +class PrivacySecurityViewModel(private val container: AppContainer) : ViewModel() { + private val _uiState = MutableStateFlow(PrivacySecurityUiState()) + val uiState: StateFlow<PrivacySecurityUiState> = _uiState.asStateFlow() + + init { + refresh() + } + + fun refresh() { + viewModelScope.launch { + _uiState.value = _uiState.value.copy(isLoading = true, errorMessage = null) + runCatching { + container.executeAuthorized { session -> + container.apiClient.getMyPrivacySettings(session.accessToken) + } + }.onSuccess { settings -> + container.privacyRuntimeSettings.saveFrom(settings) + _uiState.value = _uiState.value.copy(settings = settings, isLoading = false) + }.onFailure { error -> + _uiState.value = _uiState.value.copy(isLoading = false, errorMessage = error.message) + } + } + } + + fun update(transform: (PrivacySettingsDto) -> PrivacySettingsDto) { + val current = _uiState.value.settings ?: return + val next = transform(current) + viewModelScope.launch { + _uiState.value = _uiState.value.copy(settings = next, isSaving = true, errorMessage = null) + runCatching { + container.executeAuthorized { session -> + container.apiClient.updateMyPrivacySettings( + session.accessToken, + UpdatePrivacySettingsRequest( + phoneNumberVisibility = next.phoneNumberVisibility, + lastSeenVisibility = next.lastSeenVisibility, + profilePhotoVisibility = next.profilePhotoVisibility, + blockedUserIds = next.blockedUserIds, + alwaysAllowUserIds = next.alwaysAllowUserIds, + neverAllowUserIds = next.neverAllowUserIds, + passcodeLockEnabled = next.passcodeLockEnabled, + showMessagePreview = next.showMessagePreview + ) + ) + } + }.onSuccess { saved -> + container.privacyRuntimeSettings.saveFrom(saved) + _uiState.value = _uiState.value.copy(settings = saved, isSaving = false) + }.onFailure { error -> + _uiState.value = _uiState.value.copy(settings = current, isSaving = false, errorMessage = error.message) + } + } + } +} + +internal fun nextVisibility(value: String): String = when (value) { + "everyone" -> "contacts" + "contacts" -> "nobody" + else -> "everyone" +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/profile/AccountSettingsScreen.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/profile/AccountSettingsScreen.kt new file mode 100644 index 00000000..f001fc81 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/profile/AccountSettingsScreen.kt @@ -0,0 +1,257 @@ +package com.seven.ikar.kotlin.feature.profile + +import android.net.Uri +import androidx.activity.compose.rememberLauncherForActivityResult +import androidx.activity.result.PickVisualMediaRequest +import androidx.activity.result.contract.ActivityResultContracts +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.WindowInsetsSides +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.only +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.safeDrawing +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.windowInsetsPadding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.text.BasicTextField +import androidx.compose.foundation.verticalScroll +import androidx.compose.foundation.clickable +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.outlined.Edit +import androidx.compose.material.icons.outlined.Info +import androidx.compose.material.icons.outlined.Phone +import androidx.compose.material3.Button +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import com.seven.ikar.kotlin.ui.AvatarView +import com.seven.ikar.kotlin.ui.IkarSectionCard +import com.seven.ikar.kotlin.ui.IkarSimpleHeader +import com.seven.ikar.kotlin.ui.IkarScreenSurface +import com.seven.ikar.kotlin.ui.theme.TelegramBlue +import com.seven.ikar.kotlin.ui.theme.TelegramDanger +import com.seven.ikar.kotlin.ui.theme.TelegramInkMuted +import com.seven.ikar.kotlin.ui.theme.TelegramSurface + +@Composable +fun AccountSettingsScreen( + state: ProfileUiState, + onBackClick: () -> Unit, + onDisplayNameChanged: (String) -> Unit, + onAboutChanged: (String) -> Unit, + onSaveClick: () -> Unit, + onDeleteAvatarClick: () -> Unit, + onAvatarSelected: (Uri) -> Unit +) { + val avatarPicker = rememberLauncherForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri -> + if (uri != null) { + onAvatarSelected(uri) + } + } + + IkarScreenSurface(modifier = Modifier.fillMaxSize()) { + Column( + modifier = Modifier + .fillMaxSize() + .windowInsetsPadding(WindowInsets.safeDrawing.only(WindowInsetsSides.Vertical)) + .verticalScroll(rememberScrollState()) + .padding(horizontal = 18.dp, vertical = 16.dp), + verticalArrangement = Arrangement.spacedBy(16.dp) + ) { + IkarSimpleHeader(title = "Аккаунт", onBackClick = onBackClick) + + IkarSectionCard { + Column( + modifier = Modifier.fillMaxWidth(), + verticalArrangement = Arrangement.spacedBy(10.dp), + horizontalAlignment = androidx.compose.ui.Alignment.CenterHorizontally + ) { + AvatarView( + imageUrl = state.avatarUrl, + title = state.displayName.ifBlank { state.phoneNumber.ifBlank { "ИКАР" } }, + size = 92.dp + ) + + Button( + onClick = { + avatarPicker.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly)) + } + ) { + Text(if (state.avatarUrl.isNullOrBlank()) "Добавить фото профиля" else "Изменить фото профиля") + } + + if (!state.avatarUrl.isNullOrBlank()) { + Text( + text = "Удалить фото", + modifier = Modifier + .padding(top = 2.dp) + .clickable(onClick = onDeleteAvatarClick), + style = MaterialTheme.typography.titleMedium.copy(color = TelegramDanger), + fontWeight = FontWeight.SemiBold + ) + Text( + text = "Нажмите на надпись, чтобы удалить текущее фото", + color = TelegramInkMuted, + style = MaterialTheme.typography.bodySmall + ) + } + } + } + + IkarSectionCard { + IkarInfoLine( + icon = Icons.Outlined.Phone, + title = state.phoneNumber.ifBlank { "Номер не загружен" }, + subtitle = "Нажмите, чтобы изменить номер телефона" + ) + + androidx.compose.foundation.layout.Spacer(modifier = Modifier.padding(top = 12.dp)) + androidx.compose.foundation.layout.Box( + modifier = Modifier + .fillMaxWidth() + .padding(start = 54.dp) + .height(1.dp) + .background(com.seven.ikar.kotlin.ui.theme.TelegramBorder) + ) + androidx.compose.foundation.layout.Spacer(modifier = Modifier.padding(top = 12.dp)) + + IkarInfoLine( + icon = Icons.Outlined.Info, + title = "Указать день рождения", + subtitle = "Поля дня рождения и его видимости будут добавлены отдельно." + ) + } + + IkarSectionCard { + Text("Ваше имя", style = MaterialTheme.typography.labelLarge, color = TelegramBlue) + androidx.compose.foundation.layout.Spacer(modifier = Modifier.padding(top = 10.dp)) + IkarTextInput( + value = state.displayName, + onValueChange = onDisplayNameChanged, + placeholder = "Введите отображаемое имя" + ) + } + + IkarSectionCard { + Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween) { + Text("О себе", style = MaterialTheme.typography.labelLarge, color = TelegramBlue) + Text("${state.about.length}/200", style = MaterialTheme.typography.bodySmall, color = TelegramInkMuted) + } + androidx.compose.foundation.layout.Spacer(modifier = Modifier.padding(top = 10.dp)) + IkarTextInput( + value = state.about, + onValueChange = onAboutChanged, + placeholder = "Напишите что-нибудь о себе...", + minLines = 4 + ) + androidx.compose.foundation.layout.Spacer(modifier = Modifier.padding(top = 8.dp)) + Text( + "Вы можете добавить несколько строк о себе. Сейчас это поле сохраняется в профиле Ikar.", + color = TelegramInkMuted, + style = MaterialTheme.typography.bodySmall + ) + } + + IkarSectionCard { + Row(horizontalArrangement = Arrangement.spacedBy(14.dp)) { + Surface( + modifier = Modifier.size(40.dp), + color = Color(0xFFEFF6FD), + shape = androidx.compose.foundation.shape.CircleShape + ) { + androidx.compose.foundation.layout.Box(contentAlignment = androidx.compose.ui.Alignment.Center) { + androidx.compose.material3.Icon(Icons.Outlined.Edit, contentDescription = null, tint = TelegramBlue) + } + } + Column(verticalArrangement = Arrangement.spacedBy(2.dp)) { + Text("Добавить личный канал", style = MaterialTheme.typography.titleLarge) + Text( + "Этот сценарий будет доведён отдельным экраном. Сейчас основной профиль уже перенесён.", + style = MaterialTheme.typography.bodySmall, + color = TelegramInkMuted + ) + } + } + } + + Button( + onClick = onSaveClick, + enabled = !state.isLoading && !state.isSaving, + modifier = Modifier.fillMaxWidth() + ) { + Text(if (state.isSaving) "Сохранение..." else "Сохранить") + } + + state.errorMessage?.let { + Text(it, color = TelegramDanger, style = MaterialTheme.typography.bodyMedium) + } + state.infoMessage?.let { + Text(it, color = TelegramBlue, style = MaterialTheme.typography.bodyMedium, fontWeight = FontWeight.SemiBold) + } + } + } +} + +@Composable +private fun IkarInfoLine( + icon: androidx.compose.ui.graphics.vector.ImageVector, + title: String, + subtitle: String +) { + Row(horizontalArrangement = Arrangement.spacedBy(14.dp)) { + Surface( + modifier = Modifier.size(32.dp), + color = TelegramSurface, + shape = androidx.compose.foundation.shape.CircleShape + ) { + androidx.compose.foundation.layout.Box(contentAlignment = androidx.compose.ui.Alignment.Center) { + androidx.compose.material3.Icon(icon, contentDescription = null, tint = TelegramInkMuted) + } + } + Column(verticalArrangement = Arrangement.spacedBy(2.dp)) { + Text(title, style = MaterialTheme.typography.titleLarge) + Text(subtitle, style = MaterialTheme.typography.bodySmall, color = TelegramInkMuted) + } + } +} + +@Composable +private fun IkarTextInput( + value: String, + onValueChange: (String) -> Unit, + placeholder: String, + minLines: Int = 1 +) { + Surface( + modifier = Modifier.fillMaxWidth(), + color = TelegramSurface, + shape = androidx.compose.foundation.shape.RoundedCornerShape(18.dp) + ) { + BasicTextField( + value = value, + onValueChange = onValueChange, + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 14.dp, vertical = 12.dp), + textStyle = MaterialTheme.typography.bodyLarge.copy(color = MaterialTheme.colorScheme.onSurface), + minLines = minLines, + decorationBox = { innerTextField -> + if (value.isBlank()) { + Text(placeholder, color = TelegramInkMuted, style = MaterialTheme.typography.bodyLarge) + } + innerTextField() + } + ) + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/profile/PeerProfileScreen.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/profile/PeerProfileScreen.kt new file mode 100644 index 00000000..9cf9f62e --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/profile/PeerProfileScreen.kt @@ -0,0 +1,260 @@ +package com.seven.ikar.kotlin.feature.profile + +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.WindowInsetsSides +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.only +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.safeDrawing +import androidx.compose.foundation.layout.statusBarsPadding +import androidx.compose.foundation.layout.windowInsetsPadding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.ArrowBack +import androidx.compose.material.icons.outlined.Refresh +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import com.seven.ikar.kotlin.ui.AuthenticatedAsyncImage +import com.seven.ikar.kotlin.ui.AvatarView +import com.seven.ikar.kotlin.ui.IkarHeaderIconBubble +import com.seven.ikar.kotlin.ui.IkarRowDivider +import com.seven.ikar.kotlin.ui.IkarRoundedTag +import com.seven.ikar.kotlin.ui.IkarScreenSurface +import com.seven.ikar.kotlin.ui.IkarSectionCard +import com.seven.ikar.kotlin.ui.formatPresence +import com.seven.ikar.kotlin.ui.theme.TelegramBlue +import com.seven.ikar.kotlin.ui.theme.TelegramDanger +import com.seven.ikar.kotlin.ui.theme.TelegramInkMuted + +@Composable +fun PeerProfileScreen( + state: PeerProfileUiState, + onBackClick: () -> Unit, + onRefreshClick: () -> Unit +) { + val user = state.user + val displayName = user?.displayName?.takeIf { it.isNotBlank() } + ?: user?.phoneNumber?.takeIf { !it.isNullOrBlank() } + ?: "Профиль" + val usernameText = user?.username?.takeIf { it.isNotBlank() }?.let { "@$it" } ?: "Без имени пользователя" + val aboutText = user?.about?.takeIf { it.isNotBlank() } + val statusText = user?.let(::formatPresence) ?: "был давно" + var showAvatarPreview by rememberSaveable(state.userId) { mutableStateOf(false) } + + IkarScreenSurface(modifier = Modifier.fillMaxSize()) { + Column( + modifier = Modifier + .fillMaxSize() + .windowInsetsPadding(WindowInsets.safeDrawing.only(WindowInsetsSides.Vertical)) + .verticalScroll(rememberScrollState()) + .padding(horizontal = 18.dp, vertical = 18.dp), + verticalArrangement = Arrangement.spacedBy(18.dp) + ) { + Box( + modifier = Modifier.fillMaxWidth(), + contentAlignment = Alignment.Center + ) { + IkarHeaderIconBubble( + modifier = Modifier.align(Alignment.CenterStart), + onClick = onBackClick + ) { + Icon( + imageVector = Icons.AutoMirrored.Outlined.ArrowBack, + contentDescription = "Назад", + tint = MaterialTheme.colorScheme.onSurface + ) + } + Text( + text = "Профиль", + style = MaterialTheme.typography.displayLarge, + maxLines = 1 + ) + IkarHeaderIconBubble( + modifier = Modifier.align(Alignment.CenterEnd), + onClick = onRefreshClick + ) { + Icon( + imageVector = Icons.Outlined.Refresh, + contentDescription = "Обновить", + tint = MaterialTheme.colorScheme.onSurface + ) + } + } + + Column( + modifier = Modifier.fillMaxWidth(), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(10.dp) + ) { + Box( + modifier = Modifier + .clip(CircleShape) + .clickable( + enabled = !state.avatarUrl.isNullOrBlank(), + interactionSource = remember { MutableInteractionSource() }, + indication = null + ) { + showAvatarPreview = true + } + ) { + AvatarView( + imageUrl = state.avatarUrl, + title = displayName, + accessToken = state.accessToken, + size = 112.dp + ) + } + + Text( + text = displayName, + style = MaterialTheme.typography.displayLarge, + fontWeight = FontWeight.SemiBold + ) + Text( + text = statusText, + style = MaterialTheme.typography.bodyMedium, + color = TelegramInkMuted + ) + if (user?.isBot == true) { + IkarRoundedTag(text = "Бот") + } + } + + IkarSectionCard { + PeerProfileInfo( + value = user?.phoneNumber?.takeIf { it.isNotBlank() } ?: "Телефон не указан", + subtitle = "Телефон" + ) + IkarRowDivider(startIndent = 0.dp) + PeerProfileInfo(value = usernameText, subtitle = "Имя пользователя") + IkarRowDivider(startIndent = 0.dp) + PeerProfileInfo(value = statusText, subtitle = "Статус") + } + + aboutText?.let { + IkarSectionCard { + PeerProfileInfo(value = it, subtitle = "О себе") + } + } + + state.errorMessage?.let { + Text(it, color = TelegramDanger, style = MaterialTheme.typography.bodyMedium) + } + + Spacer(modifier = Modifier.height(24.dp)) + } + + if (state.isLoading && user == null) { + CircularProgressIndicator( + modifier = Modifier.align(Alignment.Center), + color = TelegramBlue + ) + } + + if (showAvatarPreview && !state.avatarUrl.isNullOrBlank()) { + PeerAvatarPreview( + imageUrl = state.avatarUrl, + accessToken = state.accessToken, + title = displayName, + onDismiss = { showAvatarPreview = false } + ) + } + } +} + +@Composable +private fun PeerProfileInfo( + value: String, + subtitle: String +) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 12.dp), + verticalArrangement = Arrangement.spacedBy(2.dp) + ) { + Text(value, style = MaterialTheme.typography.titleLarge) + Text(subtitle, style = MaterialTheme.typography.bodySmall, color = TelegramInkMuted) + } +} + +@Composable +private fun PeerAvatarPreview( + imageUrl: String, + accessToken: String?, + title: String, + onDismiss: () -> Unit +) { + Box( + modifier = Modifier + .fillMaxSize() + .background(Color.Black.copy(alpha = 0.55f)) + .clickable( + interactionSource = remember { MutableInteractionSource() }, + indication = null, + onClick = onDismiss + ) + ) { + Surface( + modifier = Modifier + .align(Alignment.TopCenter) + .fillMaxWidth() + .fillMaxHeight(0.4f) + .clickable( + interactionSource = remember { MutableInteractionSource() }, + indication = null, + onClick = {} + ), + shape = RoundedCornerShape(bottomStart = 28.dp, bottomEnd = 28.dp), + color = Color.Black + ) { + AuthenticatedAsyncImage( + imageUrl = imageUrl, + accessToken = accessToken, + contentDescription = title, + modifier = Modifier.fillMaxSize(), + contentScale = ContentScale.Crop + ) + } + + TextButton( + modifier = Modifier + .align(Alignment.TopEnd) + .statusBarsPadding() + .padding(top = 10.dp, end = 12.dp), + onClick = onDismiss + ) { + Text("Закрыть", color = Color.White) + } + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/profile/PeerProfileViewModel.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/profile/PeerProfileViewModel.kt new file mode 100644 index 00000000..b46a7788 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/profile/PeerProfileViewModel.kt @@ -0,0 +1,54 @@ +package com.seven.ikar.kotlin.feature.profile + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.seven.ikar.kotlin.app.AppContainer +import com.seven.ikar.kotlin.core.model.UserSummaryDto +import com.seven.ikar.kotlin.core.network.ServerConfig +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch + +data class PeerProfileUiState( + val userId: String, + val accessToken: String? = null, + val user: UserSummaryDto? = null, + val avatarUrl: String? = null, + val isLoading: Boolean = false, + val errorMessage: String? = null +) + +class PeerProfileViewModel( + private val container: AppContainer, + private val userId: String +) : ViewModel() { + private val _uiState = MutableStateFlow(PeerProfileUiState(userId = userId)) + val uiState: StateFlow<PeerProfileUiState> = _uiState.asStateFlow() + + init { + refresh() + } + + fun refresh() { + if (container.sessionStore.read() == null) return + viewModelScope.launch { + _uiState.value = _uiState.value.copy(isLoading = true, errorMessage = null) + runCatching { + container.executeAuthorized { session -> + session.accessToken to container.apiClient.getUser(session.accessToken, userId) + } + }.onSuccess { (accessToken, user) -> + _uiState.value = _uiState.value.copy( + accessToken = accessToken, + user = user, + avatarUrl = ServerConfig.normalizeMediaUrl(user.avatarPath), + isLoading = false, + errorMessage = null + ) + }.onFailure { error -> + _uiState.value = _uiState.value.copy(isLoading = false, errorMessage = error.message) + } + } + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/profile/ProfileScreen.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/profile/ProfileScreen.kt new file mode 100644 index 00000000..b811d564 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/profile/ProfileScreen.kt @@ -0,0 +1,271 @@ +package com.seven.ikar.kotlin.feature.profile + +import android.net.Uri +import androidx.activity.compose.rememberLauncherForActivityResult +import androidx.activity.result.PickVisualMediaRequest +import androidx.activity.result.contract.ActivityResultContracts +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.WindowInsetsSides +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.only +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.safeDrawing +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.windowInsetsPadding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.outlined.Close +import androidx.compose.material.icons.outlined.Edit +import androidx.compose.material.icons.outlined.Image +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.seven.ikar.kotlin.R +import com.seven.ikar.kotlin.ui.AvatarView +import com.seven.ikar.kotlin.ui.IkarCenteredHeader +import com.seven.ikar.kotlin.ui.IkarFloatingMainMenu +import com.seven.ikar.kotlin.ui.IkarMainMenuTab +import com.seven.ikar.kotlin.ui.IkarPillCard +import com.seven.ikar.kotlin.ui.IkarScreenSurface +import com.seven.ikar.kotlin.ui.IkarSectionCard +import com.seven.ikar.kotlin.ui.formatPresence +import com.seven.ikar.kotlin.ui.theme.TelegramBlue +import com.seven.ikar.kotlin.ui.theme.TelegramDanger +import com.seven.ikar.kotlin.ui.theme.TelegramInkMuted + +@Composable +fun ProfileScreen( + state: ProfileUiState, + onSettingsClick: () -> Unit, + onLogoutClick: () -> Unit, + onManageAvatarClick: (Uri) -> Unit, + onChatsClick: () -> Unit, + onContactsClick: () -> Unit, + onProfileClick: () -> Unit, + onSettingsTabClick: () -> Unit +) { + val avatarPicker = rememberLauncherForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri -> + if (uri != null) { + onManageAvatarClick(uri) + } + } + val statusText = state.session?.user?.let(::formatPresence) ?: "был давно" + + IkarScreenSurface(modifier = Modifier.fillMaxSize()) { + Column( + modifier = Modifier + .fillMaxSize() + .windowInsetsPadding(WindowInsets.safeDrawing.only(WindowInsetsSides.Vertical)) + .verticalScroll(rememberScrollState()) + .padding(horizontal = 18.dp, vertical = 18.dp), + verticalArrangement = Arrangement.spacedBy(18.dp) + ) { + IkarCenteredHeader( + title = "Профиль", + left = { + Image( + painter = painterResource(id = R.drawable.ikar_logo), + contentDescription = "Икар" + ) + }, + right = {} + ) + + Column( + modifier = Modifier.fillMaxWidth(), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(10.dp) + ) { + AvatarView( + imageUrl = state.avatarUrl, + title = state.displayName.ifBlank { state.phoneNumber.ifBlank { "ИКАР" } }, + size = 108.dp + ) + + Column( + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(2.dp) + ) { + Text( + text = state.displayName.ifBlank { "Без имени" }, + style = MaterialTheme.typography.displayLarge, + fontWeight = FontWeight.SemiBold + ) + Text( + text = statusText, + style = MaterialTheme.typography.bodyMedium, + color = TelegramInkMuted + ) + } + } + + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.spacedBy(10.dp) + ) { + ProfileActionCard( + modifier = Modifier.weight(1f), + title = "Выбрать фото", + iconTint = TelegramBlue, + onClick = { + avatarPicker.launch( + PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly) + ) + } + ) { tint -> + Icon( + imageVector = Icons.Outlined.Image, + contentDescription = null, + tint = tint, + modifier = Modifier.size(30.dp) + ) + } + ProfileActionCard( + modifier = Modifier.weight(1f), + title = "Изменить", + iconTint = TelegramBlue, + onClick = onSettingsClick + ) { tint -> + Icon( + imageVector = Icons.Outlined.Edit, + contentDescription = null, + tint = tint, + modifier = Modifier.size(30.dp) + ) + } + ProfileActionCard( + modifier = Modifier.weight(1f), + title = "Выход", + iconTint = TelegramDanger, + textColor = TelegramDanger, + onClick = onLogoutClick + ) { tint -> + Icon( + imageVector = Icons.Outlined.Close, + contentDescription = null, + tint = tint, + modifier = Modifier.size(30.dp) + ) + } + } + + IkarSectionCard { + IkarProfileInfo( + value = state.phoneNumber.ifBlank { "Номер не загружен" }, + subtitle = "Телефон" + ) + com.seven.ikar.kotlin.ui.IkarRowDivider(startIndent = 0.dp) + IkarProfileInfo( + value = state.displayName.ifBlank { "Без имени" }, + subtitle = "Отображаемое имя" + ) + com.seven.ikar.kotlin.ui.IkarRowDivider(startIndent = 0.dp) + IkarProfileInfo( + value = statusText, + subtitle = "Состояние" + ) + } + + state.errorMessage?.let { + Text(it, color = TelegramDanger, style = MaterialTheme.typography.bodyMedium) + } + state.infoMessage?.let { + Text( + text = it, + color = TelegramBlue, + style = MaterialTheme.typography.bodyMedium, + fontWeight = FontWeight.SemiBold + ) + } + + Box( + modifier = Modifier + .fillMaxWidth() + .padding(bottom = 116.dp) + ) + } + + IkarFloatingMainMenu( + selectedTab = IkarMainMenuTab.Profile, + modifier = Modifier + .align(Alignment.BottomCenter) + .padding(horizontal = 8.dp, vertical = 18.dp), + onChatsClick = onChatsClick, + onContactsClick = onContactsClick, + onSettingsClick = onSettingsTabClick, + onProfileClick = onProfileClick + ) + } +} + +@Composable +private fun IkarProfileInfo( + value: String, + subtitle: String +) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 12.dp), + verticalArrangement = Arrangement.spacedBy(2.dp) + ) { + Text(value, style = MaterialTheme.typography.titleLarge) + Text(subtitle, style = MaterialTheme.typography.bodySmall, color = TelegramInkMuted) + } +} + +@Composable +private fun ProfileActionCard( + title: String, + iconTint: Color, + modifier: Modifier = Modifier, + textColor: Color? = null, + onClick: () -> Unit, + icon: @Composable (Color) -> Unit +) { + val resolvedTextColor = textColor ?: MaterialTheme.colorScheme.onSurface + IkarPillCard( + modifier = modifier.height(104.dp), + onClick = onClick, + contentPadding = PaddingValues(horizontal = 8.dp, vertical = 10.dp) + ) { + Box( + modifier = Modifier + .fillMaxWidth() + .height(42.dp), + contentAlignment = Alignment.Center + ) { + icon(iconTint) + } + Text( + text = title, + modifier = Modifier.fillMaxWidth(), + style = MaterialTheme.typography.labelMedium.copy( + fontSize = 11.sp, + lineHeight = 11.sp + ), + color = resolvedTextColor, + textAlign = TextAlign.Center, + maxLines = 1, + softWrap = false + ) + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/profile/ProfileViewModel.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/profile/ProfileViewModel.kt new file mode 100644 index 00000000..730f5fda --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/profile/ProfileViewModel.kt @@ -0,0 +1,146 @@ +package com.seven.ikar.kotlin.feature.profile + +import android.net.Uri +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.seven.ikar.kotlin.app.AppContainer +import com.seven.ikar.kotlin.core.model.AuthSessionDto +import com.seven.ikar.kotlin.core.model.UserSummaryDto +import com.seven.ikar.kotlin.core.network.ServerConfig +import com.seven.ikar.kotlin.core.network.UploadFileSource +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch + +data class ProfileUiState( + val session: AuthSessionDto? = null, + val displayName: String = "", + val phoneNumber: String = "", + val about: String = "", + val avatarUrl: String? = null, + val isLoading: Boolean = false, + val isSaving: Boolean = false, + val errorMessage: String? = null, + val infoMessage: String? = null +) + +class ProfileViewModel(private val container: AppContainer) : ViewModel() { + private val _uiState = MutableStateFlow(ProfileUiState(session = container.sessionStore.read())) + val uiState: StateFlow<ProfileUiState> = _uiState.asStateFlow() + + init { + refresh() + } + + fun updateDisplayName(value: String) { + _uiState.value = _uiState.value.copy(displayName = value) + } + + fun updateAbout(value: String) { + _uiState.value = _uiState.value.copy(about = value) + } + + fun refresh() { + if (container.sessionStore.read() == null) return + viewModelScope.launch { + _uiState.value = _uiState.value.copy(isLoading = true, errorMessage = null, infoMessage = null) + runCatching { + container.executeAuthorized { session -> + session to container.apiClient.getMe(session.accessToken) + } + }.onSuccess { (session, user) -> + applyUser(session, user, infoMessage = null) + }.onFailure { error -> + _uiState.value = _uiState.value.copy(isLoading = false, errorMessage = error.message) + } + } + } + + fun save() { + val state = _uiState.value + if (state.displayName.isBlank()) { + _uiState.value = state.copy(errorMessage = "Укажите отображаемое имя.") + return + } + + viewModelScope.launch { + _uiState.value = state.copy(isSaving = true, errorMessage = null, infoMessage = null) + runCatching { + container.executeAuthorized { session -> + session to container.apiClient.updateMyProfile( + accessToken = session.accessToken, + displayName = state.displayName.trim(), + about = state.about.trim().ifBlank { null } + ) + } + }.onSuccess { (session, user) -> + applyUser(session, user, infoMessage = "Профиль сохранён.") + }.onFailure { error -> + _uiState.value = _uiState.value.copy(isSaving = false, errorMessage = error.message) + } + } + } + + fun uploadAvatar(uri: Uri) { + if (container.sessionStore.read() == null) return + viewModelScope.launch { + val state = _uiState.value + _uiState.value = state.copy(isSaving = true, errorMessage = null, infoMessage = null) + runCatching { + val contentResolver = container.appContext.contentResolver + val contentType = contentResolver.getType(uri) + val fileName = contentType?.substringAfter('/')?.let { "avatar.$it" } ?: "avatar.jpg" + container.executeAuthorized { session -> + session to container.apiClient.uploadMyAvatar( + accessToken = session.accessToken, + file = UploadFileSource( + fileName = fileName, + contentType = contentType + ) { + contentResolver.openInputStream(uri) + ?: throw IllegalStateException("Не удалось открыть выбранное изображение.") + } + ) + } + }.onSuccess { (session, user) -> + applyUser(session, user, infoMessage = "Аватар обновлён.") + }.onFailure { error -> + _uiState.value = _uiState.value.copy(isSaving = false, errorMessage = error.message) + } + } + } + + fun deleteAvatar() { + if (container.sessionStore.read() == null) return + viewModelScope.launch { + val state = _uiState.value + _uiState.value = state.copy(isSaving = true, errorMessage = null, infoMessage = null) + runCatching { + container.executeAuthorized { session -> + session to container.apiClient.deleteMyAvatar(session.accessToken) + } + }.onSuccess { (session, user) -> + applyUser(session, user, infoMessage = "Аватар удалён.") + }.onFailure { error -> + _uiState.value = _uiState.value.copy(isSaving = false, errorMessage = error.message) + } + } + } + + private fun applyUser(session: AuthSessionDto, user: UserSummaryDto, infoMessage: String?) { + val updatedSession = session.copy(user = user) + container.sessionStore.save(updatedSession) + _uiState.value = _uiState.value.copy( + session = updatedSession, + displayName = user.displayName, + phoneNumber = user.phoneNumber.orEmpty(), + about = user.about.orEmpty(), + avatarUrl = ServerConfig.normalizeMediaUrl(user.avatarPath), + isLoading = false, + isSaving = false, + errorMessage = null, + infoMessage = infoMessage + ) + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/search/GlobalSearchScreen.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/search/GlobalSearchScreen.kt new file mode 100644 index 00000000..be2ecfb6 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/search/GlobalSearchScreen.kt @@ -0,0 +1,344 @@ +package com.seven.ikar.kotlin.feature.search + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.WindowInsetsSides +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.only +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.safeDrawing +import androidx.compose.foundation.layout.windowInsetsPadding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.SpanStyle +import androidx.compose.ui.text.buildAnnotatedString +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import com.seven.ikar.kotlin.core.model.ChatSearchResultDto +import com.seven.ikar.kotlin.core.model.ChatType +import com.seven.ikar.kotlin.ui.IkarRowDivider +import com.seven.ikar.kotlin.ui.IkarScreenSurface +import com.seven.ikar.kotlin.ui.IkarSearchCard +import com.seven.ikar.kotlin.ui.IkarSectionCard +import com.seven.ikar.kotlin.ui.IkarSimpleHeader +import com.seven.ikar.kotlin.ui.chatPreview +import com.seven.ikar.kotlin.ui.theme.TelegramBlue +import com.seven.ikar.kotlin.ui.theme.TelegramDanger +import com.seven.ikar.kotlin.ui.theme.TelegramInkMuted + +@Composable +fun GlobalSearchScreen( + state: GlobalSearchUiState, + onBackClick: () -> Unit, + onQueryChanged: (String) -> Unit, + onFilterChanged: (GlobalSearchFilter) -> Unit, + onDateFilterChanged: (GlobalSearchDateFilter) -> Unit = {}, + onResultTypeChanged: (GlobalSearchResultType) -> Unit = {}, + onAuthorFilterChanged: (String) -> Unit = {}, + onLoadMore: () -> Unit = {}, + onResultClick: (ChatSearchResultDto) -> Unit +) { + val visibleResults = state.visibleResults + IkarScreenSurface(modifier = Modifier.fillMaxSize()) { + Column( + modifier = Modifier + .fillMaxSize() + .windowInsetsPadding(WindowInsets.safeDrawing.only(WindowInsetsSides.Vertical)) + .padding(horizontal = 18.dp, vertical = 16.dp), + verticalArrangement = Arrangement.spacedBy(14.dp) + ) { + IkarSimpleHeader(title = "Глобальный поиск", onBackClick = onBackClick) + + IkarSearchCard( + value = state.query, + onValueChange = onQueryChanged, + placeholder = "Поиск чатов и сообщений" + ) + + GlobalSearchFilterRow( + selected = state.filter, + onFilterChanged = onFilterChanged + ) + + GlobalSearchAdvancedFilters( + selectedDate = state.dateFilter, + selectedType = state.resultType, + authorFilter = state.authorFilter, + onDateFilterChanged = onDateFilterChanged, + onResultTypeChanged = onResultTypeChanged, + onAuthorFilterChanged = onAuthorFilterChanged + ) + + state.errorMessage?.let { + Text(it, color = TelegramDanger, style = MaterialTheme.typography.bodySmall) + } + + IkarSectionCard(modifier = Modifier.weight(1f)) { + when { + state.isSearching -> { + Column( + modifier = Modifier.fillMaxSize(), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center + ) { + CircularProgressIndicator(color = TelegramBlue) + } + } + + state.results.isEmpty() -> { + Column( + modifier = Modifier.fillMaxSize(), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center + ) { + Text("Ничего не найдено", style = MaterialTheme.typography.titleMedium) + Text( + "Введите текст или переключитесь на медиа, файлы или ссылки.", + style = MaterialTheme.typography.bodySmall, + color = TelegramInkMuted + ) + } + } + + visibleResults.isEmpty() -> { + Column( + modifier = Modifier.fillMaxSize(), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center + ) { + Text("Нет результатов по фильтрам", style = MaterialTheme.typography.titleMedium) + Text( + "Расширьте фильтр по дате, автору или типу.", + style = MaterialTheme.typography.bodySmall, + color = TelegramInkMuted + ) + } + } + + else -> { + LazyColumn(modifier = Modifier.fillMaxSize()) { + if (state.filter == GlobalSearchFilter.Media || state.resultType == GlobalSearchResultType.Attachments) { + visibleResults + .groupBy { it.searchDateGroupLabel() } + .forEach { (dateGroup, results) -> + item(key = "date:$dateGroup") { + Text( + text = dateGroup, + style = MaterialTheme.typography.labelMedium, + color = TelegramInkMuted, + modifier = Modifier.padding(top = 10.dp, bottom = 4.dp) + ) + } + items(results, key = { "${it.chat.id}:${it.message?.id.orEmpty()}" }) { result -> + GlobalSearchResultRow( + result = result, + query = state.query, + onClick = { onResultClick(result) } + ) + IkarRowDivider() + } + } + } else { + items(visibleResults, key = { "${it.chat.id}:${it.message?.id.orEmpty()}" }) { result -> + GlobalSearchResultRow( + result = result, + query = state.query, + onClick = { onResultClick(result) } + ) + IkarRowDivider() + } + } + if (state.hasMore) { + item(key = "load-more") { + TextButton( + enabled = !state.isLoadingMore, + onClick = onLoadMore, + modifier = Modifier.fillMaxWidth() + ) { + Text(if (state.isLoadingMore) "Загрузка..." else "Показать ещё", color = TelegramBlue) + } + } + } + } + } + } + } + } + } +} + +@Composable +private fun GlobalSearchAdvancedFilters( + selectedDate: GlobalSearchDateFilter, + selectedType: GlobalSearchResultType, + authorFilter: String, + onDateFilterChanged: (GlobalSearchDateFilter) -> Unit, + onResultTypeChanged: (GlobalSearchResultType) -> Unit, + onAuthorFilterChanged: (String) -> Unit +) { + Column(verticalArrangement = Arrangement.spacedBy(6.dp)) { + Row(horizontalArrangement = Arrangement.spacedBy(6.dp)) { + GlobalSearchDateFilter.entries.forEach { filter -> + TextButton(onClick = { onDateFilterChanged(filter) }) { + Text( + text = filter.label(), + color = if (filter == selectedDate) TelegramBlue else TelegramInkMuted, + fontWeight = if (filter == selectedDate) FontWeight.SemiBold else FontWeight.Normal + ) + } + } + } + Row(horizontalArrangement = Arrangement.spacedBy(6.dp)) { + GlobalSearchResultType.entries.forEach { type -> + TextButton(onClick = { onResultTypeChanged(type) }) { + Text( + text = type.label(), + color = if (type == selectedType) TelegramBlue else TelegramInkMuted, + fontWeight = if (type == selectedType) FontWeight.SemiBold else FontWeight.Normal + ) + } + } + } + IkarSearchCard( + value = authorFilter, + onValueChange = onAuthorFilterChanged, + placeholder = "Фильтр по автору" + ) + } +} + +@Composable +private fun GlobalSearchFilterRow( + selected: GlobalSearchFilter, + onFilterChanged: (GlobalSearchFilter) -> Unit +) { + Row(horizontalArrangement = Arrangement.spacedBy(6.dp)) { + GlobalSearchFilter.entries.forEach { filter -> + TextButton(onClick = { onFilterChanged(filter) }) { + Text( + text = when (filter) { + GlobalSearchFilter.All -> "Все" + GlobalSearchFilter.Media -> "Медиа" + GlobalSearchFilter.Files -> "Файлы" + GlobalSearchFilter.Links -> "Ссылки" + }, + color = if (filter == selected) TelegramBlue else TelegramInkMuted, + fontWeight = if (filter == selected) FontWeight.SemiBold else FontWeight.Normal + ) + } + } + } +} + +@Composable +private fun GlobalSearchResultRow( + result: ChatSearchResultDto, + query: String, + onClick: () -> Unit +) { + Column( + modifier = Modifier + .fillMaxWidth() + .clickable(onClick = onClick) + .padding(vertical = 12.dp), + verticalArrangement = Arrangement.spacedBy(4.dp) + ) { + Text( + text = highlightedText(result.chat.title, query), + style = MaterialTheme.typography.titleMedium, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + Text( + text = highlightedText(result.matchText.ifBlank { chatPreview(result.chat) }, query), + style = MaterialTheme.typography.bodyMedium, + maxLines = 2, + overflow = TextOverflow.Ellipsis + ) + result.message?.attachments?.takeIf { it.isNotEmpty() }?.let { attachments -> + Text( + text = attachments.joinToString(limit = 3) { it.fileName }, + style = MaterialTheme.typography.bodySmall, + color = TelegramInkMuted, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + } + result.botMiniAppDeepLink()?.let { deepLink -> + TextButton(onClick = {}) { + Text("Мини-приложение: $deepLink", color = TelegramBlue) + } + } + if (result.chat.type == ChatType.Group) { + Text( + text = "Групповой звонок готов для голосовых и видеодействий.", + style = MaterialTheme.typography.bodySmall, + color = TelegramInkMuted + ) + } + } +} + +@Composable +private fun highlightedText(text: String, query: String) = buildAnnotatedString { + val needle = query.trim() + if (needle.length < 2) { + append(text) + return@buildAnnotatedString + } + + var currentIndex = 0 + while (currentIndex < text.length) { + val matchIndex = text.indexOf(needle, startIndex = currentIndex, ignoreCase = true) + if (matchIndex < 0) { + append(text.substring(currentIndex)) + break + } + append(text.substring(currentIndex, matchIndex)) + pushStyle( + SpanStyle( + color = MaterialTheme.colorScheme.primary, + fontWeight = FontWeight.SemiBold, + background = MaterialTheme.colorScheme.primary.copy(alpha = 0.14f) + ) + ) + append(text.substring(matchIndex, matchIndex + needle.length)) + pop() + currentIndex = matchIndex + needle.length + } +} + +private fun GlobalSearchDateFilter.label(): String = + when (this) { + GlobalSearchDateFilter.Anytime -> "Любая дата" + GlobalSearchDateFilter.Today -> "Сегодня" + GlobalSearchDateFilter.ThisWeek -> "Неделя" + GlobalSearchDateFilter.ThisMonth -> "Месяц" + } + +private fun GlobalSearchResultType.label(): String = + when (this) { + GlobalSearchResultType.All -> "Все типы" + GlobalSearchResultType.Chats -> "Чаты" + GlobalSearchResultType.Messages -> "Сообщения" + GlobalSearchResultType.Attachments -> "Вложения" + GlobalSearchResultType.Bots -> "Боты" + GlobalSearchResultType.GroupCalls -> "Звонки" + } + +private fun ChatSearchResultDto.botMiniAppDeepLink(): String? { + val bot = chat.participants.firstOrNull { it.isBot } ?: return null + return "ikar://bot/${bot.username}?start=miniapp" +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/search/GlobalSearchViewModel.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/search/GlobalSearchViewModel.kt new file mode 100644 index 00000000..ad355081 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/search/GlobalSearchViewModel.kt @@ -0,0 +1,237 @@ +package com.seven.ikar.kotlin.feature.search + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.seven.ikar.kotlin.app.AppContainer +import com.seven.ikar.kotlin.core.model.ChatType +import com.seven.ikar.kotlin.core.model.ChatSearchResultDto +import java.text.SimpleDateFormat +import java.util.Calendar +import java.util.Locale +import kotlinx.coroutines.Job +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch + +enum class GlobalSearchFilter(val wireValue: String?) { + All(null), + Media("media"), + Files("files"), + Links("links") +} + +enum class GlobalSearchDateFilter { + Anytime, + Today, + ThisWeek, + ThisMonth +} + +enum class GlobalSearchResultType { + All, + Chats, + Messages, + Attachments, + Bots, + GroupCalls +} + +data class SearchCapabilityHooks( + val supportsMediaDateGrouping: Boolean = true, + val supportsBotMiniAppPlaceholder: Boolean = true, + val supportsScheduledMessageOptions: Boolean = true, + val supportsGroupCallPlaceholder: Boolean = true +) + +data class GlobalSearchUiState( + val query: String = "", + val filter: GlobalSearchFilter = GlobalSearchFilter.All, + val dateFilter: GlobalSearchDateFilter = GlobalSearchDateFilter.Anytime, + val resultType: GlobalSearchResultType = GlobalSearchResultType.All, + val authorFilter: String = "", + val results: List<ChatSearchResultDto> = emptyList(), + val page: Int = 1, + val hasMore: Boolean = false, + val isSearching: Boolean = false, + val isLoadingMore: Boolean = false, + val errorMessage: String? = null, + val hooks: SearchCapabilityHooks = SearchCapabilityHooks() +) { + val visibleResults: List<ChatSearchResultDto> + get() = results.filter { result -> + result.matchesAuthor(authorFilter) && + result.matchesDate(dateFilter) && + result.matchesType(resultType) + } +} + +class GlobalSearchViewModel(private val container: AppContainer) : ViewModel() { + private val _uiState = MutableStateFlow(GlobalSearchUiState()) + val uiState: StateFlow<GlobalSearchUiState> = _uiState.asStateFlow() + private var searchJob: Job? = null + + fun updateQuery(value: String) { + _uiState.value = _uiState.value.copy(query = value) + scheduleSearch() + } + + fun updateFilter(filter: GlobalSearchFilter) { + _uiState.value = _uiState.value.copy(filter = filter) + scheduleSearch(immediate = true) + } + + fun updateDateFilter(filter: GlobalSearchDateFilter) { + _uiState.value = _uiState.value.copy(dateFilter = filter) + scheduleSearch(immediate = true) + } + + fun updateResultType(type: GlobalSearchResultType) { + _uiState.value = _uiState.value.copy(resultType = type) + scheduleSearch(immediate = true) + } + + fun updateAuthorFilter(value: String) { + _uiState.value = _uiState.value.copy(authorFilter = value) + scheduleSearch() + } + + fun refresh() { + scheduleSearch(immediate = true) + } + + fun loadMore() { + val state = _uiState.value + if (!state.hasMore || state.isSearching || state.isLoadingMore) { + return + } + scheduleSearch(immediate = true, append = true) + } + + private fun scheduleSearch(immediate: Boolean = false, append: Boolean = false) { + searchJob?.cancel() + val state = _uiState.value + val query = state.query.trim() + if (query.length < 2 && state.filter == GlobalSearchFilter.All) { + _uiState.value = state.copy(results = emptyList(), page = 1, hasMore = false, isSearching = false, isLoadingMore = false, errorMessage = null) + return + } + + searchJob = viewModelScope.launch { + if (!immediate) { + delay(250) + } + val requestState = _uiState.value + val targetPage = if (append) requestState.page + 1 else 1 + val dateRange = requestState.dateFilter.toServerRange() + _uiState.value = requestState.copy( + isSearching = !append, + isLoadingMore = append, + errorMessage = null + ) + runCatching { + container.executeAuthorized { session -> + container.apiClient.searchChatsPage( + accessToken = session.accessToken, + query = requestState.query.trim().ifBlank { " " }, + filter = requestState.filter.wireValue, + type = requestState.resultType.serverType(), + author = requestState.authorFilter.trim().takeIf { it.isNotBlank() }, + dateFrom = dateRange?.first, + dateTo = dateRange?.second, + page = targetPage, + limit = 40 + ) + } + }.onSuccess { page -> + val currentResults = if (append) _uiState.value.results else emptyList() + _uiState.value = _uiState.value.copy( + results = (currentResults + page.results).distinctBy { "${it.chat.id}:${it.message?.id.orEmpty()}:${it.matchText}" }, + page = page.page, + hasMore = page.hasMore, + isSearching = false, + isLoadingMore = false + ) + }.onFailure { error -> + _uiState.value = _uiState.value.copy(isSearching = false, isLoadingMore = false, errorMessage = error.message) + } + } + } +} + +private fun GlobalSearchResultType.serverType(): String? = + when (this) { + GlobalSearchResultType.Messages -> "text" + GlobalSearchResultType.Attachments -> "attachments" + else -> null + } + +private fun GlobalSearchDateFilter.toServerRange(): Pair<String, String>? = + when (this) { + GlobalSearchDateFilter.Anytime -> null + GlobalSearchDateFilter.Today -> dateKey(0).toDayRange() + GlobalSearchDateFilter.ThisWeek -> offsetDateKey(-6).toDateStart() to todayKey().toDateEnd() + GlobalSearchDateFilter.ThisMonth -> todayKey().take(8).let { prefix -> + "${prefix}01".toDateStart() to todayKey().toDateEnd() + } + } + +private fun String.toDayRange(): Pair<String, String> = toDateStart() to toDateEnd() + +private fun String.toDateStart(): String = "${this}T00:00:00Z" + +private fun String.toDateEnd(): String = "${this}T23:59:59Z" + +private fun ChatSearchResultDto.matchesAuthor(authorFilter: String): Boolean { + val query = authorFilter.trim() + if (query.isBlank()) { + return true + } + + val sender = message?.sender ?: return false + return sender.displayName.contains(query, ignoreCase = true) || + sender.username.contains(query, ignoreCase = true) || + (sender.phoneNumber?.contains(query, ignoreCase = true) ?: false) +} + +private fun ChatSearchResultDto.matchesDate(filter: GlobalSearchDateFilter): Boolean { + if (filter == GlobalSearchDateFilter.Anytime) { + return true + } + + val dateKey = searchDateKey() ?: return false + val today = todayKey() + return when (filter) { + GlobalSearchDateFilter.Anytime -> true + GlobalSearchDateFilter.Today -> dateKey == today + GlobalSearchDateFilter.ThisWeek -> dateKey >= offsetDateKey(-6) && dateKey <= today + GlobalSearchDateFilter.ThisMonth -> dateKey.take(7) == today.take(7) + } +} + +private fun ChatSearchResultDto.matchesType(type: GlobalSearchResultType): Boolean = + when (type) { + GlobalSearchResultType.All -> true + GlobalSearchResultType.Chats -> message == null + GlobalSearchResultType.Messages -> message != null + GlobalSearchResultType.Attachments -> message?.attachments?.isNotEmpty() == true + GlobalSearchResultType.Bots -> chat.participants.any { it.isBot } + GlobalSearchResultType.GroupCalls -> chat.type == ChatType.Group + } + +internal fun ChatSearchResultDto.searchDateGroupLabel(): String = + searchDateKey() ?: "No date" + +private fun ChatSearchResultDto.searchDateKey(): String? = + (matchedAt ?: message?.sentAt ?: chat.lastActivityAt)?.takeIf { it.length >= 10 }?.take(10) + +private fun todayKey(): String = dateKey(0) + +private fun offsetDateKey(days: Int): String = dateKey(days) + +private fun dateKey(daysFromToday: Int): String { + val calendar = Calendar.getInstance() + calendar.add(Calendar.DAY_OF_YEAR, daysFromToday) + return SimpleDateFormat("yyyy-MM-dd", Locale.US).format(calendar.time) +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/settings/AppSettingsViewModel.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/settings/AppSettingsViewModel.kt new file mode 100644 index 00000000..aa6c437a --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/settings/AppSettingsViewModel.kt @@ -0,0 +1,35 @@ +package com.seven.ikar.kotlin.feature.settings + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.seven.ikar.kotlin.app.AppContainer +import com.seven.ikar.kotlin.core.settings.AppSettingsSnapshot +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch + +data class AppSettingsUiState( + val snapshot: AppSettingsSnapshot = AppSettingsSnapshot() +) + +class AppSettingsViewModel(private val container: AppContainer) : ViewModel() { + private val _uiState = MutableStateFlow(AppSettingsUiState(snapshot = container.appSettings.loadSnapshot())) + val uiState: StateFlow<AppSettingsUiState> = _uiState.asStateFlow() + + init { + viewModelScope.launch { + container.appSettings.snapshot.collect { snapshot -> + _uiState.value = AppSettingsUiState(snapshot = snapshot) + } + } + } + + fun updateSnapshot(transform: (AppSettingsSnapshot) -> AppSettingsSnapshot) { + container.appSettings.update(transform) + } + + fun reset() { + container.appSettings.reset() + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/settings/ChatNotificationSettingsScreen.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/settings/ChatNotificationSettingsScreen.kt new file mode 100644 index 00000000..4c8abde7 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/settings/ChatNotificationSettingsScreen.kt @@ -0,0 +1,233 @@ +package com.seven.ikar.kotlin.feature.settings + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ColumnScope +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.WindowInsetsSides +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.only +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.safeDrawing +import androidx.compose.foundation.layout.windowInsetsPadding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.VolumeUp +import androidx.compose.material.icons.outlined.ChatBubbleOutline +import androidx.compose.material.icons.outlined.Notifications +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import androidx.lifecycle.ViewModel +import com.seven.ikar.kotlin.app.AppContainer +import com.seven.ikar.kotlin.core.push.ChatNotificationSettingsSnapshot +import com.seven.ikar.kotlin.core.push.NotificationPreferenceCatalog +import com.seven.ikar.kotlin.core.push.NotificationSettingsSnapshot +import com.seven.ikar.kotlin.core.push.NotificationSoundChoice +import com.seven.ikar.kotlin.core.push.NotificationSoundOption +import com.seven.ikar.kotlin.ui.IkarRowDivider +import com.seven.ikar.kotlin.ui.IkarScreenSurface +import com.seven.ikar.kotlin.ui.IkarSectionCard +import com.seven.ikar.kotlin.ui.IkarSectionTitle +import com.seven.ikar.kotlin.ui.IkarSimpleHeader +import com.seven.ikar.kotlin.ui.IkarToggleRow +import com.seven.ikar.kotlin.ui.IkarValueRow +import com.seven.ikar.kotlin.ui.theme.TelegramBlue +import com.seven.ikar.kotlin.ui.theme.TelegramDanger +import com.seven.ikar.kotlin.ui.theme.TelegramInkMuted +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow + +data class ChatNotificationSettingsUiState( + val chatId: String, + val chatTitle: String, + val snapshot: ChatNotificationSettingsSnapshot, + val globalSnapshot: NotificationSettingsSnapshot, + val errorMessage: String? = null, + val infoMessage: String? = null +) + +class ChatNotificationSettingsViewModel( + private val container: AppContainer, + private val chatId: String, + chatTitle: String +) : ViewModel() { + private val _uiState = MutableStateFlow( + ChatNotificationSettingsUiState( + chatId = chatId, + chatTitle = chatTitle, + snapshot = container.pushSettings.loadChatNotificationSnapshot(chatId), + globalSnapshot = container.pushSettings.loadSnapshot() + ) + ) + val uiState: StateFlow<ChatNotificationSettingsUiState> = _uiState.asStateFlow() + + val messageSoundOptions: List<NotificationSoundChoice> = NotificationPreferenceCatalog.messageSoundChoices + + fun updateSnapshot(transform: (ChatNotificationSettingsSnapshot) -> ChatNotificationSettingsSnapshot) { + val nextSnapshot = transform(_uiState.value.snapshot) + container.pushSettings.saveChatNotificationSnapshot(chatId, nextSnapshot) + _uiState.value = _uiState.value.copy( + snapshot = nextSnapshot, + infoMessage = null, + errorMessage = null + ) + } + + fun setMessageSound(value: NotificationSoundOption?) = updateSnapshot { it.copy(messageSound = value) } + + fun reset() { + container.pushSettings.resetChatNotificationPreferences(chatId) + _uiState.value = _uiState.value.copy( + snapshot = container.pushSettings.loadChatNotificationSnapshot(chatId), + infoMessage = "Для этого чата снова используются общие настройки.", + errorMessage = null + ) + } +} + +@Composable +fun ChatNotificationSettingsScreen( + state: ChatNotificationSettingsUiState, + messageSoundOptions: List<NotificationSoundChoice>, + onBackClick: () -> Unit, + onSnapshotChanged: (ChatNotificationSettingsSnapshot) -> Unit, + onMessageSoundChanged: (NotificationSoundOption?) -> Unit, + onResetClick: () -> Unit +) { + val snapshot = state.snapshot + val global = state.globalSnapshot + val effectiveNotificationsEnabled = snapshot.notificationsEnabled ?: global.notificationsEnabled + val effectiveShowPreview = snapshot.showMessagePreview ?: global.inAppShowTextEnabled + val effectivePopupWindows = snapshot.popupWindowsEnabled ?: global.popupWindowsEnabled + val effectiveSoundInActiveChat = snapshot.soundInActiveChatEnabled ?: global.soundInActiveChatEnabled + + IkarScreenSurface(modifier = Modifier.fillMaxSize()) { + Column( + modifier = Modifier + .fillMaxSize() + .windowInsetsPadding(WindowInsets.safeDrawing.only(WindowInsetsSides.Vertical)) + .verticalScroll(rememberScrollState()) + .padding(horizontal = 18.dp, vertical = 16.dp), + verticalArrangement = Arrangement.spacedBy(16.dp) + ) { + IkarSimpleHeader(title = "Уведомления чата", onBackClick = onBackClick) + + ChatNotificationSection { + val chatLabel = state.chatTitle.ifBlank { "Текущий чат" } + IkarSectionTitle("Для этого чата", modifier = Modifier.padding(bottom = 12.dp)) + Text( + text = chatLabel, + style = MaterialTheme.typography.titleMedium, + color = MaterialTheme.colorScheme.onSurface, + modifier = Modifier.padding(bottom = 2.dp) + ) + Text( + text = "Изменения применяются сразу.", + style = MaterialTheme.typography.bodyMedium, + color = TelegramInkMuted, + modifier = Modifier.padding(bottom = 10.dp) + ) + IkarToggleRow( + title = "Уведомления", + subtitle = overrideModeLabel(snapshot.notificationsEnabled), + checked = effectiveNotificationsEnabled, + onCheckedChange = { onSnapshotChanged(snapshot.copy(notificationsEnabled = it)) }, + leading = { Icon(Icons.Outlined.Notifications, contentDescription = null, tint = TelegramInkMuted) } + ) + IkarRowDivider(startIndent = 32.dp) + IkarValueRow( + title = "Звук сообщений", + subtitle = overrideModeLabel(snapshot.messageSound), + value = soundCurrentLabel(snapshot.messageSound, global.messageSound, messageSoundOptions), + onClick = { + val values = listOf<NotificationSoundOption?>(null) + messageSoundOptions.map { it.value } + val currentIndex = values.indexOf(snapshot.messageSound).coerceAtLeast(0) + onMessageSoundChanged(values[(currentIndex + 1) % values.size]) + }, + leading = { Icon(Icons.AutoMirrored.Outlined.VolumeUp, contentDescription = null, tint = TelegramInkMuted) } + ) + } + + ChatNotificationSection { + IkarSectionTitle("Поведение", modifier = Modifier.padding(bottom = 12.dp)) + IkarToggleRow( + title = "Показывать текст", + subtitle = overrideModeLabel(snapshot.showMessagePreview), + checked = effectiveShowPreview, + onCheckedChange = { onSnapshotChanged(snapshot.copy(showMessagePreview = it)) }, + leading = { Icon(Icons.Outlined.ChatBubbleOutline, contentDescription = null, tint = TelegramInkMuted) } + ) + IkarRowDivider(startIndent = 32.dp) + IkarToggleRow( + title = "Всплывающие окна", + subtitle = overrideModeLabel(snapshot.popupWindowsEnabled), + checked = effectivePopupWindows, + onCheckedChange = { onSnapshotChanged(snapshot.copy(popupWindowsEnabled = it)) } + ) + IkarRowDivider(startIndent = 0.dp) + IkarToggleRow( + title = "Звук в чате", + subtitle = overrideModeLabel(snapshot.soundInActiveChatEnabled), + checked = effectiveSoundInActiveChat, + onCheckedChange = { onSnapshotChanged(snapshot.copy(soundInActiveChatEnabled = it)) } + ) + } + + ChatNotificationSection { + IkarSectionTitle("Сброс", modifier = Modifier.padding(bottom = 12.dp)) + Text( + "Использовать общие настройки", + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 4.dp) + .clickable(onClick = onResetClick), + style = MaterialTheme.typography.titleLarge + ) + Text( + "Вернуть все пункты этого экрана к общим настройкам.", + style = MaterialTheme.typography.bodySmall, + color = TelegramInkMuted + ) + } + + state.errorMessage?.let { + Text(it, color = TelegramDanger, style = MaterialTheme.typography.bodyMedium) + } + state.infoMessage?.let { + Text(it, color = TelegramBlue, style = MaterialTheme.typography.bodyMedium) + } + } + } +} + +@Composable +private fun ChatNotificationSection( + content: @Composable ColumnScope.() -> Unit +) { + IkarSectionCard { + Column(content = content) + } +} + +private fun overrideModeLabel(value: Any?): String = + if (value == null) "Общие настройки" else "Персонально" + +private fun soundCurrentLabel( + value: NotificationSoundOption?, + globalValue: NotificationSoundOption, + options: List<NotificationSoundChoice> +): String { + val currentValue = value ?: globalValue + return soundTitle(currentValue, options) +} + +private fun soundTitle(value: NotificationSoundOption, options: List<NotificationSoundChoice>): String = + options.firstOrNull { it.value == value }?.title ?: "По умолчанию" diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/settings/ChatSettingsScreen.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/settings/ChatSettingsScreen.kt new file mode 100644 index 00000000..b0b4d01d --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/settings/ChatSettingsScreen.kt @@ -0,0 +1,358 @@ +package com.seven.ikar.kotlin.feature.settings + +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ColumnScope +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.WindowInsetsSides +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.only +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.safeDrawing +import androidx.compose.foundation.layout.windowInsetsPadding +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Slider +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.seven.ikar.kotlin.ui.ChatWallpaperBackground +import com.seven.ikar.kotlin.core.settings.ChatDistanceUnitOption +import com.seven.ikar.kotlin.core.settings.ChatSettingsSnapshot +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.outlined.Image +import androidx.compose.material3.Icon +import com.seven.ikar.kotlin.ui.IkarRowDivider +import com.seven.ikar.kotlin.ui.IkarScreenSurface +import com.seven.ikar.kotlin.ui.IkarSectionCard +import com.seven.ikar.kotlin.ui.IkarSectionTitle +import com.seven.ikar.kotlin.ui.IkarSimpleHeader +import com.seven.ikar.kotlin.ui.IkarToggleRow +import com.seven.ikar.kotlin.ui.IkarValueRow +import com.seven.ikar.kotlin.ui.theme.TelegramBlue +import com.seven.ikar.kotlin.ui.theme.TelegramInk +import com.seven.ikar.kotlin.ui.theme.TelegramInkMuted +import kotlin.math.roundToInt + +@Composable +fun ChatSettingsScreen( + state: ChatSettingsUiState, + onBackClick: () -> Unit, + onSnapshotChanged: (ChatSettingsSnapshot) -> Unit, + onWallpaperClick: () -> Unit, + onResetClick: () -> Unit +) { + val snapshot = state.snapshot + + IkarScreenSurface(modifier = Modifier.fillMaxSize()) { + Column( + modifier = Modifier + .fillMaxSize() + .windowInsetsPadding(WindowInsets.safeDrawing.only(WindowInsetsSides.Vertical)) + .verticalScroll(rememberScrollState()) + .padding(horizontal = 18.dp, vertical = 16.dp), + verticalArrangement = Arrangement.spacedBy(16.dp) + ) { + IkarSimpleHeader(title = "Настройки чатов", onBackClick = onBackClick) + + ChatSettingsSection { + IkarSectionTitle("Оформление", modifier = Modifier.padding(bottom = 12.dp)) + SliderSettingBlock( + title = "Размер текста сообщений", + value = snapshot.messageTextSizeSp, + range = 14..26, + previewMessageTextSizeSp = snapshot.messageTextSizeSp, + previewBubbleCornerRadiusDp = snapshot.bubbleCornerRadiusDp, + wallpaperSnapshot = snapshot, + onValueChange = { value -> + onSnapshotChanged(snapshot.copy(messageTextSizeSp = value)) + } + ) + IkarRowDivider(startIndent = 0.dp) + SliderSettingBlock( + title = "Углы блоков с сообщениями", + value = snapshot.bubbleCornerRadiusDp, + range = 4..24, + previewMessageTextSizeSp = snapshot.messageTextSizeSp, + previewBubbleCornerRadiusDp = snapshot.bubbleCornerRadiusDp, + wallpaperSnapshot = snapshot, + onValueChange = { value -> + onSnapshotChanged(snapshot.copy(bubbleCornerRadiusDp = value)) + } + ) + IkarRowDivider(startIndent = 0.dp) + IkarValueRow( + title = "Изменить обои", + subtitle = "Выбрать фон ленты чатов из галереи или готовых вариантов.", + value = "Открыть", + onClick = onWallpaperClick, + leading = { + Icon( + imageVector = Icons.Outlined.Image, + contentDescription = null, + tint = TelegramBlue + ) + } + ) + } + + ChatSettingsSection { + IkarSectionTitle("Медиафайлы и звук", modifier = Modifier.padding(bottom = 12.dp)) + IkarToggleRow( + title = "Листать медиафайлы по нажатию", + subtitle = "Листать нажатием у края экрана в режиме просмотра медиафайлов.", + checked = snapshot.mediaTapToBrowseEnabled, + onCheckedChange = { onSnapshotChanged(snapshot.copy(mediaTapToBrowseEnabled = it)) } + ) + IkarRowDivider(startIndent = 0.dp) + IkarToggleRow( + title = "Поднести и слушать", + subtitle = "Переключаться на верхний динамик, когда вы подносите телефон к уху.", + checked = snapshot.raiseToListenEnabled, + onCheckedChange = { onSnapshotChanged(snapshot.copy(raiseToListenEnabled = it)) } + ) + IkarRowDivider(startIndent = 0.dp) + IkarToggleRow( + title = "Поднести и говорить", + subtitle = "Записывать голосовое сообщение, когда вы подносите телефон к уху.", + checked = snapshot.raiseToTalkEnabled, + onCheckedChange = { onSnapshotChanged(snapshot.copy(raiseToTalkEnabled = it)) } + ) + IkarRowDivider(startIndent = 0.dp) + IkarToggleRow( + title = "Пауза музыки при записи", + subtitle = "Останавливать музыку на время записи голосового сообщения.", + checked = snapshot.pauseMusicOnRecordEnabled, + onCheckedChange = { onSnapshotChanged(snapshot.copy(pauseMusicOnRecordEnabled = it)) } + ) + IkarRowDivider(startIndent = 0.dp) + IkarToggleRow( + title = "Пауза музыки при запуске медиа", + subtitle = "Останавливать фоновую музыку при воспроизведении медиафайлов в чате.", + checked = snapshot.pauseMusicOnPlaybackEnabled, + onCheckedChange = { onSnapshotChanged(snapshot.copy(pauseMusicOnPlaybackEnabled = it)) } + ) + IkarRowDivider(startIndent = 0.dp) + IkarValueRow( + title = "Микрофон", + subtitle = "Источник записи голосовых сообщений.", + value = "По умолчанию", + enabled = false + ) + } + + ChatSettingsSection { + IkarSectionTitle("Прочие настройки", modifier = Modifier.padding(bottom = 12.dp)) + IkarToggleRow( + title = "Смена темы ночью", + subtitle = "Автоматически включать ночную тему по локальному сценарию.", + checked = snapshot.autoNightThemeEnabled, + onCheckedChange = { onSnapshotChanged(snapshot.copy(autoNightThemeEnabled = it)) } + ) + IkarRowDivider(startIndent = 0.dp) + IkarToggleRow( + title = "Встроенный браузер", + subtitle = "Открывать ссылки внутри приложения, если доступен встроенный просмотр.", + checked = snapshot.inAppBrowserEnabled, + onCheckedChange = { onSnapshotChanged(snapshot.copy(inAppBrowserEnabled = it)) } + ) + IkarRowDivider(startIndent = 0.dp) + IkarToggleRow( + title = "Анимации", + subtitle = "Использовать анимации интерфейса и медиа-переходов.", + checked = snapshot.animationsEnabled, + onCheckedChange = { onSnapshotChanged(snapshot.copy(animationsEnabled = it)) } + ) + IkarRowDivider(startIndent = 0.dp) + IkarToggleRow( + title = "Прямая отправка", + subtitle = "Показывать недавние чаты в системном меню «Поделиться».", + checked = snapshot.directShareEnabled, + onCheckedChange = { onSnapshotChanged(snapshot.copy(directShareEnabled = it)) } + ) + IkarRowDivider(startIndent = 0.dp) + IkarToggleRow( + title = "Показывать материалы 18+", + subtitle = "Не скрывать чувствительные медиафайлы.", + checked = snapshot.showSensitiveContentEnabled, + onCheckedChange = { onSnapshotChanged(snapshot.copy(showSensitiveContentEnabled = it)) } + ) + IkarRowDivider(startIndent = 0.dp) + IkarToggleRow( + title = "Отправка по Вводу", + subtitle = "Использовать действие отправки вместо перевода строки, если клавиатура поддерживает «Отправить».", + checked = snapshot.sendByEnterEnabled, + onCheckedChange = { onSnapshotChanged(snapshot.copy(sendByEnterEnabled = it)) } + ) + IkarRowDivider(startIndent = 0.dp) + IkarValueRow( + title = "Мера расстояния", + subtitle = "Единицы для геоданных и расстояний в интерфейсе.", + value = snapshot.distanceUnit.title, + onClick = { + onSnapshotChanged(snapshot.copy(distanceUnit = snapshot.distanceUnit.next())) + } + ) + } + + Text( + text = "Сбросить настройки чатов", + modifier = Modifier + .fillMaxWidth() + .clickable(onClick = onResetClick) + .padding(vertical = 4.dp), + style = MaterialTheme.typography.titleLarge, + color = TelegramBlue, + fontWeight = FontWeight.SemiBold + ) + } + } +} + +@Composable +private fun ChatSettingsSection( + content: @Composable ColumnScope.() -> Unit +) { + IkarSectionCard { + Column(content = content) + } +} + +@Composable +private fun SliderSettingBlock( + title: String, + value: Int, + range: IntRange, + previewMessageTextSizeSp: Int, + previewBubbleCornerRadiusDp: Int, + wallpaperSnapshot: ChatSettingsSnapshot, + onValueChange: (Int) -> Unit +) { + Column(verticalArrangement = Arrangement.spacedBy(8.dp)) { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + Text(title, style = MaterialTheme.typography.titleLarge) + Text( + text = value.toString(), + style = MaterialTheme.typography.titleMedium, + color = TelegramBlue + ) + } + Slider( + value = value.toFloat(), + onValueChange = { onValueChange(it.roundToInt().coerceIn(range.first, range.last)) }, + valueRange = range.first.toFloat()..range.last.toFloat(), + steps = (range.last - range.first - 1).coerceAtLeast(0) + ) + ChatStylePreview( + messageTextSizeSp = previewMessageTextSizeSp, + bubbleCornerRadiusDp = previewBubbleCornerRadiusDp, + wallpaperSnapshot = wallpaperSnapshot + ) + } +} + +@Composable +private fun ChatStylePreview( + messageTextSizeSp: Int, + bubbleCornerRadiusDp: Int, + wallpaperSnapshot: ChatSettingsSnapshot +) { + val bubbleRadius = bubbleCornerRadiusDp.dp + Box( + modifier = Modifier + .fillMaxWidth() + .background(Color(0xFFE7F6F0), RoundedCornerShape(20.dp)) + ) { + Box( + modifier = Modifier + .fillMaxSize() + .background(Color.White.copy(alpha = 0.08f), RoundedCornerShape(20.dp)) + ) + Box( + modifier = Modifier + .fillMaxSize() + .background(Color.Transparent, RoundedCornerShape(20.dp)) + ) { + ChatWallpaperBackground( + snapshot = wallpaperSnapshot, + modifier = Modifier.fillMaxSize() + ) + } + Column( + modifier = Modifier + .fillMaxSize() + .background(Color.White.copy(alpha = 0.12f), RoundedCornerShape(20.dp)) + .padding(12.dp), + verticalArrangement = Arrangement.spacedBy(8.dp) + ) { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.Start + ) { + Text( + text = "Доброе утро!", + modifier = Modifier + .background(Color(0xFFFBE8EC), RoundedCornerShape(bubbleRadius)) + .padding(horizontal = 12.dp, vertical = 8.dp), + style = MaterialTheme.typography.bodyLarge.copy(fontSize = messageTextSizeSp.sp), + color = TelegramInk + ) + } + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.End + ) { + Text( + text = "Знаю, который час?", + modifier = Modifier + .background(Color.White, RoundedCornerShape(bubbleRadius)) + .padding(horizontal = 12.dp, vertical = 8.dp), + style = MaterialTheme.typography.bodyLarge.copy(fontSize = messageTextSizeSp.sp), + color = TelegramInk + ) + } + } + } +} + +@Composable +private fun BoxLine(width: Dp) { + Row( + modifier = Modifier + .width(width) + .background(Color(0xFFDCE4EA), RoundedCornerShape(999.dp)) + .padding(vertical = 2.dp) + ) {} +} + +private val ChatDistanceUnitOption.title: String + get() = when (this) { + ChatDistanceUnitOption.Automatic -> "Автоматически" + ChatDistanceUnitOption.Kilometers -> "Километры" + ChatDistanceUnitOption.Miles -> "Мили" + } + +private fun ChatDistanceUnitOption.next(): ChatDistanceUnitOption = when (this) { + ChatDistanceUnitOption.Automatic -> ChatDistanceUnitOption.Kilometers + ChatDistanceUnitOption.Kilometers -> ChatDistanceUnitOption.Miles + ChatDistanceUnitOption.Miles -> ChatDistanceUnitOption.Automatic +} + diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/settings/ChatSettingsViewModel.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/settings/ChatSettingsViewModel.kt new file mode 100644 index 00000000..bde36662 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/settings/ChatSettingsViewModel.kt @@ -0,0 +1,35 @@ +package com.seven.ikar.kotlin.feature.settings + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.seven.ikar.kotlin.app.AppContainer +import com.seven.ikar.kotlin.core.settings.ChatSettingsSnapshot +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch + +data class ChatSettingsUiState( + val snapshot: ChatSettingsSnapshot = ChatSettingsSnapshot() +) + +class ChatSettingsViewModel(private val container: AppContainer) : ViewModel() { + private val _uiState = MutableStateFlow(ChatSettingsUiState(snapshot = container.chatSettings.loadSnapshot())) + val uiState: StateFlow<ChatSettingsUiState> = _uiState.asStateFlow() + + init { + viewModelScope.launch { + container.chatSettings.snapshot.collect { snapshot -> + _uiState.value = ChatSettingsUiState(snapshot = snapshot) + } + } + } + + fun updateSnapshot(transform: (ChatSettingsSnapshot) -> ChatSettingsSnapshot) { + container.chatSettings.update(transform) + } + + fun reset() { + container.chatSettings.reset() + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/settings/ChatWallpaperScreen.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/settings/ChatWallpaperScreen.kt new file mode 100644 index 00000000..0942cdc6 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/settings/ChatWallpaperScreen.kt @@ -0,0 +1,216 @@ +package com.seven.ikar.kotlin.feature.settings + +import android.content.Intent +import android.net.Uri +import androidx.activity.compose.rememberLauncherForActivityResult +import androidx.activity.result.contract.ActivityResultContracts +import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.BoxScope +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.WindowInsetsSides +import androidx.compose.foundation.layout.aspectRatio +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.only +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.safeDrawing +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.windowInsetsPadding +import androidx.compose.foundation.lazy.grid.GridCells +import androidx.compose.foundation.lazy.grid.LazyVerticalGrid +import androidx.compose.foundation.lazy.grid.items +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.outlined.CheckCircle +import androidx.compose.material.icons.outlined.Image +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import com.seven.ikar.kotlin.core.settings.ChatSettingsSnapshot +import com.seven.ikar.kotlin.ui.AuthenticatedAsyncImage +import com.seven.ikar.kotlin.ui.ChatWallpaperCatalog +import com.seven.ikar.kotlin.ui.IkarScreenSurface +import com.seven.ikar.kotlin.ui.IkarSectionCard +import com.seven.ikar.kotlin.ui.IkarSimpleHeader +import com.seven.ikar.kotlin.ui.IkarValueRow +import com.seven.ikar.kotlin.ui.PresetWallpaperBackground +import com.seven.ikar.kotlin.ui.theme.TelegramBlue +import com.seven.ikar.kotlin.ui.theme.TelegramInkMuted + +@Composable +fun ChatWallpaperScreen( + snapshot: ChatSettingsSnapshot, + onBackClick: () -> Unit, + onPresetSelected: (String) -> Unit, + onCustomWallpaperSelected: (Uri) -> Unit, + onUseCustomWallpaper: () -> Unit +) { + val context = LocalContext.current + val presets = remember { ChatWallpaperCatalog.presets } + val wallpaperPicker = rememberLauncherForActivityResult(ActivityResultContracts.OpenDocument()) { uri -> + if (uri != null) { + runCatching { + context.contentResolver.takePersistableUriPermission( + uri, + Intent.FLAG_GRANT_READ_URI_PERMISSION + ) + } + onCustomWallpaperSelected(uri) + } + } + + IkarScreenSurface(modifier = Modifier.fillMaxSize()) { + Column( + modifier = Modifier + .fillMaxSize() + .windowInsetsPadding(WindowInsets.safeDrawing.only(WindowInsetsSides.Vertical)) + .padding(horizontal = 18.dp, vertical = 16.dp), + verticalArrangement = Arrangement.spacedBy(16.dp) + ) { + IkarSimpleHeader( + title = "Обои чата", + onBackClick = onBackClick + ) + + IkarSectionCard { + IkarValueRow( + title = "Выбрать из галереи", + subtitle = "Поставить свою картинку как фон ленты чатов.", + value = "Открыть", + onClick = { wallpaperPicker.launch(arrayOf("image/*")) }, + leading = { + Icon( + imageVector = Icons.Outlined.Image, + contentDescription = null, + tint = TelegramBlue + ) + } + ) + } + + Text( + text = "Готовые обои", + style = MaterialTheme.typography.titleLarge, + fontWeight = FontWeight.SemiBold + ) + + LazyVerticalGrid( + columns = GridCells.Fixed(3), + modifier = Modifier.fillMaxSize(), + contentPadding = PaddingValues(bottom = 24.dp), + horizontalArrangement = Arrangement.spacedBy(12.dp), + verticalArrangement = Arrangement.spacedBy(12.dp) + ) { + snapshot.customWallpaperUri?.takeIf { it.isNotBlank() }?.let { customWallpaperUri -> + item(key = "custom-wallpaper") { + WallpaperChoiceCard( + title = "Мои обои", + isSelected = snapshot.useCustomWallpaper, + onClick = onUseCustomWallpaper + ) { + AuthenticatedAsyncImage( + imageUrl = customWallpaperUri, + contentDescription = "Пользовательские обои", + modifier = Modifier.fillMaxSize(), + contentScale = ContentScale.Crop + ) + } + } + } + + items(items = presets, key = { it.id }) { preset -> + WallpaperChoiceCard( + title = preset.title, + isSelected = !snapshot.useCustomWallpaper && snapshot.selectedWallpaperPresetId == preset.id, + onClick = { onPresetSelected(preset.id) } + ) { + PresetWallpaperBackground( + preset = preset, + modifier = Modifier.fillMaxSize() + ) + } + } + } + } + } +} + +@Composable +private fun WallpaperChoiceCard( + title: String, + isSelected: Boolean, + onClick: () -> Unit, + preview: @Composable BoxScope.() -> Unit +) { + Surface( + modifier = Modifier + .fillMaxWidth() + .aspectRatio(0.78f) + .clickable(onClick = onClick), + shape = RoundedCornerShape(20.dp), + color = MaterialTheme.colorScheme.surface, + border = BorderStroke( + width = if (isSelected) 2.dp else 1.dp, + color = if (isSelected) TelegramBlue else MaterialTheme.colorScheme.outline.copy(alpha = 0.32f) + ), + shadowElevation = if (isSelected) 8.dp else 4.dp + ) { + Column( + modifier = Modifier.padding(8.dp), + verticalArrangement = Arrangement.spacedBy(8.dp) + ) { + Box( + modifier = Modifier + .fillMaxWidth() + .height(96.dp) + .clip(RoundedCornerShape(14.dp)), + contentAlignment = Alignment.TopEnd + ) { + preview() + if (isSelected) { + Surface( + modifier = Modifier + .padding(8.dp) + .size(22.dp), + shape = RoundedCornerShape(999.dp), + color = TelegramBlue, + shadowElevation = 3.dp + ) { + Box(contentAlignment = Alignment.Center) { + Icon( + imageVector = Icons.Outlined.CheckCircle, + contentDescription = "Обои выбраны", + tint = MaterialTheme.colorScheme.surface, + modifier = Modifier.size(16.dp) + ) + } + } + } + } + Text( + text = title, + style = MaterialTheme.typography.bodySmall, + color = if (isSelected) MaterialTheme.colorScheme.onSurface else TelegramInkMuted, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + } + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/settings/DataStorageSettingsScreen.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/settings/DataStorageSettingsScreen.kt new file mode 100644 index 00000000..4971c677 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/settings/DataStorageSettingsScreen.kt @@ -0,0 +1,145 @@ +package com.seven.ikar.kotlin.feature.settings + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.WindowInsetsSides +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.only +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.safeDrawing +import androidx.compose.foundation.layout.windowInsetsPadding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.Button +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import com.seven.ikar.kotlin.core.settings.AppSettingsSnapshot +import com.seven.ikar.kotlin.ui.IkarRowDivider +import com.seven.ikar.kotlin.ui.IkarScreenSurface +import com.seven.ikar.kotlin.ui.IkarSectionCard +import com.seven.ikar.kotlin.ui.IkarSectionTitle +import com.seven.ikar.kotlin.ui.IkarSimpleHeader +import com.seven.ikar.kotlin.ui.IkarToggleRow +import com.seven.ikar.kotlin.ui.IkarValueRow +import com.seven.ikar.kotlin.ui.theme.TelegramInkMuted + +@Composable +fun DataStorageSettingsScreen( + state: AppSettingsUiState, + onBackClick: () -> Unit, + onSnapshotChanged: ((AppSettingsSnapshot) -> AppSettingsSnapshot) -> Unit, + onProxyClick: () -> Unit, + onResetClick: () -> Unit +) { + val snapshot = state.snapshot + IkarScreenSurface(modifier = Modifier.fillMaxSize()) { + Column( + modifier = Modifier + .fillMaxSize() + .windowInsetsPadding(WindowInsets.safeDrawing.only(WindowInsetsSides.Vertical)) + .verticalScroll(rememberScrollState()) + .padding(horizontal = 18.dp, vertical = 16.dp), + verticalArrangement = Arrangement.spacedBy(16.dp) + ) { + IkarSimpleHeader(title = "Данные и память", onBackClick = onBackClick) + + IkarSectionCard { + IkarSectionTitle("Использование памяти", modifier = Modifier.padding(bottom = 12.dp)) + IkarValueRow( + "Кэш Ikar", + "Лимит локальных медиа и превью на устройстве.", + "${snapshot.maxCacheMb} МБ", + onClick = { onSnapshotChanged { it.copy(maxCacheMb = nextCacheLimit(it.maxCacheMb)) } } + ) + IkarRowDivider(startIndent = 0.dp) + IkarValueRow( + "Хранить медиа", + "Срок хранения локальных файлов перед LRU-очисткой.", + "${snapshot.keepMediaDays} дн.", + onClick = { onSnapshotChanged { it.copy(keepMediaDays = nextKeepDays(it.keepMediaDays)) } } + ) + Text( + "Параметры сохраняются локально и готовы для подключения к TransferQueue/LRU-очистке.", + modifier = Modifier.padding(top = 8.dp), + style = MaterialTheme.typography.bodySmall, + color = TelegramInkMuted + ) + } + + IkarSectionCard { + IkarSectionTitle("Автозагрузка медиа", modifier = Modifier.padding(bottom = 12.dp)) + IkarToggleRow( + "Фото", + "Автоматически загружать фото в чатах.", + snapshot.autoDownloadPhotos, + onCheckedChange = { value -> onSnapshotChanged { it.copy(autoDownloadPhotos = value) } } + ) + IkarRowDivider(startIndent = 0.dp) + IkarToggleRow( + "Видео", + "Автоматически загружать видео только по Wi-Fi.", + snapshot.autoDownloadVideosOnWifi, + onCheckedChange = { value -> onSnapshotChanged { it.copy(autoDownloadVideosOnWifi = value) } } + ) + IkarRowDivider(startIndent = 0.dp) + IkarToggleRow( + "Файлы", + "Автозагрузка документов только по Wi-Fi.", + snapshot.autoDownloadFilesOnWifi, + onCheckedChange = { value -> onSnapshotChanged { it.copy(autoDownloadFilesOnWifi = value) } } + ) + IkarRowDivider(startIndent = 0.dp) + IkarToggleRow( + "Сохранять в галерею", + "Добавлять новые медиа в системную галерею.", + snapshot.saveMediaToGallery, + onCheckedChange = { value -> onSnapshotChanged { it.copy(saveMediaToGallery = value) } } + ) + } + + IkarSectionCard { + IkarSectionTitle("Сеть", modifier = Modifier.padding(bottom = 12.dp)) + IkarToggleRow( + "Меньше данных для звонков", + "Снижать битрейт звонков в мобильной сети.", + snapshot.lowDataCalls, + onCheckedChange = { value -> onSnapshotChanged { it.copy(lowDataCalls = value) } } + ) + IkarRowDivider(startIndent = 0.dp) + IkarValueRow( + "Прокси", + "SOCKS/MTProto/HTTP профиль для сетевого слоя.", + if (snapshot.proxyEnabled) "Вкл." else "Выкл.", + onClick = onProxyClick + ) + } + + Button(onClick = onResetClick, modifier = Modifier.fillMaxWidth()) { + Text("Сбросить настройки") + } + Button(onClick = onBackClick, modifier = Modifier.fillMaxWidth()) { + Text("Готово") + } + } + } +} + +private fun nextCacheLimit(current: Int): Int = when { + current < 512 -> 512 + current < 1024 -> 1024 + current < 4096 -> 4096 + else -> 128 +} + +private fun nextKeepDays(current: Int): Int = when { + current < 7 -> 7 + current < 30 -> 30 + current < 90 -> 90 + current < 365 -> 365 + else -> 1 +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/settings/NotificationSettingsScreen.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/settings/NotificationSettingsScreen.kt new file mode 100644 index 00000000..9c6a373a --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/settings/NotificationSettingsScreen.kt @@ -0,0 +1,196 @@ +package com.seven.ikar.kotlin.feature.settings + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ColumnScope +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.WindowInsetsSides +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.only +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.safeDrawing +import androidx.compose.foundation.layout.windowInsetsPadding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.outlined.Campaign +import androidx.compose.material.icons.outlined.ChatBubbleOutline +import androidx.compose.material.icons.outlined.Groups +import androidx.compose.material.icons.outlined.Notifications +import androidx.compose.material.icons.outlined.PersonOutline +import androidx.compose.material.icons.outlined.Phone +import androidx.compose.material.icons.outlined.Schedule +import androidx.compose.material.icons.outlined.VolumeUp +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import com.seven.ikar.kotlin.core.push.NotificationPreferenceCatalog +import com.seven.ikar.kotlin.core.push.NotificationRepeatIntervalChoice +import com.seven.ikar.kotlin.core.push.NotificationRepeatIntervalOption +import com.seven.ikar.kotlin.core.push.NotificationSettingsSnapshot +import com.seven.ikar.kotlin.core.push.NotificationSoundChoice +import com.seven.ikar.kotlin.core.push.NotificationSoundOption +import com.seven.ikar.kotlin.ui.IkarRowDivider +import com.seven.ikar.kotlin.ui.IkarScreenSurface +import com.seven.ikar.kotlin.ui.IkarSectionCard +import com.seven.ikar.kotlin.ui.IkarSectionTitle +import com.seven.ikar.kotlin.ui.IkarSimpleHeader +import com.seven.ikar.kotlin.ui.IkarToggleRow +import com.seven.ikar.kotlin.ui.IkarValueRow +import com.seven.ikar.kotlin.ui.theme.TelegramBlue +import com.seven.ikar.kotlin.ui.theme.TelegramDanger +import com.seven.ikar.kotlin.ui.theme.TelegramInkMuted + +@Composable +fun NotificationSettingsScreen( + state: NotificationSettingsUiState, + messageSoundOptions: List<NotificationSoundChoice>, + callRingtoneOptions: List<NotificationSoundChoice>, + repeatIntervalOptions: List<NotificationRepeatIntervalChoice>, + onBackClick: () -> Unit, + onSnapshotChanged: (NotificationSettingsSnapshot) -> Unit, + onMessageSoundChanged: (NotificationSoundOption) -> Unit, + onCallRingtoneChanged: (NotificationSoundOption) -> Unit, + onRepeatIntervalChanged: (NotificationRepeatIntervalOption) -> Unit, + onSaveClick: () -> Unit, + onResetClick: () -> Unit +) { + val snapshot = state.snapshot + + IkarScreenSurface(modifier = Modifier.fillMaxSize()) { + Column( + modifier = Modifier + .fillMaxSize() + .windowInsetsPadding(WindowInsets.safeDrawing.only(WindowInsetsSides.Vertical)) + .verticalScroll(rememberScrollState()) + .padding(horizontal = 18.dp, vertical = 16.dp), + verticalArrangement = Arrangement.spacedBy(16.dp) + ) { + IkarSimpleHeader(title = "Уведомления и звуки", onBackClick = onBackClick) + + NotificationSection { + IkarSectionTitle("Уведомления из чатов", modifier = Modifier.padding(bottom = 12.dp)) + IkarToggleRow("Личные чаты", "Нажмите для изменения", snapshot.privateChatsEnabled, { onSnapshotChanged(snapshot.copy(privateChatsEnabled = it)) }, leading = { androidx.compose.material3.Icon(Icons.Outlined.PersonOutline, contentDescription = null, tint = TelegramInkMuted) }) + IkarRowDivider(startIndent = 32.dp) + IkarToggleRow("Группы", "Нажмите для изменения", snapshot.groupsEnabled, { onSnapshotChanged(snapshot.copy(groupsEnabled = it)) }, leading = { androidx.compose.material3.Icon(Icons.Outlined.Groups, contentDescription = null, tint = TelegramInkMuted) }) + IkarRowDivider(startIndent = 32.dp) + IkarToggleRow("Каналы", "Нажмите для изменения", snapshot.channelsEnabled, { onSnapshotChanged(snapshot.copy(channelsEnabled = it)) }, leading = { androidx.compose.material3.Icon(Icons.Outlined.Campaign, contentDescription = null, tint = TelegramInkMuted) }) + IkarRowDivider(startIndent = 32.dp) + IkarToggleRow("Истории", "Отключены, 5 автоматических...", snapshot.storiesEnabled, { onSnapshotChanged(snapshot.copy(storiesEnabled = it)) }, leading = { androidx.compose.material3.Icon(Icons.Outlined.Schedule, contentDescription = null, tint = TelegramInkMuted) }) + IkarRowDivider(startIndent = 32.dp) + IkarToggleRow("Реакции", "Сообщения, Истории", snapshot.reactionsEnabled, { onSnapshotChanged(snapshot.copy(reactionsEnabled = it)) }, leading = { Text("♥", color = TelegramBlue, style = MaterialTheme.typography.titleMedium) }) + } + + NotificationSection { + IkarSectionTitle("Звонки", modifier = Modifier.padding(bottom = 12.dp)) + IkarValueRow( + title = "Вибросигнал", + subtitle = "Переключить режим вибрации при звонке", + value = if (snapshot.callVibrationEnabled) "По умолчанию" else "Выключен", + onClick = { onSnapshotChanged(snapshot.copy(callVibrationEnabled = !snapshot.callVibrationEnabled)) }, + leading = { androidx.compose.material3.Icon(Icons.Outlined.Phone, contentDescription = null, tint = TelegramInkMuted) } + ) + IkarRowDivider(startIndent = 0.dp) + IkarValueRow( + title = "Рингтон", + subtitle = "Системный звук входящего звонка в Икар", + value = callRingtoneOptions.firstOrNull { it.value == snapshot.callRingtone }?.title ?: "По умолчанию", + onClick = { + val currentIndex = callRingtoneOptions.indexOfFirst { it.value == snapshot.callRingtone }.coerceAtLeast(0) + val next = callRingtoneOptions[(currentIndex + 1) % callRingtoneOptions.size] + onCallRingtoneChanged(next.value) + }, + leading = { androidx.compose.material3.Icon(Icons.Outlined.VolumeUp, contentDescription = null, tint = TelegramInkMuted) } + ) + } + + NotificationSection { + IkarSectionTitle("Счётчик сообщений", modifier = Modifier.padding(bottom = 12.dp)) + IkarToggleRow("Показывать счётчик", "Разрешать значок-счётчик на иконке приложения", snapshot.showBadge, { onSnapshotChanged(snapshot.copy(showBadge = it)) }) + IkarRowDivider(startIndent = 0.dp) + IkarToggleRow("Чаты без уведомлений", "Показывать muted-чаты внутри общего счётчика", snapshot.includeMutedChatsInBadge, { onSnapshotChanged(snapshot.copy(includeMutedChatsInBadge = it)) }) + IkarRowDivider(startIndent = 0.dp) + IkarToggleRow("Число сообщений", "Показывать количество непрочитанных сообщений", snapshot.countMessagesInBadge, { onSnapshotChanged(snapshot.copy(countMessagesInBadge = it)) }) + } + + NotificationSection { + IkarSectionTitle("В приложении", modifier = Modifier.padding(bottom = 12.dp)) + IkarToggleRow("Звук", "Проигрывать звук для всплывающих уведомлений", snapshot.inAppSoundEnabled, { onSnapshotChanged(snapshot.copy(inAppSoundEnabled = it)) }) + IkarRowDivider(startIndent = 0.dp) + IkarToggleRow("Вибросигнал", "Вибрировать для in-app уведомлений", snapshot.inAppVibrationEnabled, { onSnapshotChanged(snapshot.copy(inAppVibrationEnabled = it)) }) + IkarRowDivider(startIndent = 0.dp) + IkarToggleRow("Показывать текст", "Показывать содержимое сообщения во всплывающем окне", snapshot.inAppShowTextEnabled, { onSnapshotChanged(snapshot.copy(inAppShowTextEnabled = it)) }) + IkarRowDivider(startIndent = 0.dp) + IkarToggleRow("Звук в чате", "Короткий сигнал для уже открытого чата", snapshot.soundInActiveChatEnabled, { onSnapshotChanged(snapshot.copy(soundInActiveChatEnabled = it)) }) + IkarRowDivider(startIndent = 0.dp) + IkarToggleRow("Всплывающие окна", "Показывать всплывающие окна, когда приложение открыто", snapshot.popupWindowsEnabled, { onSnapshotChanged(snapshot.copy(popupWindowsEnabled = it)) }) + } + + NotificationSection { + IkarSectionTitle("События", modifier = Modifier.padding(bottom = 12.dp)) + IkarToggleRow("Контакт присоединился к Ikar", "Сообщать, когда контакт появился в Ikar", snapshot.contactJoinedEnabled, { onSnapshotChanged(snapshot.copy(contactJoinedEnabled = it)) }) + IkarRowDivider(startIndent = 0.dp) + IkarToggleRow("Закреплённые сообщения", "Показывать уведомления о закреплённых сообщениях", snapshot.pinnedMessagesEnabled, { onSnapshotChanged(snapshot.copy(pinnedMessagesEnabled = it)) }) + } + + NotificationSection { + IkarSectionTitle("Другое", modifier = Modifier.padding(bottom = 12.dp)) + IkarToggleRow("Перезапуск при закрытии", "Поднимать фоновый сервис доставки уведомлений", snapshot.restartOnCloseEnabled, { onSnapshotChanged(snapshot.copy(restartOnCloseEnabled = it)) }) + IkarRowDivider(startIndent = 0.dp) + IkarToggleRow("Фоновое соединение", "Держать минимальное фоновое соединение", snapshot.backgroundConnectionEnabled, { onSnapshotChanged(snapshot.copy(backgroundConnectionEnabled = it)) }) + IkarRowDivider(startIndent = 0.dp) + IkarValueRow( + title = "Повтор уведомлений", + subtitle = "Повторять уведомление, пока в чате есть непрочитанные сообщения", + value = repeatIntervalOptions.firstOrNull { it.value == snapshot.repeatInterval }?.title ?: "1 час", + onClick = { + val currentIndex = repeatIntervalOptions.indexOfFirst { it.value == snapshot.repeatInterval }.coerceAtLeast(0) + val next = repeatIntervalOptions[(currentIndex + 1) % repeatIntervalOptions.size] + onRepeatIntervalChanged(next.value) + } + ) + } + + NotificationSection { + IkarSectionTitle("Сброс", modifier = Modifier.padding(bottom = 12.dp)) + Text( + "Сбросить настройки уведомлений", + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 4.dp) + .clickable(onClick = onResetClick), + style = MaterialTheme.typography.titleLarge + ) + Text( + "Сбросить все особые настройки уведомлений для отдельных контактов, групп и каналов.", + style = MaterialTheme.typography.bodySmall, + color = TelegramInkMuted + ) + } + + androidx.compose.material3.Button(onClick = onSaveClick, modifier = Modifier.fillMaxWidth()) { + Text(if (state.isSaving) "Сохранение..." else "Сохранить") + } + + state.errorMessage?.let { + Text(it, color = TelegramDanger, style = MaterialTheme.typography.bodyMedium) + } + state.infoMessage?.let { + Text(it, color = TelegramBlue, style = MaterialTheme.typography.bodyMedium) + } + } + } +} + +@Composable +private fun NotificationSection( + content: @Composable ColumnScope.() -> Unit +) { + IkarSectionCard { + Column(content = content) + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/settings/NotificationSettingsViewModel.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/settings/NotificationSettingsViewModel.kt new file mode 100644 index 00000000..a4bb9632 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/settings/NotificationSettingsViewModel.kt @@ -0,0 +1,63 @@ +package com.seven.ikar.kotlin.feature.settings + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.seven.ikar.kotlin.app.AppContainer +import com.seven.ikar.kotlin.core.push.NotificationPreferenceCatalog +import com.seven.ikar.kotlin.core.push.NotificationRepeatIntervalChoice +import com.seven.ikar.kotlin.core.push.NotificationRepeatIntervalOption +import com.seven.ikar.kotlin.core.push.NotificationSettingsSnapshot +import com.seven.ikar.kotlin.core.push.NotificationSoundChoice +import com.seven.ikar.kotlin.core.push.NotificationSoundOption +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch + +data class NotificationSettingsUiState( + val snapshot: NotificationSettingsSnapshot, + val isSaving: Boolean = false, + val errorMessage: String? = null, + val infoMessage: String? = null +) + +class NotificationSettingsViewModel(private val container: AppContainer) : ViewModel() { + private val _uiState = MutableStateFlow( + NotificationSettingsUiState(snapshot = container.pushSettings.loadSnapshot()) + ) + val uiState: StateFlow<NotificationSettingsUiState> = _uiState.asStateFlow() + + val messageSoundOptions: List<NotificationSoundChoice> = NotificationPreferenceCatalog.messageSoundChoices + val callRingtoneOptions: List<NotificationSoundChoice> = NotificationPreferenceCatalog.callRingtoneChoices + val repeatIntervalOptions: List<NotificationRepeatIntervalChoice> = NotificationPreferenceCatalog.repeatChoices + + fun updateSnapshot(transform: (NotificationSettingsSnapshot) -> NotificationSettingsSnapshot) { + _uiState.value = _uiState.value.copy(snapshot = transform(_uiState.value.snapshot)) + } + + fun setMessageSound(value: NotificationSoundOption) = updateSnapshot { it.copy(messageSound = value) } + + fun setCallRingtone(value: NotificationSoundOption) = updateSnapshot { it.copy(callRingtone = value) } + + fun setRepeatInterval(value: NotificationRepeatIntervalOption) = updateSnapshot { it.copy(repeatInterval = value) } + + fun save() { + viewModelScope.launch { + val snapshot = _uiState.value.snapshot + _uiState.value = _uiState.value.copy(isSaving = true, errorMessage = null, infoMessage = null) + runCatching { + container.pushSettings.saveSnapshot(snapshot) + container.pushRegistrationManager.registerCurrentDeviceAsync() + }.onSuccess { + _uiState.value = _uiState.value.copy(isSaving = false, infoMessage = "Настройки уведомлений сохранены.") + }.onFailure { error -> + _uiState.value = _uiState.value.copy(isSaving = false, errorMessage = error.message) + } + } + } + + fun reset() { + container.pushSettings.resetNotificationPreferences() + _uiState.value = NotificationSettingsUiState(snapshot = container.pushSettings.createDefaultSnapshot()) + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/settings/SettingsPlaceholdersScreen.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/settings/SettingsPlaceholdersScreen.kt new file mode 100644 index 00000000..fcb030db --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/settings/SettingsPlaceholdersScreen.kt @@ -0,0 +1,360 @@ +package com.seven.ikar.kotlin.feature.settings + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ColumnScope +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.WindowInsetsSides +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.only +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.safeDrawing +import androidx.compose.foundation.layout.windowInsetsPadding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.Button +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import com.seven.ikar.kotlin.core.settings.AppLanguageMode +import com.seven.ikar.kotlin.core.settings.AppProxyType +import com.seven.ikar.kotlin.core.settings.AppSettingsSnapshot +import com.seven.ikar.kotlin.core.settings.AppThemeMode +import com.seven.ikar.kotlin.ui.IkarRowDivider +import com.seven.ikar.kotlin.ui.IkarScreenSurface +import com.seven.ikar.kotlin.ui.IkarSectionCard +import com.seven.ikar.kotlin.ui.IkarSectionTitle +import com.seven.ikar.kotlin.ui.IkarSimpleHeader +import com.seven.ikar.kotlin.ui.IkarToggleRow +import com.seven.ikar.kotlin.ui.IkarValueRow +import com.seven.ikar.kotlin.ui.theme.TelegramBlue +import com.seven.ikar.kotlin.ui.theme.TelegramInkMuted + +@Composable +fun PrivacySettingsV2Screen( + onBackClick: () -> Unit, + onBlockedUsersClick: () -> Unit, + onExceptionsClick: () -> Unit +) { + IkarScreenSurface(modifier = Modifier.fillMaxSize()) { + Column( + modifier = Modifier + .fillMaxSize() + .windowInsetsPadding(WindowInsets.safeDrawing.only(WindowInsetsSides.Vertical)) + .verticalScroll(rememberScrollState()) + .padding(horizontal = 18.dp, vertical = 16.dp), + verticalArrangement = Arrangement.spacedBy(16.dp) + ) { + IkarSimpleHeader(title = "Конфиденциальность", onBackClick = onBackClick) + IkarSectionCard { + IkarSectionTitle("Исключения", modifier = Modifier.padding(bottom = 12.dp)) + IkarValueRow("Заблокированные пользователи", "Список блокировок хранится в настройках конфиденциальности.", "Открыть", onClick = onBlockedUsersClick) + IkarRowDivider(startIndent = 0.dp) + IkarValueRow("Исключения приватности", "Списки «всегда разрешать» и «никогда не разрешать» для телефона, фото и историй.", "Открыть", onClick = onExceptionsClick) + } + IkarSectionCard { + Text("Подключено к серверному контракту", style = MaterialTheme.typography.titleLarge, color = TelegramBlue) + Text( + "Основные переключатели конфиденциальности и безопасности доступны через прежний экран; этот экран оставляет навигацию по подразделам как в Telegram.", + modifier = Modifier.padding(top = 6.dp), + style = MaterialTheme.typography.bodySmall, + color = TelegramInkMuted + ) + } + } + } +} + +@Composable +fun BlockedUsersPlaceholderScreen(onBackClick: () -> Unit) { + SimpleSettingsInfoScreen( + title = "Заблокированные", + body = "Сервер уже хранит список заблокированных пользователей в настройках конфиденциальности. Следующий слой: выбор пользователя с поиском и быстрым снятием блокировки.", + onBackClick = onBackClick + ) +} + +@Composable +fun PrivacyExceptionsPlaceholderScreen(onBackClick: () -> Unit) { + SimpleSettingsInfoScreen( + title = "Исключения", + body = "Контракт поддерживает списки разрешённых и запрещённых пользователей. Для полного интерфейса как в Telegram нужен выбор пользователей из контактов и отдельные правила для каждого поля.", + onBackClick = onBackClick + ) +} + +@Composable +fun ThemePlaceholderScreen( + state: AppSettingsUiState, + onBackClick: () -> Unit, + onSnapshotChanged: ((AppSettingsSnapshot) -> AppSettingsSnapshot) -> Unit, + onResetClick: () -> Unit +) { + val snapshot = state.snapshot + IkarSettingsScaffold(title = "Тема", onBackClick = onBackClick) { + IkarSectionCard { + IkarSectionTitle("Режим", modifier = Modifier.padding(bottom = 10.dp)) + AppThemeMode.entries.forEachIndexed { index, mode -> + SelectableSettingsRow( + title = mode.themeTitle(), + subtitle = mode.themeSubtitle(), + selected = snapshot.themeMode == mode, + onClick = { onSnapshotChanged { it.copy(themeMode = mode) } } + ) + if (index != AppThemeMode.entries.lastIndex) { + IkarRowDivider(startIndent = 0.dp) + } + } + } + IkarSectionCard { + IkarSectionTitle("Оформление", modifier = Modifier.padding(bottom = 10.dp)) + IkarValueRow( + "Акцент", + "Быстрый выбор фирменного цвета.", + accentColorTitle(snapshot.accentColorName), + onClick = { onSnapshotChanged { it.copy(accentColorName = nextAccent(it.accentColorName)) } } + ) + IkarRowDivider(startIndent = 0.dp) + IkarToggleRow( + "Анимированные фоны", + "Живые градиенты в чатах как в Telegram.", + snapshot.animatedBackgrounds, + onCheckedChange = { value -> onSnapshotChanged { it.copy(animatedBackgrounds = value) } } + ) + IkarRowDivider(startIndent = 0.dp) + IkarToggleRow( + "Крупные эмодзи", + "Показывать одиночные эмодзи как большие стикеры.", + snapshot.largeEmoji, + onCheckedChange = { value -> onSnapshotChanged { it.copy(largeEmoji = value) } } + ) + } + Button(onClick = onResetClick, modifier = Modifier.fillMaxWidth()) { + Text("Сбросить") + } + } +} + +@Composable +fun LanguagePlaceholderScreen( + state: AppSettingsUiState, + onBackClick: () -> Unit, + onSnapshotChanged: ((AppSettingsSnapshot) -> AppSettingsSnapshot) -> Unit +) { + val snapshot = state.snapshot + IkarSettingsScaffold(title = "Язык", onBackClick = onBackClick) { + IkarSectionCard { + IkarSectionTitle("Язык приложения", modifier = Modifier.padding(bottom = 10.dp)) + AppLanguageMode.entries.forEachIndexed { index, mode -> + SelectableSettingsRow( + title = mode.languageTitle(), + subtitle = mode.languageSubtitle(), + selected = snapshot.languageMode == mode, + onClick = { onSnapshotChanged { it.copy(languageMode = mode) } } + ) + if (index != AppLanguageMode.entries.lastIndex) { + IkarRowDivider(startIndent = 0.dp) + } + } + } + IkarSectionCard { + Text("Локализация сохранена", style = MaterialTheme.typography.titleMedium, color = TelegramBlue) + Text( + "Значение уже хранится локально. Для полного эффекта нужно применить его в базовом контексте приложения или слое локали Compose.", + modifier = Modifier.padding(top = 6.dp), + style = MaterialTheme.typography.bodySmall, + color = TelegramInkMuted + ) + } + } +} + +@Composable +fun ProxyPlaceholderScreen( + state: AppSettingsUiState, + onBackClick: () -> Unit, + onSnapshotChanged: ((AppSettingsSnapshot) -> AppSettingsSnapshot) -> Unit +) { + val snapshot = state.snapshot + IkarSettingsScaffold(title = "Прокси", onBackClick = onBackClick) { + IkarSectionCard { + IkarToggleRow( + "Использовать прокси", + "Профиль сохраняется локально и готов для подключения к OkHttp.", + snapshot.proxyEnabled, + onCheckedChange = { value -> onSnapshotChanged { it.copy(proxyEnabled = value) } } + ) + IkarRowDivider(startIndent = 0.dp) + IkarValueRow( + "Тип", + "SOCKS5, MTProto или HTTP.", + snapshot.proxyType.proxyTypeTitle(), + onClick = { onSnapshotChanged { it.copy(proxyType = nextProxyType(it.proxyType)) } } + ) + } + + IkarSectionCard { + IkarSectionTitle("Подключение", modifier = Modifier.padding(bottom = 10.dp)) + OutlinedTextField( + value = snapshot.proxyHost, + onValueChange = { value -> onSnapshotChanged { it.copy(proxyHost = value.take(120)) } }, + modifier = Modifier.fillMaxWidth(), + singleLine = true, + label = { Text("Хост") } + ) + OutlinedTextField( + value = snapshot.proxyPort.toString(), + onValueChange = { value -> + value.filter { it.isDigit() }.toIntOrNull()?.let { port -> + onSnapshotChanged { it.copy(proxyPort = port) } + } + }, + modifier = Modifier + .fillMaxWidth() + .padding(top = 10.dp), + singleLine = true, + label = { Text("Порт") } + ) + OutlinedTextField( + value = snapshot.proxySecret, + onValueChange = { value -> onSnapshotChanged { it.copy(proxySecret = value.take(256)) } }, + modifier = Modifier + .fillMaxWidth() + .padding(top = 10.dp), + singleLine = true, + label = { Text("Секрет / пароль") } + ) + } + } +} + +@Composable +private fun IkarSettingsScaffold( + title: String, + onBackClick: () -> Unit, + content: @Composable ColumnScope.() -> Unit +) { + IkarScreenSurface(modifier = Modifier.fillMaxSize()) { + Column( + modifier = Modifier + .fillMaxSize() + .windowInsetsPadding(WindowInsets.safeDrawing.only(WindowInsetsSides.Vertical)) + .verticalScroll(rememberScrollState()) + .padding(horizontal = 18.dp, vertical = 16.dp), + verticalArrangement = Arrangement.spacedBy(16.dp) + ) { + IkarSimpleHeader(title = title, onBackClick = onBackClick) + content() + } + } +} + +@Composable +private fun SelectableSettingsRow( + title: String, + subtitle: String, + selected: Boolean, + onClick: () -> Unit +) { + Row( + modifier = Modifier + .fillMaxWidth() + .clickable(onClick = onClick) + .padding(vertical = 12.dp), + horizontalArrangement = Arrangement.spacedBy(12.dp) + ) { + Surface(color = if (selected) TelegramBlue else Color(0xFFDDE7F0), shape = MaterialTheme.shapes.small) { + Text( + if (selected) "✓" else " ", + modifier = Modifier.padding(horizontal = 8.dp, vertical = 4.dp), + color = Color.White, + fontWeight = FontWeight.Bold + ) + } + Column(modifier = Modifier.weight(1f), verticalArrangement = Arrangement.spacedBy(3.dp)) { + Text(title, style = MaterialTheme.typography.titleMedium) + Text(subtitle, style = MaterialTheme.typography.bodySmall, color = TelegramInkMuted) + } + } +} + +@Composable +private fun SimpleSettingsInfoScreen( + title: String, + body: String, + onBackClick: () -> Unit +) { + IkarSettingsScaffold(title = title, onBackClick = onBackClick) { + IkarSectionCard { + Text("Готова модель данных", style = MaterialTheme.typography.titleLarge, color = TelegramBlue) + Text( + body, + modifier = Modifier.padding(top = 6.dp), + style = MaterialTheme.typography.bodyMedium, + color = TelegramInkMuted + ) + } + } +} + +private fun AppThemeMode.themeTitle(): String = when (this) { + AppThemeMode.System -> "Как в системе" + AppThemeMode.Light -> "Дневная" + AppThemeMode.Dark -> "Ночная" + AppThemeMode.Auto -> "Авто-ночная" +} + +private fun AppThemeMode.themeSubtitle(): String = when (this) { + AppThemeMode.System -> "Следовать настройке Android." + AppThemeMode.Light -> "Всегда светлая тема." + AppThemeMode.Dark -> "Всегда темная тема." + AppThemeMode.Auto -> "Переключать по времени суток." +} + +private fun AppLanguageMode.languageTitle(): String = when (this) { + AppLanguageMode.System -> "Как в системе" + AppLanguageMode.Russian -> "Русский" + AppLanguageMode.English -> "Английский" +} + +private fun AppLanguageMode.languageSubtitle(): String = when (this) { + AppLanguageMode.System -> "Использовать язык устройства." + AppLanguageMode.Russian -> "Закрепить русский интерфейс." + AppLanguageMode.English -> "Включить английский интерфейс." +} + +private fun accentColorTitle(value: String): String = when (value) { + "Telegram Blue" -> "Синий Telegram" + "Mint" -> "Мятный" + "Graphite" -> "Графит" + "Amber" -> "Янтарный" + else -> value +} + +private fun nextAccent(current: String): String = when (current) { + "Telegram Blue" -> "Mint" + "Mint" -> "Graphite" + "Graphite" -> "Amber" + else -> "Telegram Blue" +} + +private fun AppProxyType.proxyTypeTitle(): String = when (this) { + AppProxyType.Socks5 -> "SOCKS5" + AppProxyType.MtProto -> "MTProto" + AppProxyType.Http -> "HTTP" +} + +private fun nextProxyType(current: AppProxyType): AppProxyType = when (current) { + AppProxyType.Socks5 -> AppProxyType.MtProto + AppProxyType.MtProto -> AppProxyType.Http + AppProxyType.Http -> AppProxyType.Socks5 +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/settings/SettingsScreen.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/settings/SettingsScreen.kt new file mode 100644 index 00000000..fa3654cf --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/settings/SettingsScreen.kt @@ -0,0 +1,464 @@ +package com.seven.ikar.kotlin.feature.settings + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.WindowInsetsSides +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.only +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.safeDrawing +import androidx.compose.foundation.layout.windowInsetsPadding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.outlined.Close +import androidx.compose.material.icons.outlined.Search +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import com.seven.ikar.kotlin.core.model.UserSummaryDto +import com.seven.ikar.kotlin.ui.AvatarView +import com.seven.ikar.kotlin.ui.IkarFloatingMainMenu +import com.seven.ikar.kotlin.ui.IkarHeaderIconBubble +import com.seven.ikar.kotlin.ui.IkarMainMenuTab +import com.seven.ikar.kotlin.ui.IkarRowDivider +import com.seven.ikar.kotlin.ui.IkarScreenSurface +import com.seven.ikar.kotlin.ui.IkarSearchCard +import com.seven.ikar.kotlin.ui.IkarSectionCard +import com.seven.ikar.kotlin.ui.IkarSettingRow +import com.seven.ikar.kotlin.ui.theme.TelegramBlue +import java.util.Locale + +@Composable +fun SettingsScreen( + state: SettingsUiState, + onChatsClick: () -> Unit, + onContactsClick: () -> Unit, + onSettingsClick: () -> Unit, + onProfileClick: () -> Unit, + onAccountClick: () -> Unit, + onChatSettingsClick: () -> Unit, + onPrivacyClick: () -> Unit, + onNotificationsClick: () -> Unit, + onBotsClick: () -> Unit, + onFoldersClick: () -> Unit, + onDevicesClick: () -> Unit, + onUpdatesClick: () -> Unit, + onDataStorageClick: () -> Unit, + onThemeClick: () -> Unit, + onLanguageClick: () -> Unit, + onProxyClick: () -> Unit, + onStoriesClick: () -> Unit +) { + var isSearchVisible by rememberSaveable { mutableStateOf(false) } + var searchQuery by rememberSaveable { mutableStateOf("") } + + val settingsEntries = remember( + onAccountClick, + onChatSettingsClick, + onPrivacyClick, + onNotificationsClick, + onBotsClick, + onFoldersClick, + onDevicesClick, + onUpdatesClick, + onDataStorageClick, + onThemeClick, + onLanguageClick, + onProxyClick, + onStoriesClick + ) { + listOf( + SettingsEntryModel( + title = "Аккаунт", + subtitle = "Телефон, имя и описание профиля", + backgroundColor = Color(0xFFE6F1FD), + accentColor = TelegramBlue, + letter = "А", + onClick = onAccountClick, + keywords = listOf("телефон", "номер", "имя", "username", "описание", "профиль") + ), + SettingsEntryModel( + title = "Настройки чатов", + subtitle = "Обои, список чатов, жесты и медиа", + backgroundColor = Color(0xFFFFF8ECD8), + accentColor = Color(0xFFD7812B), + letter = "Ч", + onClick = onChatSettingsClick, + keywords = listOf( + "обои", + "список чатов", + "жесты", + "медиа", + "текст сообщений", + "углы", + "свайп", + "встроенный браузер", + "анимации", + "direct share", + "отправка по enter", + "микрофон", + "18+" + ) + ), + SettingsEntryModel( + title = "Конфиденциальность", + subtitle = "Контакты и отображение имён в чатах", + backgroundColor = Color(0xFFE9F7E5), + accentColor = Color(0xFF44A948), + letter = "К", + onClick = onPrivacyClick, + keywords = listOf("контакты", "имена", "приватность", "конфиденциальность") + ), + SettingsEntryModel( + title = "Уведомления и звуки", + subtitle = "Звуки, звонки и счётчик сообщений", + backgroundColor = Color(0xFFFDE8EA), + accentColor = Color(0xFFDC4E5C), + letter = "У", + onClick = onNotificationsClick, + keywords = listOf("уведомления", "звук", "звонки", "push", "счётчик") + ), + SettingsEntryModel( + title = "Обновление приложения", + subtitle = "Проверка новой версии Икара и установка из Argus", + backgroundColor = Color(0xFFE8F3FF), + accentColor = TelegramBlue, + letter = "О", + onClick = onUpdatesClick, + keywords = listOf("обновление", "version", "apk", "argus", "релиз", "установка") + ), + SettingsEntryModel( + title = "Боты", + subtitle = "Создание, токены и команды API ботов", + backgroundColor = Color(0xFFEAF4FF), + accentColor = TelegramBlue, + letter = "Б", + onClick = onBotsClick, + keywords = listOf("bot api", "токен", "команды", "бот", "боты") + ), + SettingsEntryModel( + title = "Данные и память", + subtitle = "Кэш и локальные медиафайлы", + backgroundColor = Color(0xFFEAF0FD), + accentColor = Color(0xFF4B76E4), + letter = "Д", + onClick = onDataStorageClick, + keywords = listOf("кэш", "память", "данные", "медиафайлы", "хранилище") + ), + SettingsEntryModel( + title = "Папки с чатами", + subtitle = "Стартовый фильтр для списка чатов", + backgroundColor = Color(0xFFEEF5FD), + accentColor = Color(0xFF5293F1), + letter = "П", + onClick = onFoldersClick, + keywords = listOf("папки", "фильтр", "список чатов", "архив") + ), + SettingsEntryModel( + title = "Устройства", + subtitle = "Устройства уведомлений и их состояние", + backgroundColor = Color(0xFFEAF7FB), + accentColor = Color(0xFF49A8C2), + letter = "У", + onClick = onDevicesClick, + keywords = listOf("устройства", "push", "сессии", "авторизация") + ), + SettingsEntryModel( + title = "Энергосбережение", + subtitle = "Фоновое обновление и прогрев превью", + backgroundColor = Color(0xFFFFF1E6), + accentColor = Color(0xFFD7812B), + letter = "Э", + onClick = null, + keywords = listOf("батарея", "энергосбережение", "фон", "превью") + ), + SettingsEntryModel( + title = "Истории", + subtitle = "Лента, редактор, срок жизни и защищённые истории", + backgroundColor = Color(0xFFEAF4FF), + accentColor = TelegramBlue, + letter = "И", + onClick = onStoriesClick, + keywords = listOf("stories", "истории", "сторис", "композер", "story") + ), + SettingsEntryModel( + title = "Тема", + subtitle = "Тема, акцент, эмодзи и анимированные фоны", + backgroundColor = Color(0xFFE9F7E5), + accentColor = Color(0xFF44A948), + letter = "Т", + onClick = onThemeClick, + keywords = listOf("theme", "тема", "ночная", "оформление") + ), + SettingsEntryModel( + title = "Язык", + subtitle = "Русский", + backgroundColor = Color(0xFFF3EAFF), + accentColor = Color(0xFFA25FE0), + letter = "Я", + onClick = onLanguageClick, + keywords = listOf("язык", "русский", "локаль") + ), + SettingsEntryModel( + title = "Прокси", + subtitle = "SOCKS/MTProto/HTTP профиль подключения", + backgroundColor = Color(0xFFEAF7FB), + accentColor = Color(0xFF49A8C2), + letter = "П", + onClick = onProxyClick, + keywords = listOf("proxy", "прокси", "socks", "mtproto", "сеть") + ) + ) + } + + val visibleEntries = remember(settingsEntries, searchQuery) { + filterSettingsEntries(settingsEntries, searchQuery) + } + + IkarScreenSurface(modifier = Modifier.fillMaxSize()) { + Column( + modifier = Modifier + .fillMaxSize() + .windowInsetsPadding(WindowInsets.safeDrawing.only(WindowInsetsSides.Vertical)) + .verticalScroll(rememberScrollState()) + .padding(horizontal = 18.dp, vertical = 18.dp), + verticalArrangement = Arrangement.spacedBy(16.dp) + ) { + SettingsProfileHeader( + user = state.session?.user, + isSearchVisible = isSearchVisible, + onAccountClick = onAccountClick, + onSearchClick = { + if (isSearchVisible) { + if (searchQuery.isBlank()) { + isSearchVisible = false + } else { + searchQuery = "" + } + } else { + isSearchVisible = true + } + } + ) + + if (isSearchVisible) { + IkarSearchCard( + value = searchQuery, + onValueChange = { searchQuery = it }, + placeholder = "Искать в настройках" + ) + } + + IkarSectionCard { + if (visibleEntries.isEmpty()) { + Box( + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 18.dp), + contentAlignment = Alignment.Center + ) { + Text( + text = "Ничего не найдено", + style = MaterialTheme.typography.titleMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + } + } else { + visibleEntries.forEachIndexed { index, entry -> + SettingsEntry( + title = entry.title, + subtitle = entry.subtitle, + backgroundColor = entry.backgroundColor, + accentColor = entry.accentColor, + letter = entry.letter, + onClick = entry.onClick + ) + if (index != visibleEntries.lastIndex) { + IkarRowDivider() + } + } + } + } + + Box( + modifier = Modifier + .fillMaxWidth() + .padding(bottom = 116.dp) + ) + } + + IkarFloatingMainMenu( + selectedTab = IkarMainMenuTab.Settings, + modifier = Modifier + .align(Alignment.BottomCenter) + .padding(horizontal = 8.dp, vertical = 18.dp), + onChatsClick = onChatsClick, + onContactsClick = onContactsClick, + onSettingsClick = onSettingsClick, + onProfileClick = onProfileClick + ) + } +} + +@Composable +private fun SettingsProfileHeader( + user: UserSummaryDto?, + isSearchVisible: Boolean, + onAccountClick: () -> Unit, + onSearchClick: () -> Unit +) { + val profileName = user?.displayName?.takeIf { it.isNotBlank() } + ?: user?.username?.takeIf { it.isNotBlank() }?.let { "@$it" } + ?: "Профиль" + val phoneText = user?.phoneNumber?.takeIf { it.isNotBlank() } + ?: user?.username?.takeIf { it.isNotBlank() }?.let { "@$it" } + + Box( + modifier = Modifier + .fillMaxWidth() + .clickable(enabled = user != null, onClick = onAccountClick) + .padding(top = 8.dp, bottom = 4.dp), + contentAlignment = Alignment.TopCenter + ) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 52.dp), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(6.dp) + ) { + AvatarView( + imageUrl = user?.avatarPath, + title = profileName, + size = 104.dp + ) + Text( + text = profileName, + style = MaterialTheme.typography.displayLarge, + fontWeight = FontWeight.SemiBold, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + if (!phoneText.isNullOrBlank()) { + Text( + text = phoneText, + style = MaterialTheme.typography.bodySmall, + color = MaterialTheme.colorScheme.onSurfaceVariant, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + } + } + + IkarHeaderIconBubble( + modifier = Modifier.align(Alignment.TopEnd), + onClick = onSearchClick + ) { + Icon( + imageVector = if (isSearchVisible) Icons.Outlined.Close else Icons.Outlined.Search, + contentDescription = null, + tint = MaterialTheme.colorScheme.onSurface + ) + } + } +} + +private data class SettingsEntryModel( + val title: String, + val subtitle: String, + val backgroundColor: Color, + val accentColor: Color, + val letter: String, + val onClick: (() -> Unit)?, + val keywords: List<String> +) + +private data class RankedSettingsEntry( + val entry: SettingsEntryModel, + val rank: Int, + val originalIndex: Int +) + +private fun filterSettingsEntries( + entries: List<SettingsEntryModel>, + query: String +): List<SettingsEntryModel> { + val normalizedQuery = query.trim().lowercase(Locale.ROOT) + if (normalizedQuery.isBlank()) { + return entries + } + + return entries.mapIndexedNotNull { index, entry -> + val rank = entry.matchRank(normalizedQuery) ?: return@mapIndexedNotNull null + RankedSettingsEntry(entry = entry, rank = rank, originalIndex = index) + }.sortedWith(compareBy<RankedSettingsEntry> { it.rank }.thenBy { it.originalIndex }) + .map { it.entry } +} + +private fun SettingsEntryModel.matchRank(normalizedQuery: String): Int? { + val normalizedTitle = title.lowercase(Locale.ROOT) + val normalizedSubtitle = subtitle.lowercase(Locale.ROOT) + val normalizedKeywords = keywords.map { it.lowercase(Locale.ROOT) } + + return when { + normalizedTitle == normalizedQuery -> 0 + normalizedTitle.startsWith(normalizedQuery) -> 1 + normalizedTitle.contains(normalizedQuery) -> 2 + normalizedKeywords.any { it == normalizedQuery } -> 3 + normalizedKeywords.any { it.startsWith(normalizedQuery) } -> 4 + normalizedKeywords.any { it.contains(normalizedQuery) } -> 5 + normalizedSubtitle.contains(normalizedQuery) -> 6 + else -> null + } +} + +@Composable +private fun SettingsEntry( + title: String, + subtitle: String, + backgroundColor: Color, + accentColor: Color, + letter: String, + onClick: (() -> Unit)? +) { + IkarSettingRow( + title = title, + subtitle = subtitle, + onClick = onClick, + leading = { + Surface( + modifier = Modifier.fillMaxSize(), + color = backgroundColor, + shape = CircleShape + ) { + Box(contentAlignment = Alignment.Center) { + Text( + text = letter, + style = MaterialTheme.typography.titleMedium, + color = accentColor, + fontWeight = FontWeight.SemiBold + ) + } + } + } + ) +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/settings/SettingsViewModel.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/settings/SettingsViewModel.kt new file mode 100644 index 00000000..6b235748 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/settings/SettingsViewModel.kt @@ -0,0 +1,14 @@ +package com.seven.ikar.kotlin.feature.settings + +import androidx.lifecycle.ViewModel +import com.seven.ikar.kotlin.app.AppContainer +import com.seven.ikar.kotlin.core.model.AuthSessionDto + +data class SettingsUiState( + val session: AuthSessionDto? = null +) + +class SettingsViewModel(container: AppContainer) : ViewModel() { + private val session = container.sessionStore.read() + val uiState = SettingsUiState(session = session) +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/share/IncomingShareStore.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/share/IncomingShareStore.kt new file mode 100644 index 00000000..d8d9fce9 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/share/IncomingShareStore.kt @@ -0,0 +1,28 @@ +package com.seven.ikar.kotlin.feature.share + +import com.seven.ikar.kotlin.feature.chat.LocalAttachmentFile +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow + +data class PendingExternalShare( + val id: Long = System.nanoTime(), + val text: String? = null, + val attachments: List<LocalAttachmentFile> = emptyList() +) { + val hasContent: Boolean + get() = !text.isNullOrBlank() || attachments.isNotEmpty() +} + +class IncomingShareStore { + private val _pendingShare = MutableStateFlow<PendingExternalShare?>(null) + val pendingShare: StateFlow<PendingExternalShare?> = _pendingShare.asStateFlow() + + fun setPending(share: PendingExternalShare?) { + _pendingShare.value = share?.takeIf(PendingExternalShare::hasContent) + } + + fun clear() { + _pendingShare.value = null + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/share/ShareTargetScreen.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/share/ShareTargetScreen.kt new file mode 100644 index 00000000..52150d22 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/share/ShareTargetScreen.kt @@ -0,0 +1,273 @@ +package com.seven.ikar.kotlin.feature.share + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.navigationBarsPadding +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.statusBarsPadding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import com.seven.ikar.kotlin.core.contacts.DiscoverUserItem +import com.seven.ikar.kotlin.ui.AvatarView +import com.seven.ikar.kotlin.ui.IkarRowDivider +import com.seven.ikar.kotlin.ui.IkarScreenSurface +import com.seven.ikar.kotlin.ui.IkarSearchCard +import com.seven.ikar.kotlin.ui.IkarSectionCard +import com.seven.ikar.kotlin.ui.IkarSimpleHeader +import com.seven.ikar.kotlin.ui.formatDiscoverPresence +import com.seven.ikar.kotlin.ui.formatPresenceColor +import com.seven.ikar.kotlin.ui.theme.TelegramBlue +import com.seven.ikar.kotlin.ui.theme.TelegramInkMuted + +@Composable +fun ShareTargetScreen( + state: ShareTargetUiState, + onBackClick: () -> Unit, + onQueryChanged: (String) -> Unit, + onChatClick: (ShareChatTargetItemUiState) -> Unit, + onUserClick: (DiscoverUserItem) -> Unit +) { + IkarScreenSurface(modifier = Modifier.fillMaxSize()) { + Column( + modifier = Modifier + .fillMaxSize() + .statusBarsPadding() + .navigationBarsPadding() + ) { + Column( + modifier = Modifier.padding(start = 18.dp, top = 16.dp, end = 18.dp, bottom = 12.dp), + verticalArrangement = Arrangement.spacedBy(12.dp) + ) { + IkarSimpleHeader(title = "Поделиться", onBackClick = onBackClick) + + IkarSearchCard( + value = state.query, + onValueChange = onQueryChanged, + placeholder = "Поиск чата или контакта" + ) + + SharePreviewCard(state.payload) + + state.errorMessage?.let { + Text(it, color = MaterialTheme.colorScheme.error, style = MaterialTheme.typography.bodyMedium) + } + } + + IkarSectionCard( + modifier = Modifier + .weight(1f) + .padding(horizontal = 18.dp) + .padding(bottom = 18.dp), + padding = PaddingValues(0.dp) + ) { + LazyColumn { + if (state.isLoading && state.chats.isEmpty() && state.contacts.isEmpty()) { + item { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 24.dp, vertical = 32.dp), + horizontalArrangement = Arrangement.Center, + verticalAlignment = Alignment.CenterVertically + ) { + CircularProgressIndicator() + } + } + } + + if (state.chats.isNotEmpty()) { + item { + SectionLabel("Чаты") + } + items(state.chats, key = { it.chat.id }) { item -> + ShareChatRow(item = item, onClick = { onChatClick(item) }) + } + } + + if (state.contacts.isNotEmpty()) { + item { + SectionLabel("Контакты") + } + items(state.contacts, key = { it.id }) { item -> + ShareContactRow(item = item, onClick = { onUserClick(item) }) + } + } + + if (!state.isLoading && state.chats.isEmpty() && state.contacts.isEmpty()) { + item { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 24.dp, vertical = 28.dp), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(8.dp) + ) { + Text("Подходящих получателей нет", style = MaterialTheme.typography.headlineMedium) + Text( + "Уточните поиск или откройте доступ к контактам.", + color = TelegramInkMuted, + style = MaterialTheme.typography.bodyMedium + ) + } + } + } + } + } + } + } +} + +@Composable +private fun SharePreviewCard(payload: PendingExternalShare) { + IkarSectionCard { + Column(verticalArrangement = Arrangement.spacedBy(8.dp)) { + Text( + text = "Будет отправлено", + style = MaterialTheme.typography.labelLarge, + color = TelegramBlue + ) + payload.text?.takeIf { it.isNotBlank() }?.let { sharedText -> + Text( + text = sharedText, + style = MaterialTheme.typography.bodyMedium, + maxLines = 3, + overflow = TextOverflow.Ellipsis + ) + } + if (payload.attachments.isNotEmpty()) { + Text( + text = attachmentSummary(payload), + style = MaterialTheme.typography.bodySmall, + color = TelegramInkMuted + ) + payload.attachments.take(3).forEach { attachment -> + Text( + text = attachment.fileName, + style = MaterialTheme.typography.bodyMedium, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + } + } + } + } +} + +@Composable +private fun SectionLabel(text: String) { + Text( + text = text, + modifier = Modifier.padding(start = 18.dp, top = 16.dp, end = 18.dp, bottom = 8.dp), + style = MaterialTheme.typography.labelLarge, + color = TelegramBlue + ) +} + +@Composable +private fun ShareChatRow( + item: ShareChatTargetItemUiState, + onClick: () -> Unit +) { + Column { + Row( + modifier = Modifier + .fillMaxWidth() + .clickable(onClick = onClick) + .padding(horizontal = 18.dp, vertical = 12.dp), + horizontalArrangement = Arrangement.spacedBy(14.dp), + verticalAlignment = Alignment.CenterVertically + ) { + AvatarView(imageUrl = null, title = item.resolvedTitle, size = 54.dp) + Column( + modifier = Modifier.weight(1f), + verticalArrangement = Arrangement.spacedBy(3.dp) + ) { + Row( + modifier = Modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(12.dp) + ) { + Text( + text = item.resolvedTitle, + modifier = Modifier.weight(1f), + style = MaterialTheme.typography.titleLarge, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + if (item.lastActivityLabel.isNotBlank()) { + Text( + text = item.lastActivityLabel, + style = MaterialTheme.typography.bodySmall, + color = TelegramInkMuted, + maxLines = 1 + ) + } + } + Text( + text = item.preview, + style = MaterialTheme.typography.bodySmall, + color = TelegramInkMuted, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + } + } + IkarRowDivider(startIndent = 86.dp) + } +} + +@Composable +private fun ShareContactRow( + item: DiscoverUserItem, + onClick: () -> Unit +) { + Column { + Row( + modifier = Modifier + .fillMaxWidth() + .clickable(onClick = onClick) + .padding(horizontal = 18.dp, vertical = 12.dp), + horizontalArrangement = Arrangement.spacedBy(14.dp), + verticalAlignment = Alignment.CenterVertically + ) { + AvatarView(imageUrl = item.avatarUrl, title = item.displayName, size = 54.dp) + Column(modifier = Modifier.weight(1f), verticalArrangement = Arrangement.spacedBy(3.dp)) { + Text( + text = item.displayName, + style = MaterialTheme.typography.titleLarge, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + val secondaryText = item.secondaryLine.ifBlank { formatDiscoverPresence(item) } + Text( + text = secondaryText, + style = MaterialTheme.typography.bodySmall, + color = if (item.secondaryLine.isBlank()) formatPresenceColor(item) else TelegramInkMuted, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + } + } + IkarRowDivider(startIndent = 86.dp) + } +} + +private fun attachmentSummary(payload: PendingExternalShare): String = when (payload.attachments.size) { + 0 -> "" + 1 -> "1 файл" + 2, 3, 4 -> "${payload.attachments.size} файла" + else -> "${payload.attachments.size} файлов" +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/share/ShareTargetViewModel.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/share/ShareTargetViewModel.kt new file mode 100644 index 00000000..e5120488 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/share/ShareTargetViewModel.kt @@ -0,0 +1,239 @@ +package com.seven.ikar.kotlin.feature.share + +import android.Manifest +import android.content.pm.PackageManager +import androidx.core.content.ContextCompat +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.seven.ikar.kotlin.app.AppContainer +import com.seven.ikar.kotlin.core.contacts.DiscoverUserItem +import com.seven.ikar.kotlin.core.contacts.PhoneNumberNormalizer +import com.seven.ikar.kotlin.core.model.ChatSummaryDto +import com.seven.ikar.kotlin.core.model.ChatType +import com.seven.ikar.kotlin.ui.chatPreview +import com.seven.ikar.kotlin.ui.formatLastActivity +import kotlinx.coroutines.Job +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch + +data class ShareChatTargetItemUiState( + val chat: ChatSummaryDto, + val resolvedTitle: String, + val lastActivityLabel: String, + val preview: String +) + +data class ShareTargetUiState( + val payload: PendingExternalShare, + val query: String = "", + val chats: List<ShareChatTargetItemUiState> = emptyList(), + val contacts: List<DiscoverUserItem> = emptyList(), + val isLoading: Boolean = false, + val isSending: Boolean = false, + val errorMessage: String? = null, + val pendingChatId: String? = null +) + +class ShareTargetViewModel( + private val container: AppContainer, + private val pendingShare: PendingExternalShare +) : ViewModel() { + private val _uiState = MutableStateFlow(ShareTargetUiState(payload = pendingShare)) + private val _allChats = mutableListOf<ChatSummaryDto>() + private var contactNamesByNormalizedPhone: Map<String, String> = emptyMap() + private var currentUserId: String? = container.sessionStore.read()?.user?.id + private var searchJob: Job? = null + + val uiState: StateFlow<ShareTargetUiState> = _uiState.asStateFlow() + + init { + refresh() + } + + fun updateQuery(value: String) { + _uiState.value = _uiState.value.copy(query = value) + searchJob?.cancel() + searchJob = viewModelScope.launch { + delay(250) + refresh() + } + } + + fun refresh() { + viewModelScope.launch { + val query = _uiState.value.query.trim() + _uiState.value = _uiState.value.copy(isLoading = true, errorMessage = null) + runCatching { + contactNamesByNormalizedPhone = loadDeviceContactNames() + val chats = container.executeAuthorized { session -> + currentUserId = session.user.id + container.apiClient.getChats(session.accessToken) + } + _allChats.clear() + _allChats.addAll(chats) + val contacts = loadContactCandidates(query) + chats to contacts + }.onSuccess { (chats, contacts) -> + _uiState.value = _uiState.value.copy( + chats = filterChats(chats, query), + contacts = contacts, + isLoading = false, + errorMessage = null + ) + }.onFailure { error -> + _uiState.value = _uiState.value.copy(isLoading = false, errorMessage = error.message) + } + } + } + + fun sendToChat(chat: ShareChatTargetItemUiState) { + sendToChatId(chat.chat.id) + } + + fun sendToUser(user: DiscoverUserItem) { + if (_uiState.value.isSending) { + return + } + + viewModelScope.launch { + _uiState.value = _uiState.value.copy(isSending = true, errorMessage = null) + runCatching { + container.executeAuthorized { session -> + val existingChatId = findExistingDirectChatId(user.id) + val targetChatId = existingChatId ?: container.apiClient.createDirectChat(session.accessToken, user.id).id + sendPendingShare(session.accessToken, targetChatId) + targetChatId + } + }.onSuccess { chatId -> + _uiState.value = _uiState.value.copy(isSending = false, pendingChatId = chatId) + }.onFailure { error -> + _uiState.value = _uiState.value.copy(isSending = false, errorMessage = error.message) + } + } + } + + fun consumePendingChatNavigation() { + _uiState.value = _uiState.value.copy(pendingChatId = null) + } + + private fun sendToChatId(chatId: String) { + if (_uiState.value.isSending) { + return + } + + viewModelScope.launch { + _uiState.value = _uiState.value.copy(isSending = true, errorMessage = null) + runCatching { + container.executeAuthorized { session -> + sendPendingShare(session.accessToken, chatId) + chatId + } + }.onSuccess { targetChatId -> + _uiState.value = _uiState.value.copy(isSending = false, pendingChatId = targetChatId) + }.onFailure { error -> + _uiState.value = _uiState.value.copy(isSending = false, errorMessage = error.message) + } + } + } + + private suspend fun sendPendingShare(accessToken: String, chatId: String) { + val sharedText = pendingShare.text?.trim().orEmpty() + if (pendingShare.attachments.isEmpty()) { + check(sharedText.isNotBlank()) { "Нечего отправлять." } + container.apiClient.sendMessage(chatId, sharedText, accessToken) + return + } + + container.transferQueueRepository.enqueueUpload( + chatId = chatId, + text = sharedText.takeIf { it.isNotBlank() }, + replyToMessageId = null, + files = pendingShare.attachments + ) + } + + private fun filterChats(chats: List<ChatSummaryDto>, query: String): List<ShareChatTargetItemUiState> { + val items = chats + .filter { it.canSendMessages } + .map { chat -> + ShareChatTargetItemUiState( + chat = chat, + resolvedTitle = resolveChatTitle(chat), + lastActivityLabel = formatLastActivity(chat.lastActivityAt), + preview = chatPreview(chat) + ) + } + + if (query.isBlank()) { + return items + } + + return items.filter { item -> + item.resolvedTitle.contains(query, ignoreCase = true) || + item.chat.title.contains(query, ignoreCase = true) || + item.chat.secondaryText.orEmpty().contains(query, ignoreCase = true) || + item.chat.lastMessagePreview.orEmpty().contains(query, ignoreCase = true) + } + } + + private suspend fun loadContactCandidates(query: String): List<DiscoverUserItem> { + val candidates = when { + hasContactsPermission() -> container.resolvedContactsRepository.loadMergedCandidates(query) + query.isBlank() -> emptyList() + else -> container.executeAuthorized { session -> + container.apiClient.searchUsers(session.accessToken, query).map { user -> + DiscoverUserItem( + user = user, + displayName = user.displayName, + normalizedPhoneNumber = PhoneNumberNormalizer.normalize(user.phoneNumber) ?: "" + ) + } + } + } + + val directParticipantIds = _allChats + .asSequence() + .filter { it.type == ChatType.Direct } + .flatMap { chat -> chat.participants.asSequence().map { participant -> participant.id } } + .toSet() + + return candidates.filterNot { directParticipantIds.contains(it.id) } + } + + private fun resolveChatTitle(chat: ChatSummaryDto): String { + if (chat.type != ChatType.Direct) { + return chat.title + } + + val peer = chat.participants.firstOrNull { it.id != currentUserId } ?: chat.participants.firstOrNull() + val normalizedPhone = PhoneNumberNormalizer.normalize(peer?.phoneNumber) + val contactName = normalizedPhone?.let(contactNamesByNormalizedPhone::get) + return contactName?.takeIf { it.isNotBlank() } + ?: peer?.displayName?.takeIf { it.isNotBlank() } + ?: chat.title + } + + private fun findExistingDirectChatId(userId: String): String? = + _allChats.firstOrNull { chat -> + chat.type == ChatType.Direct && chat.participants.any { participant -> participant.id == userId } + }?.id + + private fun loadDeviceContactNames(): Map<String, String> { + if (!hasContactsPermission()) { + return emptyMap() + } + + return container.contactDiscoveryService.getContacts().associate { contact -> + contact.normalizedPhoneNumber to contact.displayName + } + } + + private fun hasContactsPermission(): Boolean = + ContextCompat.checkSelfPermission( + container.appContext, + Manifest.permission.READ_CONTACTS + ) == PackageManager.PERMISSION_GRANTED +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/stories/StoriesScreen.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/stories/StoriesScreen.kt new file mode 100644 index 00000000..7178a339 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/stories/StoriesScreen.kt @@ -0,0 +1,811 @@ +package com.seven.ikar.kotlin.feature.stories + +import android.net.Uri +import androidx.activity.compose.BackHandler +import androidx.activity.compose.rememberLauncherForActivityResult +import androidx.activity.result.contract.ActivityResultContracts +import androidx.compose.foundation.border +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.WindowInsetsSides +import androidx.compose.foundation.layout.aspectRatio +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.only +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.safeDrawing +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.layout.windowInsetsPadding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.text.BasicTextField +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.outlined.Add +import androidx.compose.material.icons.outlined.Close +import androidx.compose.material.icons.outlined.Delete +import androidx.compose.material.icons.outlined.Schedule +import androidx.compose.material3.Button +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.LinearProgressIndicator +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedButton +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import androidx.compose.ui.window.Dialog +import androidx.compose.ui.window.DialogProperties +import coil.compose.AsyncImage +import com.seven.ikar.kotlin.core.model.AttachmentDto +import com.seven.ikar.kotlin.core.model.StoryDto +import com.seven.ikar.kotlin.core.model.StoryVisibility +import com.seven.ikar.kotlin.core.network.ServerConfig +import com.seven.ikar.kotlin.ui.AuthenticatedAsyncImage +import com.seven.ikar.kotlin.ui.AvatarView +import com.seven.ikar.kotlin.ui.IkarHeaderIconBubble +import com.seven.ikar.kotlin.ui.IkarRowDivider +import com.seven.ikar.kotlin.ui.IkarScreenSurface +import com.seven.ikar.kotlin.ui.IkarSectionCard +import com.seven.ikar.kotlin.ui.IkarSectionTitle +import com.seven.ikar.kotlin.ui.IkarSimpleHeader +import com.seven.ikar.kotlin.ui.IkarToggleRow +import com.seven.ikar.kotlin.ui.SecureWindowEffect +import com.seven.ikar.kotlin.ui.theme.TelegramBlue +import com.seven.ikar.kotlin.ui.theme.TelegramInkMuted +import java.io.File + +@Composable +fun StoriesScreen( + state: StoriesUiState, + onBackClick: () -> Unit, + onComposeClick: () -> Unit, + onRefreshClick: () -> Unit, + onStoryClick: (StoryDto) -> Unit, + onDeleteStory: (StoryDto) -> Unit, + onCloseStoryPreview: () -> Unit, + onNextStory: () -> Unit, + onPreviousStory: () -> Unit, + onRetryTransfer: (String) -> Unit, + onCancelTransfer: (String) -> Unit +) { + SecureWindowEffect(enabled = state.selectedStory?.hasProtectedContent == true) + + state.selectedStory?.let { story -> + StoryViewerDialog( + story = story, + stories = state.stories, + accessToken = state.accessToken, + isOwnStory = story.author.id == state.currentUserId, + onClose = onCloseStoryPreview, + onNextStory = onNextStory, + onPreviousStory = onPreviousStory, + onDeleteStory = { onDeleteStory(story) } + ) + } + + IkarScreenSurface(modifier = Modifier.fillMaxSize()) { + Column( + modifier = Modifier + .fillMaxSize() + .windowInsetsPadding(WindowInsets.safeDrawing.only(WindowInsetsSides.Vertical)) + .verticalScroll(rememberScrollState()) + .padding(horizontal = 18.dp, vertical = 16.dp), + verticalArrangement = Arrangement.spacedBy(16.dp) + ) { + IkarSimpleHeader( + title = "Истории", + onBackClick = onBackClick, + rightContent = { + IkarHeaderIconBubble(onClick = onComposeClick) { + Icon(Icons.Outlined.Add, contentDescription = null, tint = TelegramBlue) + } + } + ) + + if (state.activeTransfers.isNotEmpty()) { + StoryTransfersCard( + transfers = state.activeTransfers, + onRetryTransfer = onRetryTransfer, + onCancelTransfer = onCancelTransfer + ) + } + + state.errorMessage?.let { message -> + IkarSectionCard { + Text("Ошибка", style = MaterialTheme.typography.titleMedium, color = MaterialTheme.colorScheme.error) + Text(message, modifier = Modifier.padding(top = 6.dp), style = MaterialTheme.typography.bodySmall, color = TelegramInkMuted) + } + } + + IkarSectionCard { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + IkarSectionTitle("Сегодня") + TextButton(onClick = onRefreshClick) { + Text(if (state.isLoading) "Загрузка..." else "Обновить") + } + } + + if (state.stories.isEmpty()) { + EmptyStoriesState(onComposeClick = onComposeClick) + } else { + state.stories.forEachIndexed { index, story -> + StoryPreviewRow(story = story, accessToken = state.accessToken, onClick = { onStoryClick(story) }) + if (index != state.stories.lastIndex) { + IkarRowDivider() + } + } + } + } + + IkarSectionCard { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.spacedBy(12.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Icon(Icons.Outlined.Schedule, contentDescription = null, tint = TelegramBlue) + Column(verticalArrangement = Arrangement.spacedBy(4.dp)) { + Text("Медиаистории подключены", style = MaterialTheme.typography.titleLarge) + Text( + "Текстовые истории публикуются сразу, а медиаистории уходят через очередь фоновой отправки с прогрессом, повтором и отменой.", + style = MaterialTheme.typography.bodySmall, + color = TelegramInkMuted + ) + } + } + } + } + } +} + +@Composable +fun StoryComposerScreen( + state: StoriesUiState, + onBackClick: () -> Unit, + onTextChanged: (String) -> Unit, + onVisibilityChanged: (StoryVisibility) -> Unit, + onProtectedChanged: (Boolean) -> Unit, + onTtlChanged: (Int) -> Unit, + onMediaSelected: (List<Uri>) -> Unit, + onRemoveMedia: (String) -> Unit, + onClearMedia: () -> Unit, + onCreateClick: () -> Unit, + onRetryTransfer: (String) -> Unit, + onCancelTransfer: (String) -> Unit +) { + val mediaPicker = rememberLauncherForActivityResult(ActivityResultContracts.OpenMultipleDocuments()) { uris -> + onMediaSelected(uris) + } + + IkarScreenSurface(modifier = Modifier.fillMaxSize()) { + Column( + modifier = Modifier + .fillMaxSize() + .windowInsetsPadding(WindowInsets.safeDrawing.only(WindowInsetsSides.Vertical)) + .verticalScroll(rememberScrollState()) + .padding(horizontal = 18.dp, vertical = 16.dp), + verticalArrangement = Arrangement.spacedBy(16.dp) + ) { + IkarSimpleHeader(title = "Новая история", onBackClick = onBackClick) + + if (state.activeTransfers.isNotEmpty()) { + StoryTransfersCard( + transfers = state.activeTransfers, + onRetryTransfer = onRetryTransfer, + onCancelTransfer = onCancelTransfer + ) + } + + IkarSectionCard { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + IkarSectionTitle("Медиа") + Text("${state.pendingMedia.size}/10", style = MaterialTheme.typography.bodySmall, color = TelegramInkMuted) + } + OutlinedButton( + onClick = { mediaPicker.launch(arrayOf("image/*", "video/*")) }, + enabled = !state.isImportingMedia && state.pendingMedia.size < 10, + modifier = Modifier + .fillMaxWidth() + .padding(top = 10.dp) + ) { + Text(if (state.isImportingMedia) "Импортируем..." else "Добавить фото или видео") + } + if (state.pendingMedia.isNotEmpty()) { + MediaPreviewGrid( + media = state.pendingMedia, + onRemoveMedia = onRemoveMedia, + modifier = Modifier.padding(top = 12.dp) + ) + TextButton(onClick = onClearMedia, modifier = Modifier.fillMaxWidth()) { + Text("Очистить медиа") + } + } + } + + IkarSectionCard { + Text("Текст", style = MaterialTheme.typography.titleLarge) + BasicTextField( + value = state.draftText, + onValueChange = onTextChanged, + modifier = Modifier + .fillMaxWidth() + .padding(top = 12.dp) + .background(Color(0xFFF2F6FA), RoundedCornerShape(18.dp)) + .padding(14.dp), + textStyle = MaterialTheme.typography.bodyLarge.copy(color = MaterialTheme.colorScheme.onSurface), + decorationBox = { inner -> + if (state.draftText.isBlank()) { + Text("Что происходит?", color = TelegramInkMuted, style = MaterialTheme.typography.bodyLarge) + } + inner() + } + ) + Text("${state.draftText.length}/500", modifier = Modifier.padding(top = 8.dp), style = MaterialTheme.typography.bodySmall, color = TelegramInkMuted) + } + + IkarSectionCard { + IkarSectionTitle("Кто увидит", modifier = Modifier.padding(bottom = 10.dp)) + StoryVisibility.entries.forEachIndexed { index, visibility -> + StoryOptionRow( + title = visibility.label(), + subtitle = visibility.subtitle(), + selected = state.visibility == visibility, + onClick = { onVisibilityChanged(visibility) } + ) + if (index != StoryVisibility.entries.lastIndex) { + IkarRowDivider(startIndent = 0.dp) + } + } + } + + IkarSectionCard { + IkarSectionTitle("Срок жизни", modifier = Modifier.padding(bottom = 10.dp)) + Row(horizontalArrangement = Arrangement.spacedBy(8.dp), modifier = Modifier.fillMaxWidth()) { + listOf(3_600, 43_200, 86_400, 604_800).forEach { ttl -> + Surface( + modifier = Modifier + .weight(1f) + .clickable { onTtlChanged(ttl) }, + color = if (state.ttlSeconds == ttl) Color(0xFFEAF4FF) else Color(0xFFF2F6FA), + shape = RoundedCornerShape(16.dp) + ) { + Text( + ttl.labelTtl(), + modifier = Modifier.padding(vertical = 12.dp), + style = MaterialTheme.typography.bodyMedium, + color = if (state.ttlSeconds == ttl) TelegramBlue else MaterialTheme.colorScheme.onSurface, + fontWeight = if (state.ttlSeconds == ttl) FontWeight.SemiBold else FontWeight.Normal + ) + } + } + } + } + + IkarSectionCard { + IkarToggleRow( + "Защитить контент", + "Флаг передаётся серверу; клиент должен блокировать пересылку, сохранение и скриншоты там, где это возможно.", + state.hasProtectedContent, + onProtectedChanged + ) + } + + state.errorMessage?.let { message -> + Text(message, color = MaterialTheme.colorScheme.error, style = MaterialTheme.typography.bodySmall) + } + + Button( + onClick = onCreateClick, + enabled = (state.draftText.isNotBlank() || state.pendingMedia.isNotEmpty()) && !state.isSaving, + modifier = Modifier.fillMaxWidth() + ) { + val hasMedia = state.pendingMedia.isNotEmpty() + Text( + when { + state.isSaving -> "Публикуем..." + hasMedia -> "Поставить в очередь" + else -> "Опубликовать" + } + ) + } + } + } +} + +@Composable +private fun StoryViewerDialog( + story: StoryDto, + stories: List<StoryDto>, + accessToken: String?, + isOwnStory: Boolean, + onClose: () -> Unit, + onNextStory: () -> Unit, + onPreviousStory: () -> Unit, + onDeleteStory: () -> Unit +) { + Dialog( + onDismissRequest = onClose, + properties = DialogProperties(usePlatformDefaultWidth = false) + ) { + BackHandler(onBack = onClose) + + Box( + modifier = Modifier + .fillMaxSize() + .background(Color.Black) + ) { + StoryViewerContent(story = story, accessToken = accessToken) + + Row(modifier = Modifier.fillMaxSize()) { + Box( + modifier = Modifier + .weight(1f) + .fillMaxSize() + .clickable(onClick = onPreviousStory) + ) + Box( + modifier = Modifier + .weight(1f) + .fillMaxSize() + .clickable(onClick = onNextStory) + ) + } + + StoryViewerTopBar( + story = story, + stories = stories, + accessToken = accessToken, + isOwnStory = isOwnStory, + onClose = onClose, + onDeleteStory = onDeleteStory + ) + + StoryViewerCaption( + story = story, + modifier = Modifier.align(Alignment.BottomCenter) + ) + } + } +} + +@Composable +private fun StoryViewerContent(story: StoryDto, accessToken: String?) { + val imageAttachment = story.attachments.firstOrNull { it.contentType.startsWith("image/") } + if (imageAttachment != null) { + AuthenticatedAsyncImage( + imageUrl = ServerConfig.normalizeMediaUrl(imageAttachment.downloadPath), + accessToken = accessToken, + contentDescription = imageAttachment.fileName, + modifier = Modifier.fillMaxSize(), + contentScale = ContentScale.Crop + ) + return + } + + Box( + modifier = Modifier + .fillMaxSize() + .padding(28.dp), + contentAlignment = Alignment.Center + ) { + if (story.attachments.isNotEmpty()) { + val first = story.attachments.first() + Column( + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(10.dp) + ) { + Text("Видео", style = MaterialTheme.typography.headlineMedium, color = Color.White) + Text( + first.fileName, + style = MaterialTheme.typography.bodyMedium, + color = Color.White.copy(alpha = 0.72f), + textAlign = TextAlign.Center, + maxLines = 2, + overflow = TextOverflow.Ellipsis + ) + } + } else { + Text( + story.text.ifBlank { "История без подписи" }, + style = MaterialTheme.typography.headlineMedium, + color = Color.White, + textAlign = TextAlign.Center + ) + } + } +} + +@Composable +private fun StoryViewerTopBar( + story: StoryDto, + stories: List<StoryDto>, + accessToken: String?, + isOwnStory: Boolean, + onClose: () -> Unit, + onDeleteStory: () -> Unit +) { + Column( + modifier = Modifier + .fillMaxWidth() + .background(Color.Black.copy(alpha = 0.42f)) + .padding(horizontal = 14.dp, vertical = 12.dp), + verticalArrangement = Arrangement.spacedBy(12.dp) + ) { + StoryProgressSegments(story = story, stories = stories) + Row( + modifier = Modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically + ) { + AvatarView( + imageUrl = ServerConfig.normalizeMediaUrl(story.author.avatarPath), + title = story.author.displayName, + accessToken = accessToken, + size = 42.dp + ) + Spacer(modifier = Modifier.width(10.dp)) + Column(modifier = Modifier.weight(1f), verticalArrangement = Arrangement.spacedBy(2.dp)) { + Text( + story.author.displayName, + style = MaterialTheme.typography.titleMedium, + color = Color.White, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + Text( + story.createdAt.shortDateTime(), + style = MaterialTheme.typography.bodySmall, + color = Color.White.copy(alpha = 0.72f) + ) + } + if (isOwnStory) { + IconButton(onClick = onDeleteStory) { + Icon(Icons.Outlined.Delete, contentDescription = "Удалить историю", tint = Color.White) + } + } + IconButton(onClick = onClose) { + Icon(Icons.Outlined.Close, contentDescription = "Закрыть", tint = Color.White) + } + } + } +} + +@Composable +private fun StoryProgressSegments(story: StoryDto, stories: List<StoryDto>) { + val selectedIndex = stories.indexOfFirst { it.id == story.id } + val firstIndex = if (selectedIndex < 0) 0 else (selectedIndex - 6).coerceAtLeast(0) + val segmentStories = stories.drop(firstIndex).take(12).ifEmpty { listOf(story) } + Row(horizontalArrangement = Arrangement.spacedBy(4.dp), modifier = Modifier.fillMaxWidth()) { + segmentStories.forEach { item -> + Box( + modifier = Modifier + .weight(1f) + .height(3.dp) + .clip(RoundedCornerShape(2.dp)) + .background(if (item.id == story.id) Color.White else Color.White.copy(alpha = 0.34f)) + ) + } + } +} + +@Composable +private fun StoryViewerCaption(story: StoryDto, modifier: Modifier = Modifier) { + Column( + modifier = modifier + .fillMaxWidth() + .background(Color.Black.copy(alpha = 0.54f)) + .padding(horizontal = 18.dp, vertical = 16.dp), + verticalArrangement = Arrangement.spacedBy(6.dp) + ) { + if (story.attachments.isNotEmpty() && story.text.isNotBlank()) { + Text(story.text, style = MaterialTheme.typography.bodyLarge, color = Color.White) + } + Row(verticalAlignment = Alignment.CenterVertically) { + Text( + "${story.viewCount} просмотров", + style = MaterialTheme.typography.bodySmall, + color = Color.White.copy(alpha = 0.72f) + ) + if (story.hasProtectedContent) { + Spacer(modifier = Modifier.width(10.dp)) + Text( + "защищено", + style = MaterialTheme.typography.labelSmall, + color = Color.White.copy(alpha = 0.72f) + ) + } + } + } +} + +@Composable +private fun StoryTransfersCard( + transfers: List<StoryTransferUiState>, + onRetryTransfer: (String) -> Unit, + onCancelTransfer: (String) -> Unit +) { + IkarSectionCard { + IkarSectionTitle("Очередь историй", modifier = Modifier.padding(bottom = 8.dp)) + transfers.forEachIndexed { index, transfer -> + Column(verticalArrangement = Arrangement.spacedBy(8.dp), modifier = Modifier.padding(vertical = 8.dp)) { + Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween) { + Text(transfer.title, style = MaterialTheme.typography.titleMedium, maxLines = 1, overflow = TextOverflow.Ellipsis) + Text("${transfer.progressPercent}%", style = MaterialTheme.typography.bodySmall, color = TelegramInkMuted) + } + LinearProgressIndicator( + progress = { transfer.progressPercent / 100f }, + modifier = Modifier.fillMaxWidth(), + color = TelegramBlue + ) + Text(transfer.errorMessage ?: transfer.status, style = MaterialTheme.typography.bodySmall, color = TelegramInkMuted) + Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) { + TextButton(onClick = { onRetryTransfer(transfer.groupId) }) { Text("Повторить") } + TextButton(onClick = { onCancelTransfer(transfer.groupId) }) { Text("Отменить") } + } + } + if (index != transfers.lastIndex) { + IkarRowDivider(startIndent = 0.dp) + } + } + } +} + +@Composable +private fun MediaPreviewGrid( + media: List<StoryMediaPreviewUiState>, + onRemoveMedia: (String) -> Unit, + modifier: Modifier = Modifier +) { + Column(modifier = modifier, verticalArrangement = Arrangement.spacedBy(10.dp)) { + media.chunked(2).forEach { row -> + Row(horizontalArrangement = Arrangement.spacedBy(10.dp), modifier = Modifier.fillMaxWidth()) { + row.forEach { item -> + StoryMediaTile( + item = item, + onRemoveMedia = onRemoveMedia, + modifier = Modifier.weight(1f) + ) + } + if (row.size == 1) { + Box(modifier = Modifier.weight(1f)) + } + } + } + } +} + +@Composable +private fun StoryMediaTile( + item: StoryMediaPreviewUiState, + onRemoveMedia: (String) -> Unit, + modifier: Modifier = Modifier +) { + Surface(modifier = modifier, color = Color(0xFFF2F6FA), shape = RoundedCornerShape(18.dp)) { + Column(verticalArrangement = Arrangement.spacedBy(8.dp), modifier = Modifier.padding(10.dp)) { + Box( + modifier = Modifier + .fillMaxWidth() + .aspectRatio(1f) + .clip(RoundedCornerShape(14.dp)) + .background(Color(0xFFEAF4FF)), + contentAlignment = Alignment.Center + ) { + if (item.contentType.startsWith("image/")) { + AsyncImage( + model = File(item.localPath), + contentDescription = null, + modifier = Modifier.fillMaxSize(), + contentScale = ContentScale.Crop + ) + } else { + Text("ВИДЕО", color = TelegramBlue, fontWeight = FontWeight.SemiBold) + } + } + Text(item.fileName, maxLines = 1, overflow = TextOverflow.Ellipsis, style = MaterialTheme.typography.bodySmall) + Text(item.fileSizeBytes.formatBytes(), style = MaterialTheme.typography.bodySmall, color = TelegramInkMuted) + TextButton(onClick = { onRemoveMedia(item.localPath) }, modifier = Modifier.fillMaxWidth()) { + Text("Удалить") + } + } + } +} + +@Composable +private fun EmptyStoriesState(onComposeClick: () -> Unit) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 18.dp), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(10.dp) + ) { + Box( + modifier = Modifier + .size(62.dp) + .clip(CircleShape) + .background(Color(0xFFEAF4FF)), + contentAlignment = Alignment.Center + ) { + Icon(Icons.Outlined.Add, contentDescription = null, tint = TelegramBlue) + } + Text("Пока нет активных историй", style = MaterialTheme.typography.titleMedium) + Text("Опубликуйте первую историю со сроком жизни, приватностью и медиа.", style = MaterialTheme.typography.bodySmall, color = TelegramInkMuted) + TextButton(onClick = onComposeClick) { Text("Создать историю") } + } +} + +@Composable +private fun StoryPreviewRow( + story: StoryDto, + accessToken: String?, + onClick: () -> Unit +) { + Row( + modifier = Modifier + .fillMaxWidth() + .clickable(onClick = onClick) + .padding(vertical = 12.dp), + horizontalArrangement = Arrangement.spacedBy(14.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Surface( + modifier = Modifier.size(48.dp), + color = if (story.viewedByMe) Color(0xFFF1F3F5) else Color(0xFFEAF4FF), + shape = CircleShape + ) { + Box(contentAlignment = Alignment.Center) { + val preview = story.attachments.firstOrNull { it.contentType.startsWith("image/") } + if (preview != null) { + AuthenticatedAsyncImage( + imageUrl = ServerConfig.normalizeMediaUrl(preview.downloadPath), + accessToken = accessToken, + contentDescription = preview.fileName, + modifier = Modifier.fillMaxSize(), + contentScale = ContentScale.Crop + ) + } else { + Text( + text = story.author.displayName.firstOrNull()?.uppercaseChar()?.toString() + ?: story.author.username.firstOrNull()?.uppercaseChar()?.toString().orEmpty(), + style = MaterialTheme.typography.titleLarge, + color = TelegramBlue, + fontWeight = FontWeight.SemiBold + ) + } + } + } + Column(modifier = Modifier.weight(1f), verticalArrangement = Arrangement.spacedBy(3.dp)) { + Text(story.author.displayName, style = MaterialTheme.typography.titleLarge) + Text(story.text.ifBlank { "${story.attachments.size} медиа" }, style = MaterialTheme.typography.bodySmall, color = TelegramInkMuted, maxLines = 1, overflow = TextOverflow.Ellipsis) + Text("до ${story.expiresAt.shortDateTime()} · ${story.viewCount} просмотров", style = MaterialTheme.typography.bodySmall, color = TelegramInkMuted) + } + if (story.hasProtectedContent) { + Text("защищено", style = MaterialTheme.typography.labelSmall, color = TelegramBlue) + } + } +} + +@Composable +private fun StoryAttachmentStrip(story: StoryDto, accessToken: String?) { + if (story.attachments.isEmpty()) { + return + } + + Column(verticalArrangement = Arrangement.spacedBy(8.dp)) { + story.attachments.take(4).forEach { attachment -> + StoryAttachmentPreview(attachment = attachment, accessToken = accessToken) + } + if (story.attachments.size > 4) { + Text("+${story.attachments.size - 4} медиа", style = MaterialTheme.typography.bodySmall, color = TelegramInkMuted) + } + } +} + +@Composable +private fun StoryAttachmentPreview(attachment: AttachmentDto, accessToken: String?) { + if (attachment.contentType.startsWith("image/")) { + AuthenticatedAsyncImage( + imageUrl = ServerConfig.normalizeMediaUrl(attachment.downloadPath), + accessToken = accessToken, + contentDescription = attachment.fileName, + modifier = Modifier + .fillMaxWidth() + .aspectRatio(16f / 10f) + .clip(RoundedCornerShape(18.dp)), + contentScale = ContentScale.Crop + ) + } else { + Surface(color = Color(0xFFEAF4FF), shape = RoundedCornerShape(18.dp), modifier = Modifier.fillMaxWidth()) { + Column(modifier = Modifier.padding(14.dp), verticalArrangement = Arrangement.spacedBy(4.dp)) { + Text("Видео", color = TelegramBlue, fontWeight = FontWeight.SemiBold) + Text(attachment.fileName, maxLines = 1, overflow = TextOverflow.Ellipsis, style = MaterialTheme.typography.bodySmall, color = TelegramInkMuted) + } + } + } +} + +@Composable +private fun StoryOptionRow( + title: String, + subtitle: String, + selected: Boolean, + onClick: () -> Unit +) { + Row( + modifier = Modifier + .fillMaxWidth() + .clickable(onClick = onClick) + .padding(vertical = 12.dp), + horizontalArrangement = Arrangement.spacedBy(12.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Box( + modifier = Modifier + .size(20.dp) + .clip(CircleShape) + .background(if (selected) TelegramBlue else Color(0xFFDDE7F0)) + ) + Column(modifier = Modifier.weight(1f), verticalArrangement = Arrangement.spacedBy(2.dp)) { + Text(title, style = MaterialTheme.typography.titleMedium) + Text(subtitle, style = MaterialTheme.typography.bodySmall, color = TelegramInkMuted) + } + } +} + +private fun StoryVisibility.label(): String = when (this) { + StoryVisibility.Everyone -> "Все" + StoryVisibility.Contacts -> "Контакты" + StoryVisibility.CloseFriends -> "Близкие друзья" + StoryVisibility.Private -> "Только я" +} + +private fun StoryVisibility.subtitle(): String = when (this) { + StoryVisibility.Everyone -> "История доступна всем пользователям." + StoryVisibility.Contacts -> "Показывать только контактам." + StoryVisibility.CloseFriends -> "Использовать приватный круг близких." + StoryVisibility.Private -> "Скрыть от всех кроме автора." +} + +private fun Int.labelTtl(): String = when (this) { + 3_600 -> "1 ч" + 43_200 -> "12 ч" + 86_400 -> "24 ч" + 604_800 -> "7 д" + else -> "${this / 3_600} ч" +} + +private fun Long.formatBytes(): String = when { + this >= 1024L * 1024L -> "${this / (1024L * 1024L)} MB" + this >= 1024L -> "${this / 1024L} KB" + else -> "$this B" +} + +private fun String.shortDateTime(): String = + take(16).replace('T', ' ') diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/stories/StoriesViewModel.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/stories/StoriesViewModel.kt new file mode 100644 index 00000000..fe20806c --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/stories/StoriesViewModel.kt @@ -0,0 +1,335 @@ +package com.seven.ikar.kotlin.feature.stories + +import android.net.Uri +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.seven.ikar.kotlin.app.AppContainer +import com.seven.ikar.kotlin.core.local.TransferQueueEntity +import com.seven.ikar.kotlin.core.model.StoryDto +import com.seven.ikar.kotlin.core.model.StoryVisibility +import com.seven.ikar.kotlin.feature.chat.LocalAttachmentFile +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch + +data class StoryMediaPreviewUiState( + val fileName: String, + val contentType: String, + val fileSizeBytes: Long, + val localPath: String +) + +data class StoryTransferUiState( + val groupId: String, + val title: String, + val status: String, + val progressPercent: Int, + val errorMessage: String? +) + +data class StoriesUiState( + val accessToken: String? = null, + val currentUserId: String? = null, + val stories: List<StoryDto> = emptyList(), + val draftText: String = "", + val visibility: StoryVisibility = StoryVisibility.Everyone, + val hasProtectedContent: Boolean = false, + val ttlSeconds: Int = 86_400, + val pendingMedia: List<StoryMediaPreviewUiState> = emptyList(), + val activeTransfers: List<StoryTransferUiState> = emptyList(), + val isLoading: Boolean = false, + val isSaving: Boolean = false, + val isImportingMedia: Boolean = false, + val errorMessage: String? = null, + val createdStoryId: String? = null, + val selectedStory: StoryDto? = null +) + +class StoriesViewModel(private val container: AppContainer) : ViewModel() { + private val _uiState = MutableStateFlow(StoriesUiState()) + val uiState: StateFlow<StoriesUiState> = _uiState.asStateFlow() + private var pendingMediaFiles: List<LocalAttachmentFile> = emptyList() + private var hadActiveStoryTransfers = false + + init { + attachStoryTransferState() + refresh() + } + + fun refresh() { + viewModelScope.launch { + _uiState.value = _uiState.value.copy(isLoading = true, errorMessage = null) + runCatching { + container.executeAuthorized { session -> + session.accessToken to container.apiClient.getStories(session.accessToken) + } + }.onSuccess { (accessToken, stories) -> + _uiState.value = _uiState.value.copy( + accessToken = accessToken, + currentUserId = container.sessionStore.read()?.user?.id, + stories = stories.sortedByDescending { it.createdAt }, + isLoading = false + ) + }.onFailure { error -> + _uiState.value = _uiState.value.copy(isLoading = false, errorMessage = error.message) + } + } + } + + fun updateDraftText(value: String) { + _uiState.value = _uiState.value.copy(draftText = value.take(500), errorMessage = null, createdStoryId = null) + } + + fun setVisibility(visibility: StoryVisibility) { + _uiState.value = _uiState.value.copy(visibility = visibility) + } + + fun setProtectedContent(value: Boolean) { + _uiState.value = _uiState.value.copy(hasProtectedContent = value) + } + + fun setTtlSeconds(value: Int) { + _uiState.value = _uiState.value.copy(ttlSeconds = value.coerceIn(300, 604_800)) + } + + fun consumeMediaUris(uris: List<Uri>) { + if (uris.isEmpty()) { + return + } + + val availableSlots = MaxStoryMediaCount - pendingMediaFiles.size + if (availableSlots <= 0) { + _uiState.value = _uiState.value.copy(errorMessage = "В одной истории максимум $MaxStoryMediaCount файлов.") + return + } + + viewModelScope.launch { + _uiState.value = _uiState.value.copy(isImportingMedia = true, errorMessage = null) + runCatching { + uris.take(availableSlots).map { uri -> container.attachmentFileService.importFromUri(uri) } + }.onSuccess { imported -> + pendingMediaFiles = (pendingMediaFiles + imported).take(MaxStoryMediaCount) + _uiState.value = _uiState.value.copy( + pendingMedia = pendingMediaFiles.toStoryMediaPreviewUiState(), + isImportingMedia = false + ) + }.onFailure { error -> + _uiState.value = _uiState.value.copy(isImportingMedia = false, errorMessage = error.message) + } + } + } + + fun removePendingMedia(localPath: String) { + pendingMediaFiles = pendingMediaFiles.filterNot { it.localPath == localPath } + _uiState.value = _uiState.value.copy(pendingMedia = pendingMediaFiles.toStoryMediaPreviewUiState()) + } + + fun clearPendingMedia() { + pendingMediaFiles = emptyList() + _uiState.value = _uiState.value.copy(pendingMedia = emptyList()) + } + + fun createStory(onCreated: () -> Unit = {}) { + val state = _uiState.value + val text = state.draftText.trim() + val mediaFiles = pendingMediaFiles + if ((text.isBlank() && mediaFiles.isEmpty()) || state.isSaving) { + _uiState.value = state.copy(errorMessage = "Добавьте текст или медиа.") + return + } + + viewModelScope.launch { + _uiState.value = _uiState.value.copy(isSaving = true, errorMessage = null) + if (mediaFiles.isNotEmpty()) { + runCatching { + container.transferQueueRepository.enqueueStoryUpload( + text = text.takeIf { it.isNotBlank() }, + visibility = state.visibility, + hasProtectedContent = state.hasProtectedContent, + ttlSeconds = state.ttlSeconds, + files = mediaFiles + ) + }.onSuccess { groupId -> + pendingMediaFiles = emptyList() + _uiState.value = _uiState.value.copy( + draftText = "", + pendingMedia = emptyList(), + isSaving = false, + createdStoryId = groupId + ) + onCreated() + }.onFailure { error -> + _uiState.value = _uiState.value.copy(isSaving = false, errorMessage = error.message) + } + return@launch + } + + runCatching { + container.executeAuthorized { session -> + container.apiClient.createStory( + accessToken = session.accessToken, + text = text, + visibility = state.visibility, + hasProtectedContent = state.hasProtectedContent, + ttlSeconds = state.ttlSeconds + ) + } + }.onSuccess { story -> + _uiState.value = _uiState.value.copy( + stories = listOf(story) + _uiState.value.stories.filterNot { it.id == story.id }, + draftText = "", + isSaving = false, + createdStoryId = story.id + ) + onCreated() + }.onFailure { error -> + _uiState.value = _uiState.value.copy(isSaving = false, errorMessage = error.message) + } + } + } + + fun openStory(story: StoryDto) { + viewModelScope.launch { + _uiState.value = _uiState.value.copy(selectedStory = story, errorMessage = null) + runCatching { + container.executeAuthorized { session -> + container.apiClient.getStory(session.accessToken, story.id) + } + }.onSuccess { viewedStory -> + _uiState.value = _uiState.value.copy( + selectedStory = viewedStory, + stories = _uiState.value.stories.map { if (it.id == viewedStory.id) viewedStory else it } + ) + }.onFailure { error -> + _uiState.value = _uiState.value.copy(errorMessage = error.message) + } + } + } + + fun openStoryById(storyId: String) { + val story = _uiState.value.stories.firstOrNull { it.id == storyId } + if (story != null) { + openStory(story) + return + } + + viewModelScope.launch { + _uiState.value = _uiState.value.copy(isLoading = true, errorMessage = null) + runCatching { + container.executeAuthorized { session -> + container.apiClient.getStory(session.accessToken, storyId) + } + }.onSuccess { storyFromServer -> + _uiState.value = _uiState.value.copy( + selectedStory = storyFromServer, + stories = listOf(storyFromServer) + _uiState.value.stories.filterNot { it.id == storyFromServer.id }, + isLoading = false + ) + }.onFailure { error -> + _uiState.value = _uiState.value.copy(isLoading = false, errorMessage = error.message) + } + } + } + + fun openNextStory() { + openRelativeStory(offset = 1) + } + + fun openPreviousStory() { + openRelativeStory(offset = -1) + } + + fun closeStoryPreview() { + _uiState.value = _uiState.value.copy(selectedStory = null) + } + + fun deleteStory(story: StoryDto) { + viewModelScope.launch { + runCatching { + container.executeAuthorized { session -> container.apiClient.deleteStory(session.accessToken, story.id) } + }.onSuccess { + _uiState.value = _uiState.value.copy( + stories = _uiState.value.stories.filterNot { it.id == story.id }, + selectedStory = _uiState.value.selectedStory?.takeUnless { it.id == story.id } + ) + }.onFailure { error -> + _uiState.value = _uiState.value.copy(errorMessage = error.message) + } + } + } + + fun retryTransfer(groupId: String) { + viewModelScope.launch { + runCatching { container.transferQueueRepository.retry(groupId) } + .onFailure { error -> _uiState.value = _uiState.value.copy(errorMessage = error.message) } + } + } + + fun cancelTransfer(groupId: String) { + viewModelScope.launch { + runCatching { container.transferQueueRepository.cancel(groupId) } + .onFailure { error -> _uiState.value = _uiState.value.copy(errorMessage = error.message) } + } + } + + private fun attachStoryTransferState() { + viewModelScope.launch { + container.transferQueueRepository.observeActiveStoryUploads().collect { items -> + val transfers = items.toStoryTransferUiState() + if (hadActiveStoryTransfers && transfers.isEmpty()) { + refresh() + } + hadActiveStoryTransfers = transfers.isNotEmpty() + _uiState.value = _uiState.value.copy(activeTransfers = transfers) + } + } + } + + private fun openRelativeStory(offset: Int) { + val state = _uiState.value + val selected = state.selectedStory ?: return + val stories = state.stories + if (stories.isEmpty()) { + return + } + val currentIndex = stories.indexOfFirst { it.id == selected.id } + if (currentIndex < 0) { + return + } + + val nextIndex = (currentIndex + offset).coerceIn(0, stories.lastIndex) + if (nextIndex != currentIndex) { + openStory(stories[nextIndex]) + } + } + + companion object { + private const val MaxStoryMediaCount = 10 + } +} + +private fun List<LocalAttachmentFile>.toStoryMediaPreviewUiState(): List<StoryMediaPreviewUiState> = + map { file -> + StoryMediaPreviewUiState( + fileName = file.fileName, + contentType = file.contentType, + fileSizeBytes = file.fileSizeBytes, + localPath = file.localPath + ) + } + +private fun List<TransferQueueEntity>.toStoryTransferUiState(): List<StoryTransferUiState> = + groupBy { it.groupId } + .map { (groupId, items) -> + val ordered = items.sortedBy { it.sortOrder } + val first = ordered.first() + StoryTransferUiState( + groupId = groupId, + title = if (ordered.size == 1) first.fileName else "${ordered.size} файлов", + status = first.status, + progressPercent = ordered.maxOfOrNull { it.progressPercent } ?: 0, + errorMessage = ordered.firstNotNullOfOrNull { it.errorMessage } + ) + } + .sortedBy { it.title } diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/transfer/AttachmentDownloadWorker.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/transfer/AttachmentDownloadWorker.kt new file mode 100644 index 00000000..c2e207fe --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/transfer/AttachmentDownloadWorker.kt @@ -0,0 +1,123 @@ +package com.seven.ikar.kotlin.feature.transfer + +import android.content.Context +import androidx.work.CoroutineWorker +import androidx.work.WorkerParameters +import com.seven.ikar.kotlin.app.IkarNativeApp +import com.seven.ikar.kotlin.core.local.TransferQueueStatus +import com.seven.ikar.kotlin.core.model.AttachmentDto +import com.seven.ikar.kotlin.core.model.AttachmentKind +import kotlinx.coroutines.runBlocking +import java.io.File + +class AttachmentDownloadWorker( + appContext: Context, + params: WorkerParameters +) : CoroutineWorker(appContext, params) { + override suspend fun doWork(): Result { + val groupId = inputData.getString(KeyGroupId) ?: return Result.failure() + val container = (applicationContext as IkarNativeApp).container + val dao = container.localDatabase.transferQueueDao() + val items = dao.getGroup(groupId) + if (items.isEmpty()) { + return Result.success() + } + + val first = items.first() + val attachmentId = first.attachmentId ?: return Result.failure() + val chatId = first.chatId ?: return Result.failure() + val now = System.currentTimeMillis() + val totalBytes = first.fileSizeBytes.coerceAtLeast(0L) + val showForeground = totalBytes >= TransferForegroundNotification.LargeTransferThresholdBytes + if (showForeground) { + setForeground( + TransferForegroundNotification.createForegroundInfo( + context = applicationContext, + groupId = groupId, + title = "Загрузка вложения", + message = first.fileName, + progressPercent = null + ) + ) + } + dao.updateGroupStatus(groupId, TransferQueueStatus.Running, 5, null, now) + var lastProgressPercent = 5 + var lastProgressAtMillis = now + + suspend fun publishProgress(bytesTransferred: Long, reportedTotalBytes: Long, force: Boolean = false) { + val effectiveTotalBytes = reportedTotalBytes.takeIf { it > 0L } ?: totalBytes.takeIf { it > 0L } ?: return + val progressPercent = ((bytesTransferred.coerceAtMost(effectiveTotalBytes) * 100L) / effectiveTotalBytes) + .toInt() + .coerceIn(5, 99) + val currentTime = System.currentTimeMillis() + val shouldPublish = force || + progressPercent != lastProgressPercent && currentTime - lastProgressAtMillis >= ProgressUpdateIntervalMillis || + progressPercent >= 99 && lastProgressPercent < 99 + if (!shouldPublish) { + return + } + + lastProgressPercent = progressPercent + lastProgressAtMillis = currentTime + dao.updateGroupStatus(groupId, TransferQueueStatus.Running, progressPercent, null, currentTime) + if (showForeground) { + setForeground( + TransferForegroundNotification.createForegroundInfo( + context = applicationContext, + groupId = groupId, + title = "Загрузка вложения", + message = first.fileName, + progressPercent = progressPercent + ) + ) + } + } + + return runCatching { + val attachment = AttachmentDto( + id = attachmentId, + fileName = first.fileName, + contentType = first.contentType, + fileSizeBytes = first.fileSizeBytes, + downloadPath = "/api/chats/$chatId/attachments/$attachmentId/content", + kind = AttachmentKind.File, + sortOrder = first.sortOrder + ) + val target = File(first.localPath).takeIf { it.path.isNotBlank() } + ?: container.attachmentFileService.createAttachmentCacheFile(attachment.id, attachment.fileName) + container.executeAuthorized { session -> + val downloaded = container.apiClient.downloadAttachmentTo( + accessToken = session.accessToken, + attachment = attachment, + targetFile = target, + onProgress = { bytesRead, reportedTotalBytes -> + runBlocking { + publishProgress(bytesRead, reportedTotalBytes) + } + } + ) + container.attachmentFileService.cacheDownloadedAttachment(downloaded) + } + }.fold( + onSuccess = { + dao.updateGroupStatus(groupId, TransferQueueStatus.Completed, 100, null, System.currentTimeMillis()) + Result.success() + }, + onFailure = { error -> + dao.updateGroupStatus( + groupId = groupId, + status = TransferQueueStatus.Failed, + progressPercent = 0, + errorMessage = error.message, + updatedAtMillis = System.currentTimeMillis() + ) + if (runAttemptCount < 3) Result.retry() else Result.failure() + } + ) + } + + companion object { + const val KeyGroupId = "group_id" + private const val ProgressUpdateIntervalMillis = 500L + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/transfer/AttachmentUploadWorker.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/transfer/AttachmentUploadWorker.kt new file mode 100644 index 00000000..687a440d --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/transfer/AttachmentUploadWorker.kt @@ -0,0 +1,160 @@ +package com.seven.ikar.kotlin.feature.transfer + +import android.content.Context +import androidx.work.CoroutineWorker +import androidx.work.WorkerParameters +import com.seven.ikar.kotlin.app.IkarNativeApp +import com.seven.ikar.kotlin.core.local.TransferQueueStatus +import com.seven.ikar.kotlin.core.local.TransferQueueTypes +import com.seven.ikar.kotlin.core.model.StoryVisibility +import com.seven.ikar.kotlin.core.network.UploadFileSource +import kotlinx.coroutines.runBlocking +import java.io.File + +class AttachmentUploadWorker( + appContext: Context, + params: WorkerParameters +) : CoroutineWorker(appContext, params) { + override suspend fun doWork(): Result { + val groupId = inputData.getString(KeyGroupId) ?: return Result.failure() + val container = (applicationContext as IkarNativeApp).container + val dao = container.localDatabase.transferQueueDao() + val items = dao.getGroup(groupId) + if (items.isEmpty()) { + return Result.success() + } + + val first = items.first() + val isStoryUpload = first.type == TransferQueueTypes.StoryUpload + val chatId = if (isStoryUpload) null else first.chatId ?: return Result.failure() + val now = System.currentTimeMillis() + val totalBytes = items.sumOf { it.fileSizeBytes.coerceAtLeast(0L) } + val showForeground = totalBytes >= TransferForegroundNotification.LargeTransferThresholdBytes + val notificationMessage = if (items.size == 1) first.fileName else "${items.size} файлов" + val notificationTitle = if (isStoryUpload) "Загрузка истории" else "Загрузка вложений" + if (showForeground) { + setForeground( + TransferForegroundNotification.createForegroundInfo( + context = applicationContext, + groupId = groupId, + title = notificationTitle, + message = notificationMessage, + progressPercent = null + ) + ) + } + dao.updateGroupStatus(groupId, TransferQueueStatus.Running, 5, null, now) + var lastProgressPercent = 5 + var lastProgressAtMillis = now + + suspend fun publishProgress(bytesTransferred: Long, force: Boolean = false) { + if (totalBytes <= 0L) { + return + } + + val progressPercent = ((bytesTransferred.coerceAtMost(totalBytes) * 100L) / totalBytes) + .toInt() + .coerceIn(5, 99) + val currentTime = System.currentTimeMillis() + val shouldPublish = force || + progressPercent != lastProgressPercent && currentTime - lastProgressAtMillis >= ProgressUpdateIntervalMillis || + progressPercent >= 99 && lastProgressPercent < 99 + if (!shouldPublish) { + return + } + + lastProgressPercent = progressPercent + lastProgressAtMillis = currentTime + dao.updateGroupStatus(groupId, TransferQueueStatus.Running, progressPercent, null, currentTime) + if (showForeground) { + setForeground( + TransferForegroundNotification.createForegroundInfo( + context = applicationContext, + groupId = groupId, + title = notificationTitle, + message = notificationMessage, + progressPercent = progressPercent + ) + ) + } + } + + return runCatching { + val uploadedBytesByItem = LongArray(items.size) + val progressLock = Any() + val files = items + .sortedBy { it.sortOrder } + .mapIndexed { index, item -> + UploadFileSource( + fileName = item.fileName, + contentType = item.contentType, + contentLength = item.fileSizeBytes, + onBytesWritten = { itemBytesWritten -> + val bytesTransferred = synchronized(progressLock) { + uploadedBytesByItem[index] = maxOf(uploadedBytesByItem[index], itemBytesWritten) + uploadedBytesByItem.sum() + } + runBlocking { + publishProgress(bytesTransferred) + } + } + ) { + File(item.localPath).inputStream() + } + } + + container.executeAuthorized { session -> + if (isStoryUpload) { + container.apiClient.createMediaStory( + accessToken = session.accessToken, + text = first.text, + visibility = first.storyVisibility.toStoryVisibility(), + hasProtectedContent = first.hasProtectedContent, + ttlSeconds = first.ttlSeconds ?: 86_400, + files = files + ) + } else if (files.size == 1) { + container.apiClient.uploadAttachment( + accessToken = session.accessToken, + chatId = chatId!!, + text = first.text, + replyToMessageId = first.replyToMessageId, + file = files.first() + ) + } else { + container.apiClient.uploadAttachmentAlbum( + accessToken = session.accessToken, + chatId = chatId!!, + text = first.text, + replyToMessageId = first.replyToMessageId, + files = files + ) + } + } + }.fold( + onSuccess = { + dao.updateGroupStatus(groupId, TransferQueueStatus.Completed, 100, null, System.currentTimeMillis()) + Result.success() + }, + onFailure = { error -> + dao.updateGroupStatus( + groupId = groupId, + status = TransferQueueStatus.Failed, + progressPercent = 0, + errorMessage = error.message, + updatedAtMillis = System.currentTimeMillis() + ) + if (runAttemptCount < 3) Result.retry() else Result.failure() + } + ) + } + + companion object { + const val KeyGroupId = "group_id" + private const val ProgressUpdateIntervalMillis = 500L + } +} + +private fun String?.toStoryVisibility(): StoryVisibility = + runCatching { StoryVisibility.valueOf(this ?: StoryVisibility.Everyone.name) } + .getOrDefault(StoryVisibility.Everyone) diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/transfer/TransferForegroundNotification.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/transfer/TransferForegroundNotification.kt new file mode 100644 index 00000000..bd04c353 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/transfer/TransferForegroundNotification.kt @@ -0,0 +1,71 @@ +package com.seven.ikar.kotlin.feature.transfer + +import android.app.NotificationChannel +import android.app.NotificationManager +import android.content.Context +import android.content.pm.ServiceInfo +import android.os.Build +import androidx.core.app.NotificationCompat +import androidx.core.content.getSystemService +import androidx.work.ForegroundInfo +import com.seven.ikar.kotlin.R + +object TransferForegroundNotification { + const val LargeTransferThresholdBytes: Long = 8L * 1024L * 1024L + private const val ChannelId = "ikar_transfers" + + fun createForegroundInfo( + context: Context, + groupId: String, + title: String, + message: String, + progressPercent: Int? + ): ForegroundInfo { + ensureChannel(context) + val notification = NotificationCompat.Builder(context, ChannelId) + .setSmallIcon(R.drawable.ic_notification_transfer) + .setContentTitle(title) + .setContentText(message) + .setOnlyAlertOnce(true) + .setOngoing(true) + .setPriority(NotificationCompat.PRIORITY_LOW) + .apply { + val progress = progressPercent?.coerceIn(0, 100) + if (progress == null) { + setProgress(0, 0, true) + } else { + setProgress(100, progress, false) + } + } + .build() + + val notificationId = (groupId.hashCode() and Int.MAX_VALUE).coerceAtLeast(1) + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + ForegroundInfo(notificationId, notification, ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC) + } else { + ForegroundInfo(notificationId, notification) + } + } + + private fun ensureChannel(context: Context) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { + return + } + + val manager = context.getSystemService<NotificationManager>() ?: return + if (manager.getNotificationChannel(ChannelId) != null) { + return + } + + manager.createNotificationChannel( + NotificationChannel( + ChannelId, + "Передача файлов", + NotificationManager.IMPORTANCE_LOW + ).apply { + description = "Статус крупных загрузок и скачиваний" + setShowBadge(false) + } + ) + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/transfer/TransferQueueRepository.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/transfer/TransferQueueRepository.kt new file mode 100644 index 00000000..15aa63f3 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/transfer/TransferQueueRepository.kt @@ -0,0 +1,204 @@ +package com.seven.ikar.kotlin.feature.transfer + +import android.content.Context +import androidx.work.Constraints +import androidx.work.ExistingWorkPolicy +import androidx.work.NetworkType +import androidx.work.OneTimeWorkRequestBuilder +import androidx.work.WorkManager +import androidx.work.workDataOf +import com.seven.ikar.kotlin.core.local.TransferQueueDao +import com.seven.ikar.kotlin.core.local.TransferQueueEntity +import com.seven.ikar.kotlin.core.local.TransferQueueStatus +import com.seven.ikar.kotlin.core.local.TransferQueueTypes +import com.seven.ikar.kotlin.core.model.AttachmentDto +import com.seven.ikar.kotlin.core.model.StoryVisibility +import com.seven.ikar.kotlin.feature.chat.LocalAttachmentFile +import kotlinx.coroutines.flow.Flow +import java.util.UUID + +class TransferQueueRepository( + private val dao: TransferQueueDao, + private val scheduler: TransferWorkScheduler +) { + fun observeActiveForChat(chatId: String): Flow<List<TransferQueueEntity>> = + dao.observeActiveForChat(chatId) + + fun observeActiveStoryUploads(): Flow<List<TransferQueueEntity>> = + dao.observeActiveStoryUploads() + + suspend fun enqueueUpload( + chatId: String, + text: String?, + replyToMessageId: String?, + files: List<LocalAttachmentFile> + ): String { + require(files.isNotEmpty()) { "Нужен хотя бы один файл." } + + val groupId = UUID.randomUUID().toString() + val now = System.currentTimeMillis() + dao.upsert( + files.mapIndexed { index, file -> + TransferQueueEntity( + id = UUID.randomUUID().toString(), + groupId = groupId, + type = TransferQueueTypes.Upload, + status = TransferQueueStatus.Queued, + chatId = chatId, + text = text?.takeIf { it.isNotBlank() }, + replyToMessageId = replyToMessageId, + attachmentId = null, + storyVisibility = null, + hasProtectedContent = false, + ttlSeconds = null, + fileName = file.fileName, + contentType = file.contentType, + fileSizeBytes = file.fileSizeBytes, + localPath = file.localPath, + sortOrder = index, + progressPercent = 0, + errorMessage = null, + createdAtMillis = now, + updatedAtMillis = now + ) + } + ) + scheduler.enqueueUpload(groupId) + return groupId + } + + suspend fun enqueueStoryUpload( + text: String?, + visibility: StoryVisibility, + hasProtectedContent: Boolean, + ttlSeconds: Int, + files: List<LocalAttachmentFile> + ): String { + require(files.isNotEmpty()) { "Нужен хотя бы один файл." } + + val groupId = UUID.randomUUID().toString() + val now = System.currentTimeMillis() + dao.upsert( + files.mapIndexed { index, file -> + TransferQueueEntity( + id = UUID.randomUUID().toString(), + groupId = groupId, + type = TransferQueueTypes.StoryUpload, + status = TransferQueueStatus.Queued, + chatId = null, + text = text?.takeIf { it.isNotBlank() }, + replyToMessageId = null, + attachmentId = null, + storyVisibility = visibility.name, + hasProtectedContent = hasProtectedContent, + ttlSeconds = ttlSeconds, + fileName = file.fileName, + contentType = file.contentType, + fileSizeBytes = file.fileSizeBytes, + localPath = file.localPath, + sortOrder = index, + progressPercent = 0, + errorMessage = null, + createdAtMillis = now, + updatedAtMillis = now + ) + } + ) + scheduler.enqueueStoryUpload(groupId) + return groupId + } + + suspend fun enqueueDownload(chatId: String, attachment: AttachmentDto): String { + val groupId = UUID.randomUUID().toString() + val now = System.currentTimeMillis() + dao.upsert( + listOf( + TransferQueueEntity( + id = UUID.randomUUID().toString(), + groupId = groupId, + type = TransferQueueTypes.Download, + status = TransferQueueStatus.Queued, + chatId = chatId, + text = null, + replyToMessageId = null, + attachmentId = attachment.id, + storyVisibility = null, + hasProtectedContent = false, + ttlSeconds = null, + fileName = attachment.fileName, + contentType = attachment.contentType, + fileSizeBytes = attachment.fileSizeBytes, + localPath = "", + sortOrder = attachment.sortOrder, + progressPercent = 0, + errorMessage = null, + createdAtMillis = now, + updatedAtMillis = now + ) + ) + ) + scheduler.enqueueDownload(groupId) + return groupId + } + + suspend fun retry(groupId: String) { + val type = dao.getGroup(groupId).firstOrNull()?.type + dao.updateGroupStatus(groupId, TransferQueueStatus.Queued, 0, null, System.currentTimeMillis()) + when (type) { + TransferQueueTypes.Download -> scheduler.enqueueDownload(groupId) + TransferQueueTypes.StoryUpload -> scheduler.enqueueStoryUpload(groupId) + else -> scheduler.enqueueUpload(groupId) + } + } + + suspend fun cancel(groupId: String) { + scheduler.cancel(groupId) + dao.deleteGroup(groupId) + } +} + +class TransferWorkScheduler(context: Context) { + private val workManager = WorkManager.getInstance(context.applicationContext) + private val networkConstraints = Constraints.Builder() + .setRequiredNetworkType(NetworkType.CONNECTED) + .build() + + fun enqueueUpload(groupId: String) { + val request = OneTimeWorkRequestBuilder<AttachmentUploadWorker>() + .setInputData(workDataOf(AttachmentUploadWorker.KeyGroupId to groupId)) + .setConstraints(networkConstraints) + .build() + + workManager.enqueueUniqueWork(uploadWorkName(groupId), ExistingWorkPolicy.REPLACE, request) + } + + fun enqueueStoryUpload(groupId: String) { + val request = OneTimeWorkRequestBuilder<AttachmentUploadWorker>() + .setInputData(workDataOf(AttachmentUploadWorker.KeyGroupId to groupId)) + .setConstraints(networkConstraints) + .build() + + workManager.enqueueUniqueWork(storyUploadWorkName(groupId), ExistingWorkPolicy.REPLACE, request) + } + + fun enqueueDownload(groupId: String) { + val request = OneTimeWorkRequestBuilder<AttachmentDownloadWorker>() + .setInputData(workDataOf(AttachmentDownloadWorker.KeyGroupId to groupId)) + .setConstraints(networkConstraints) + .build() + + workManager.enqueueUniqueWork(downloadWorkName(groupId), ExistingWorkPolicy.REPLACE, request) + } + + fun cancel(groupId: String) { + workManager.cancelUniqueWork(uploadWorkName(groupId)) + workManager.cancelUniqueWork(storyUploadWorkName(groupId)) + workManager.cancelUniqueWork(downloadWorkName(groupId)) + } + + private fun uploadWorkName(groupId: String): String = "upload-$groupId" + + private fun storyUploadWorkName(groupId: String): String = "story-upload-$groupId" + + private fun downloadWorkName(groupId: String): String = "download-$groupId" +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/update/AppUpdateScreen.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/update/AppUpdateScreen.kt new file mode 100644 index 00000000..246c206e --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/update/AppUpdateScreen.kt @@ -0,0 +1,372 @@ +package com.seven.ikar.kotlin.feature.update + +import androidx.compose.foundation.border +import androidx.compose.foundation.verticalScroll +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ColumnScope +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.WindowInsetsSides +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.navigationBarsPadding +import androidx.compose.foundation.layout.only +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.safeDrawing +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.windowInsetsPadding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.material3.Button +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.LinearProgressIndicator +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedButton +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.RectangleShape +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import com.seven.ikar.kotlin.core.update.AppUpdateInstallerEvent +import com.seven.ikar.kotlin.ui.IkarScreenSurface +import com.seven.ikar.kotlin.ui.IkarSimpleHeader +import com.seven.ikar.kotlin.ui.theme.TelegramBorder +import com.seven.ikar.kotlin.ui.theme.TelegramInkMuted +import java.text.DecimalFormat +import java.time.OffsetDateTime +import java.time.ZoneId +import java.time.format.DateTimeFormatter + +@Composable +fun AppUpdateScreen( + state: AppUpdateUiState, + onBackClick: () -> Unit, + onRefreshClick: () -> Unit, + onInstallClick: () -> Unit, + onGrantPermissionClick: () -> Unit +) { + IkarScreenSurface(modifier = Modifier.fillMaxSize()) { + Column( + modifier = Modifier + .fillMaxSize() + .windowInsetsPadding(WindowInsets.safeDrawing.only(WindowInsetsSides.Top)) + ) { + Column( + modifier = Modifier.padding(start = 18.dp, top = 16.dp, end = 18.dp, bottom = 12.dp) + ) { + IkarSimpleHeader( + title = "Обновление приложения", + onBackClick = onBackClick + ) + } + + Column( + modifier = Modifier + .weight(1f) + .verticalScroll(rememberScrollState()) + .padding(horizontal = 18.dp), + verticalArrangement = Arrangement.spacedBy(12.dp) + ) { + UpdatePanel { + Text( + text = state.statusTitle, + style = MaterialTheme.typography.headlineMedium, + color = MaterialTheme.colorScheme.primary, + fontWeight = FontWeight.SemiBold + ) + Spacer(modifier = Modifier.height(6.dp)) + Text( + text = state.statusDetail, + style = MaterialTheme.typography.bodyMedium, + color = TelegramInkMuted + ) + } + + if (state.isChecking || state.isSubmitting) { + LinearProgressIndicator(modifier = Modifier.fillMaxWidth()) + } + + UpdatePanel { + Text( + text = "Текущая установка", + style = MaterialTheme.typography.titleLarge, + fontWeight = FontWeight.SemiBold + ) + Spacer(modifier = Modifier.height(8.dp)) + UpdateFieldRow( + title = "Версия Икар", + value = "${state.currentVersionName} (${state.currentVersionCode})" + ) + UpdateFieldRow( + title = "Разрешение Android", + value = if (state.canRequestPackageInstalls) "Включено" else "Нужно включить" + ) + state.latestManifest?.let { manifest -> + UpdateFieldRow( + title = "Последний релиз Argus", + value = "${manifest.release.version} (${manifest.release.androidVersionCode ?: "?"})" + ) + } + } + + UpdatePanel { + Text( + text = "Как работает установка", + style = MaterialTheme.typography.titleLarge, + fontWeight = FontWeight.SemiBold + ) + Spacer(modifier = Modifier.height(6.dp)) + Text( + text = "Икар скачивает APK из Argus, проверяет имя пакета и код версии, затем передаёт файл системному установщику Android. Переключатель в настройках Android только разрешает запуск установки, но не устанавливает обновление сам.", + style = MaterialTheme.typography.bodyMedium, + color = TelegramInkMuted + ) + } + + state.availableUpdate?.let { update -> + UpdatePanel { + Text( + text = "Доступное обновление", + style = MaterialTheme.typography.titleLarge, + fontWeight = FontWeight.SemiBold + ) + Spacer(modifier = Modifier.height(8.dp)) + UpdateFieldRow( + title = "Версия", + value = "${update.manifest.release.version} (${update.manifest.release.androidVersionCode ?: "?"})" + ) + UpdateFieldRow( + title = "Размер APK", + value = formatBytes(update.manifest.release.packageSizeBytes) + ) + UpdateFieldRow( + title = "Опубликовано", + value = formatPublishedAt(update.manifest.release.publishedAt) + ) + update.manifest.release.notes?.takeIf { it.isNotBlank() }?.let { notes -> + Spacer(modifier = Modifier.height(8.dp)) + Text( + text = "Что нового", + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.SemiBold + ) + Text( + text = notes, + style = MaterialTheme.typography.bodyMedium, + color = TelegramInkMuted + ) + } + } + } + + state.lastInstallerEvent?.let { event -> + UpdatePanel { + Text( + text = "Последний статус установки", + style = MaterialTheme.typography.titleLarge, + fontWeight = FontWeight.SemiBold + ) + Spacer(modifier = Modifier.height(8.dp)) + UpdateFieldRow(title = "Состояние", value = humanInstallerState(event)) + event.releaseVersion?.let { UpdateFieldRow(title = "Версия", value = it) } + event.versionCode?.let { UpdateFieldRow(title = "Код версии", value = it.toString()) } + event.detail?.let { + Spacer(modifier = Modifier.height(6.dp)) + Text( + text = it, + style = MaterialTheme.typography.bodyMedium, + color = TelegramInkMuted + ) + } + Spacer(modifier = Modifier.height(6.dp)) + Text( + text = formatInstallerTime(event), + style = MaterialTheme.typography.bodySmall, + color = TelegramInkMuted + ) + } + } + + Spacer(modifier = Modifier.height(8.dp)) + } + + UpdateActionBar( + state = state, + onRefreshClick = onRefreshClick, + onInstallClick = onInstallClick, + onGrantPermissionClick = onGrantPermissionClick + ) + } + } +} + +@Composable +private fun UpdateActionBar( + state: AppUpdateUiState, + onRefreshClick: () -> Unit, + onInstallClick: () -> Unit, + onGrantPermissionClick: () -> Unit +) { + Surface( + color = MaterialTheme.colorScheme.surface, + shape = RectangleShape, + shadowElevation = 8.dp + ) { + Column( + modifier = Modifier + .fillMaxWidth() + .navigationBarsPadding() + .padding(horizontal = 18.dp, vertical = 12.dp), + verticalArrangement = Arrangement.spacedBy(10.dp) + ) { + when { + state.availableUpdate != null && !state.canRequestPackageInstalls -> { + Button( + onClick = onGrantPermissionClick, + modifier = Modifier.fillMaxWidth(), + enabled = !state.isChecking && !state.isSubmitting + ) { + Text("Открыть разрешение Android") + } + OutlinedButton( + onClick = onRefreshClick, + modifier = Modifier.fillMaxWidth(), + enabled = !state.isChecking && !state.isSubmitting + ) { + Text("Проверить ещё раз") + } + } + + state.availableUpdate != null -> { + Button( + onClick = onInstallClick, + modifier = Modifier.fillMaxWidth(), + enabled = !state.isChecking && !state.isSubmitting + ) { + if (state.isSubmitting) { + CircularProgressIndicator(modifier = Modifier.size(18.dp), strokeWidth = 2.dp) + } else { + Text("Скачать и установить") + } + } + OutlinedButton( + onClick = onRefreshClick, + modifier = Modifier.fillMaxWidth(), + enabled = !state.isChecking && !state.isSubmitting + ) { + Text("Проверить заново") + } + } + + else -> { + Button( + onClick = onRefreshClick, + modifier = Modifier.fillMaxWidth(), + enabled = !state.isChecking && !state.isSubmitting + ) { + if (state.isChecking) { + CircularProgressIndicator(modifier = Modifier.size(18.dp), strokeWidth = 2.dp) + } else if (state.canRequestPackageInstalls) { + Text("Проверить обновление") + } else { + Text("Открыть разрешение установки APK") + } + } + } + } + } + } +} + +@Composable +private fun UpdatePanel( + modifier: Modifier = Modifier, + padding: PaddingValues = PaddingValues(16.dp), + content: @Composable ColumnScope.() -> Unit +) { + Surface( + modifier = modifier + .fillMaxWidth() + .border(1.dp, TelegramBorder, RectangleShape), + shape = RectangleShape, + color = MaterialTheme.colorScheme.surface, + shadowElevation = 0.dp + ) { + Column( + modifier = Modifier.padding(padding), + content = content + ) + } +} + +@Composable +private fun UpdateFieldRow( + title: String, + value: String +) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 5.dp), + horizontalArrangement = Arrangement.spacedBy(12.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = title, + modifier = Modifier.weight(1f), + style = MaterialTheme.typography.bodyMedium, + color = TelegramInkMuted + ) + Text( + text = value, + style = MaterialTheme.typography.titleMedium, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + } +} + +private fun humanInstallerState(event: AppUpdateInstallerEvent): String = + when (event.state) { + "submitted" -> "Запрос передан в Android" + "approval_required" -> "Нужно подтверждение пользователя" + "installed" -> "Обновление установлено" + "failed" -> "Установка завершилась ошибкой" + else -> event.state + } + +private fun formatPublishedAt(value: String): String = + runCatching { + OffsetDateTime.parse(value) + .atZoneSameInstant(ZoneId.systemDefault()) + .format(DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm")) + }.getOrElse { value } + +private fun formatInstallerTime(event: AppUpdateInstallerEvent): String = + runCatching { + java.time.Instant.ofEpochMilli(event.updatedAtEpochMillis) + .atZone(ZoneId.systemDefault()) + .format(DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss")) + }.getOrElse { event.updatedAtEpochMillis.toString() } + +private fun formatBytes(value: Long): String { + if (value <= 0) { + return "0 Б" + } + + val units = listOf("Б", "КБ", "МБ", "ГБ") + var size = value.toDouble() + var unitIndex = 0 + while (size >= 1024 && unitIndex < units.lastIndex) { + size /= 1024 + unitIndex++ + } + return "${DecimalFormat("#,##0.#").format(size).replace(',', '.')} ${units[unitIndex]}" +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/update/AppUpdateViewModel.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/update/AppUpdateViewModel.kt new file mode 100644 index 00000000..0b4eaad2 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/feature/update/AppUpdateViewModel.kt @@ -0,0 +1,226 @@ +package com.seven.ikar.kotlin.feature.update + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.seven.ikar.kotlin.BuildConfig +import com.seven.ikar.kotlin.app.AppContainer +import com.seven.ikar.kotlin.core.network.ServerConfig +import com.seven.ikar.kotlin.core.update.AppUpdateCheckResult +import com.seven.ikar.kotlin.core.update.AppUpdateInstallerEvent +import com.seven.ikar.kotlin.core.update.AppUpdateSubmissionResult +import com.seven.ikar.kotlin.core.update.ArgusAppManifest +import com.seven.ikar.kotlin.core.update.ArgusAppUpdateConfig +import com.seven.ikar.kotlin.core.update.AvailableIkarUpdate +import com.seven.ikar.kotlin.core.update.InstalledIkarApp +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext + +data class AppUpdateUiState( + val currentVersionName: String, + val currentVersionCode: Long, + val canRequestPackageInstalls: Boolean, + val isChecking: Boolean = false, + val isSubmitting: Boolean = false, + val statusTitle: String, + val statusDetail: String, + val availableUpdate: AvailableIkarUpdate? = null, + val latestManifest: ArgusAppManifest? = null, + val lastInstallerEvent: AppUpdateInstallerEvent? = null +) + +class AppUpdateViewModel(private val container: AppContainer) : ViewModel() { + private val config = ArgusAppUpdateConfig( + baseUrl = ServerConfig.ArgusBaseUrl, + slug = ServerConfig.AndroidAppSlug, + platform = ServerConfig.AndroidAppPlatform, + channel = ServerConfig.AndroidUpdateChannel + ) + + private val installedApp = InstalledIkarApp( + packageName = BuildConfig.APPLICATION_ID, + versionCode = BuildConfig.VERSION_CODE.toLong(), + versionName = BuildConfig.VERSION_NAME + ) + + private val _uiState = MutableStateFlow( + createInitialState(container.appUpdateManager.canRequestPackageInstalls()) + ) + val uiState: StateFlow<AppUpdateUiState> = _uiState.asStateFlow() + + init { + refreshStatus() + } + + fun refreshStatus() { + val canRequestPackageInstalls = container.appUpdateManager.canRequestPackageInstalls() + val currentState = _uiState.value + val shouldReplaceStatus = + currentState.statusTitle == initialStatusTitle(false) || + currentState.statusTitle == initialStatusTitle(true) || + currentState.statusTitle == permissionRequiredTitle || + currentState.statusTitle == permissionGrantedTitle + + _uiState.value = currentState.copy( + canRequestPackageInstalls = canRequestPackageInstalls, + lastInstallerEvent = container.appUpdateManager.loadLastInstallerEvent(), + statusTitle = if (shouldReplaceStatus) { + if (canRequestPackageInstalls) permissionGrantedTitle else initialStatusTitle(false) + } else { + currentState.statusTitle + }, + statusDetail = if (shouldReplaceStatus) { + if (canRequestPackageInstalls) permissionGrantedDetail else initialStatusDetail(false) + } else { + currentState.statusDetail + } + ) + } + + fun requestUnknownSourcesPermission() { + _uiState.value = _uiState.value.copy( + canRequestPackageInstalls = false, + statusTitle = permissionRequiredTitle, + statusDetail = permissionRequiredDetail + ) + } + + fun checkForUpdates() { + if (_uiState.value.isChecking) { + return + } + + viewModelScope.launch { + _uiState.value = _uiState.value.copy(isChecking = true) + val result = withContext(Dispatchers.IO) { + container.appUpdateManager.checkForUpdate(config, installedApp) + } + when (result) { + is AppUpdateCheckResult.NotPublished -> { + _uiState.value = _uiState.value.copy( + isChecking = false, + availableUpdate = null, + latestManifest = null, + statusTitle = "Проверка проведена", + statusDetail = result.reason + ) + } + + is AppUpdateCheckResult.UpToDate -> { + _uiState.value = _uiState.value.copy( + isChecking = false, + availableUpdate = null, + latestManifest = result.manifest, + statusTitle = "Проверка проведена", + statusDetail = "Обновлений нет." + ) + } + + is AppUpdateCheckResult.UpdateAvailable -> { + val manifest = result.update.manifest + _uiState.value = _uiState.value.copy( + isChecking = false, + availableUpdate = result.update, + latestManifest = manifest, + statusTitle = "Проверка проведена", + statusDetail = "Обновления есть: версия ${manifest.release.version} (${manifest.release.androidVersionCode ?: "?"})." + ) + } + + is AppUpdateCheckResult.Incompatible -> { + _uiState.value = _uiState.value.copy( + isChecking = false, + availableUpdate = null, + latestManifest = null, + statusTitle = "Проверка проведена", + statusDetail = result.reason + ) + } + + is AppUpdateCheckResult.Failed -> { + _uiState.value = _uiState.value.copy( + isChecking = false, + availableUpdate = null, + latestManifest = null, + statusTitle = "Проверка не выполнена", + statusDetail = result.reason + ) + } + } + refreshStatus() + } + } + + fun installAvailableUpdate() { + val update = _uiState.value.availableUpdate ?: return + if (_uiState.value.isSubmitting) { + return + } + + if (!container.appUpdateManager.canRequestPackageInstalls()) { + requestUnknownSourcesPermission() + return + } + + viewModelScope.launch { + _uiState.value = _uiState.value.copy(isSubmitting = true) + val result = withContext(Dispatchers.IO) { + container.appUpdateManager.downloadAndInstall(update) + } + when (result) { + is AppUpdateSubmissionResult.Submitted -> { + _uiState.value = _uiState.value.copy( + isSubmitting = false, + statusTitle = "Запрос отправлен в Android", + statusDetail = result.message + ) + } + + is AppUpdateSubmissionResult.Rejected -> { + _uiState.value = _uiState.value.copy( + isSubmitting = false, + statusTitle = "Установка не запущена", + statusDetail = result.message + ) + } + } + refreshStatus() + } + } + + private fun createInitialState(canRequestPackageInstalls: Boolean): AppUpdateUiState = + AppUpdateUiState( + currentVersionName = BuildConfig.VERSION_NAME, + currentVersionCode = BuildConfig.VERSION_CODE.toLong(), + canRequestPackageInstalls = canRequestPackageInstalls, + statusTitle = initialStatusTitle(canRequestPackageInstalls), + statusDetail = initialStatusDetail(canRequestPackageInstalls), + lastInstallerEvent = container.appUpdateManager.loadLastInstallerEvent() + ) + + private companion object { + const val permissionRequiredTitle = "Нужно разрешение на установку" + const val permissionRequiredDetail = + "Android откроет системный экран разрешения установки APK для Икар. После разрешения нажмите «Проверить» ещё раз." + const val permissionGrantedTitle = "Разрешение на установку включено" + const val permissionGrantedDetail = + "Теперь кнопка «Проверить» будет искать доступные обновления на сайте Argus." + + fun initialStatusTitle(canRequestPackageInstalls: Boolean): String = + if (canRequestPackageInstalls) { + "Проверка обновлений ещё не запускалась" + } else { + "Сначала разрешите установку APK" + } + + fun initialStatusDetail(canRequestPackageInstalls: Boolean): String = + if (canRequestPackageInstalls) { + "Нажмите «Проверить», чтобы сверить установленную версию с Argus." + } else { + "При первом нажатии «Проверить» Android должен открыть разрешение установки приложений из неизвестных источников для Икар." + } + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/ui/AuthenticatedAsyncImage.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/ui/AuthenticatedAsyncImage.kt new file mode 100644 index 00000000..2a85bbcf --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/ui/AuthenticatedAsyncImage.kt @@ -0,0 +1,47 @@ +package com.seven.ikar.kotlin.ui + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.platform.LocalContext +import coil.compose.AsyncImage +import coil.request.CachePolicy +import coil.request.ImageRequest + +@Composable +fun AuthenticatedAsyncImage( + imageUrl: String?, + accessToken: String? = null, + contentDescription: String, + modifier: Modifier = Modifier, + contentScale: ContentScale = ContentScale.Crop +) { + if (imageUrl.isNullOrBlank()) { + return + } + + val resolvedAccessToken = accessToken ?: LocalIkarAccessToken.current + val context = LocalContext.current + val request = remember(imageUrl, resolvedAccessToken) { + ImageRequest.Builder(context) + .data(imageUrl) + .diskCacheKey(imageUrl) + .diskCachePolicy(CachePolicy.ENABLED) + .memoryCachePolicy(CachePolicy.ENABLED) + .apply { + if (!resolvedAccessToken.isNullOrBlank()) { + addHeader("Authorization", "Bearer $resolvedAccessToken") + } + } + .crossfade(true) + .build() + } + + AsyncImage( + model = request, + contentDescription = contentDescription, + modifier = modifier, + contentScale = contentScale + ) +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/ui/AvatarView.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/ui/AvatarView.kt new file mode 100644 index 00000000..e52e9c38 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/ui/AvatarView.kt @@ -0,0 +1,66 @@ +package com.seven.ikar.kotlin.ui + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.compositionLocalOf +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.seven.ikar.kotlin.core.network.ServerConfig + +val LocalIkarAccessToken = compositionLocalOf<String?> { null } + +@Composable +fun AvatarView( + imageUrl: String?, + title: String, + accessToken: String? = null, + size: Dp = 44.dp +) { + val resolvedImageUrl = ServerConfig.normalizeMediaUrl(imageUrl) + val resolvedAccessToken = accessToken ?: LocalIkarAccessToken.current + val avatarColor = ikarAvatarColor(title) + val initials = ikarAvatarInitials(title) + val fontSize = when { + size >= 96.dp -> 32.dp + size >= 72.dp -> 24.dp + size >= 54.dp -> 18.dp + else -> 16.dp + } + + Box( + modifier = Modifier + .size(size) + .clip(CircleShape) + .background(avatarColor), + contentAlignment = Alignment.Center + ) { + Text( + text = initials, + style = MaterialTheme.typography.titleLarge.copy( + fontSize = fontSize.value.sp, + color = Color.White + ), + textAlign = TextAlign.Center + ) + + AuthenticatedAsyncImage( + imageUrl = resolvedImageUrl, + accessToken = resolvedAccessToken, + contentDescription = title, + modifier = Modifier.matchParentSize(), + contentScale = ContentScale.Crop + ) + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/ui/ChatWallpapers.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/ui/ChatWallpapers.kt new file mode 100644 index 00000000..c0bdd3fd --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/ui/ChatWallpapers.kt @@ -0,0 +1,292 @@ +package com.seven.ikar.kotlin.ui + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.offset +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Brush +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.unit.dp +import com.seven.ikar.kotlin.core.settings.DEFAULT_CHAT_WALLPAPER_PRESET_ID +import com.seven.ikar.kotlin.core.settings.ChatSettingsSnapshot + +enum class ChatWallpaperAccentStyle { + SoftCircles, + CornerGlow, + Ribbon +} + +data class ChatWallpaperPreset( + val id: String, + val title: String, + val gradientColors: List<Color>, + val accentPrimary: Color, + val accentSecondary: Color, + val accentStyle: ChatWallpaperAccentStyle +) + +object ChatWallpaperCatalog { + val presets: List<ChatWallpaperPreset> = listOf( + ChatWallpaperPreset( + id = DEFAULT_CHAT_WALLPAPER_PRESET_ID, + title = "Мятное поле", + gradientColors = listOf(Color(0xFFE9F4D7), Color(0xFFD5E8BB), Color(0xFFC8E0AD)), + accentPrimary = Color(0x88FFFFFF), + accentSecondary = Color(0x445C8F5A), + accentStyle = ChatWallpaperAccentStyle.SoftCircles + ), + ChatWallpaperPreset( + id = "sky_haze", + title = "Небесная дымка", + gradientColors = listOf(Color(0xFFE8F5FF), Color(0xFFD6ECFF), Color(0xFFC1DFFF)), + accentPrimary = Color(0x88FFFFFF), + accentSecondary = Color(0x44489AD9), + accentStyle = ChatWallpaperAccentStyle.CornerGlow + ), + ChatWallpaperPreset( + id = "peach_dawn", + title = "Персиковый рассвет", + gradientColors = listOf(Color(0xFFFFF0E2), Color(0xFFFFDDBD), Color(0xFFFFCCA3)), + accentPrimary = Color(0x88FFFFFF), + accentSecondary = Color(0x44F08F5A), + accentStyle = ChatWallpaperAccentStyle.Ribbon + ), + ChatWallpaperPreset( + id = "violet_dusk", + title = "Сиреневый закат", + gradientColors = listOf(Color(0xFFF0E8FF), Color(0xFFE0D1FF), Color(0xFFD1BCFF)), + accentPrimary = Color(0x88FFFFFF), + accentSecondary = Color(0x447D5AD8), + accentStyle = ChatWallpaperAccentStyle.SoftCircles + ), + ChatWallpaperPreset( + id = "ocean_breeze", + title = "Океан", + gradientColors = listOf(Color(0xFFE3FAFF), Color(0xFFC7F0F7), Color(0xFFA5E1EC)), + accentPrimary = Color(0x88FFFFFF), + accentSecondary = Color(0x4446A8B8), + accentStyle = ChatWallpaperAccentStyle.CornerGlow + ), + ChatWallpaperPreset( + id = "lemon_mist", + title = "Лимонный туман", + gradientColors = listOf(Color(0xFFFFF7D7), Color(0xFFFFEFAE), Color(0xFFFBE18D)), + accentPrimary = Color(0x88FFFFFF), + accentSecondary = Color(0x44C9A94C), + accentStyle = ChatWallpaperAccentStyle.Ribbon + ), + ChatWallpaperPreset( + id = "rose_cloud", + title = "Розовое облако", + gradientColors = listOf(Color(0xFFFFE7EE), Color(0xFFFFD7E7), Color(0xFFF7C4DB)), + accentPrimary = Color(0x88FFFFFF), + accentSecondary = Color(0x44D36C95), + accentStyle = ChatWallpaperAccentStyle.SoftCircles + ), + ChatWallpaperPreset( + id = "graphite_night", + title = "Графитовая ночь", + gradientColors = listOf(Color(0xFF2A3342), Color(0xFF1D2734), Color(0xFF131B27)), + accentPrimary = Color(0x2267A3F3), + accentSecondary = Color(0x2241E0C2), + accentStyle = ChatWallpaperAccentStyle.Ribbon + ), + ChatWallpaperPreset( + id = "forest_glow", + title = "Лесное свечение", + gradientColors = listOf(Color(0xFFE4F4E5), Color(0xFFCFE6C6), Color(0xFFBCD7B2)), + accentPrimary = Color(0x88FFFFFF), + accentSecondary = Color(0x444B8658), + accentStyle = ChatWallpaperAccentStyle.CornerGlow + ), + ChatWallpaperPreset( + id = "coral_sand", + title = "Коралловый песок", + gradientColors = listOf(Color(0xFFFFEEE6), Color(0xFFFFD8C8), Color(0xFFF6BFA8)), + accentPrimary = Color(0x88FFFFFF), + accentSecondary = Color(0x44CF7861), + accentStyle = ChatWallpaperAccentStyle.Ribbon + ), + ChatWallpaperPreset( + id = "azure_glass", + title = "Лазурное стекло", + gradientColors = listOf(Color(0xFFF0FCFF), Color(0xFFD7F4FF), Color(0xFFBAE7FA)), + accentPrimary = Color(0x88FFFFFF), + accentSecondary = Color(0x444C9BC4), + accentStyle = ChatWallpaperAccentStyle.SoftCircles + ), + ChatWallpaperPreset( + id = "lilac_ice", + title = "Лиловый лёд", + gradientColors = listOf(Color(0xFFF4EEFF), Color(0xFFE7DDFF), Color(0xFFD5C7FF)), + accentPrimary = Color(0x88FFFFFF), + accentSecondary = Color(0x447C73CF), + accentStyle = ChatWallpaperAccentStyle.CornerGlow + ), + ChatWallpaperPreset( + id = "amber_paper", + title = "Янтарная бумага", + gradientColors = listOf(Color(0xFFFFF2DC), Color(0xFFF6DFB7), Color(0xFFE9C88D)), + accentPrimary = Color(0x88FFFFFF), + accentSecondary = Color(0x44A06A2B), + accentStyle = ChatWallpaperAccentStyle.Ribbon + ), + ChatWallpaperPreset( + id = "olive_smoke", + title = "Оливковый дым", + gradientColors = listOf(Color(0xFFF0F4E6), Color(0xFFDEE4C6), Color(0xFFCDD59D)), + accentPrimary = Color(0x88FFFFFF), + accentSecondary = Color(0x446B8A4B), + accentStyle = ChatWallpaperAccentStyle.SoftCircles + ), + ChatWallpaperPreset( + id = "ruby_night", + title = "Рубиновая ночь", + gradientColors = listOf(Color(0xFF422437), Color(0xFF2F1A28), Color(0xFF1C1119)), + accentPrimary = Color(0x22FF8AAE), + accentSecondary = Color(0x22FFD4A3), + accentStyle = ChatWallpaperAccentStyle.CornerGlow + ) + ) + + fun resolvePreset(id: String?): ChatWallpaperPreset = + presets.firstOrNull { it.id == id } ?: presets.first { it.id == DEFAULT_CHAT_WALLPAPER_PRESET_ID } +} + +@Composable +fun ChatWallpaperBackground( + snapshot: ChatSettingsSnapshot, + modifier: Modifier = Modifier +) { + Box(modifier = modifier) { + if (snapshot.useCustomWallpaper && !snapshot.customWallpaperUri.isNullOrBlank()) { + AuthenticatedAsyncImage( + imageUrl = snapshot.customWallpaperUri, + contentDescription = "Пользовательские обои чата", + modifier = Modifier.fillMaxSize(), + contentScale = ContentScale.Crop + ) + Box( + modifier = Modifier + .fillMaxSize() + .background( + Brush.verticalGradient( + colors = listOf(Color.White.copy(alpha = 0.08f), Color.Black.copy(alpha = 0.05f)) + ) + ) + ) + } else { + PresetWallpaperBackground( + preset = ChatWallpaperCatalog.resolvePreset(snapshot.selectedWallpaperPresetId), + modifier = Modifier.fillMaxSize() + ) + } + } +} + +@Composable +fun PresetWallpaperBackground( + preset: ChatWallpaperPreset, + modifier: Modifier = Modifier +) { + Box( + modifier = modifier.background( + Brush.linearGradient(colors = preset.gradientColors) + ) + ) { + when (preset.accentStyle) { + ChatWallpaperAccentStyle.SoftCircles -> { + AccentCircle( + modifier = Modifier + .align(Alignment.TopEnd) + .offset(x = 36.dp, y = (-18).dp) + .size(132.dp), + color = preset.accentPrimary + ) + AccentCircle( + modifier = Modifier + .align(Alignment.BottomStart) + .offset(x = (-28).dp, y = 24.dp) + .size(156.dp), + color = preset.accentSecondary + ) + } + + ChatWallpaperAccentStyle.CornerGlow -> { + AccentCircle( + modifier = Modifier + .align(Alignment.TopStart) + .offset(x = (-40).dp, y = (-24).dp) + .size(150.dp), + color = preset.accentPrimary + ) + AccentCircle( + modifier = Modifier + .align(Alignment.CenterEnd) + .offset(x = 28.dp) + .size(124.dp), + color = preset.accentSecondary + ) + AccentCircle( + modifier = Modifier + .align(Alignment.BottomCenter) + .offset(y = 34.dp) + .size(108.dp), + color = preset.accentPrimary.copy(alpha = 0.45f) + ) + } + + ChatWallpaperAccentStyle.Ribbon -> { + AccentBand( + modifier = Modifier + .align(Alignment.TopStart) + .offset(x = (-18).dp, y = 22.dp) + .fillMaxWidth(0.9f) + .height(64.dp), + color = preset.accentPrimary + ) + AccentBand( + modifier = Modifier + .align(Alignment.BottomEnd) + .offset(x = 22.dp, y = (-14).dp) + .fillMaxWidth(0.76f) + .height(56.dp), + color = preset.accentSecondary + ) + } + } + } +} + +@Composable +private fun AccentCircle( + modifier: Modifier, + color: Color +) { + Box( + modifier = modifier.background(color = color, shape = CircleShape) + ) +} + +@Composable +private fun AccentBand( + modifier: Modifier, + color: Color +) { + Box( + modifier = modifier.background( + color = color, + shape = RoundedCornerShape(28.dp) + ) + ) +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/ui/IkarChrome.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/ui/IkarChrome.kt new file mode 100644 index 00000000..d310f5e4 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/ui/IkarChrome.kt @@ -0,0 +1,572 @@ +package com.seven.ikar.kotlin.ui + +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.BoxScope +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ColumnScope +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.RowScope +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.WindowInsetsSides +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.navigationBars +import androidx.compose.foundation.layout.only +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.layout.windowInsetsPadding +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.text.BasicTextField +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.ArrowBack +import androidx.compose.material.icons.outlined.ChatBubbleOutline +import androidx.compose.material.icons.outlined.PersonOutline +import androidx.compose.material.icons.outlined.Search +import androidx.compose.material.icons.outlined.Settings +import androidx.compose.material.icons.outlined.SupervisorAccount +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Switch +import androidx.compose.material3.SwitchDefaults +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.compositionLocalOf +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.Shape +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp +import com.seven.ikar.kotlin.ui.theme.TelegramBadgeBackground +import com.seven.ikar.kotlin.ui.theme.TelegramBadgeText +import com.seven.ikar.kotlin.ui.theme.TelegramBlue +import com.seven.ikar.kotlin.ui.theme.TelegramBluePanel +import com.seven.ikar.kotlin.ui.theme.TelegramBorder +import com.seven.ikar.kotlin.ui.theme.TelegramCardShadow +import com.seven.ikar.kotlin.ui.theme.TelegramFabShadow +import com.seven.ikar.kotlin.ui.theme.TelegramFloatingBorder +import com.seven.ikar.kotlin.ui.theme.TelegramFloatingSurface +import com.seven.ikar.kotlin.ui.theme.TelegramHeaderShadow +import com.seven.ikar.kotlin.ui.theme.TelegramInkMuted + +enum class IkarMainMenuTab { + Chats, + Contacts, + Settings, + Profile +} + +val LocalUnreadChatsCount = compositionLocalOf { 0 } + +@Composable +fun IkarScreenSurface( + modifier: Modifier = Modifier, + content: @Composable BoxScope.() -> Unit +) { + Box( + modifier = modifier + .background(MaterialTheme.colorScheme.background), + content = content + ) +} + +@Composable +fun IkarCenteredHeader( + title: String, + modifier: Modifier = Modifier, + left: @Composable (() -> Unit), + right: @Composable (() -> Unit) +) { + Row( + modifier = modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(12.dp) + ) { + Box(modifier = Modifier.width(44.dp), contentAlignment = Alignment.CenterStart) { + left() + } + Text( + text = title, + modifier = Modifier.weight(1f), + style = MaterialTheme.typography.displayLarge, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + Box(modifier = Modifier.width(44.dp), contentAlignment = Alignment.CenterEnd) { + right() + } + } +} + +@Composable +fun IkarSimpleHeader( + title: String, + modifier: Modifier = Modifier, + onBackClick: (() -> Unit)? = null, + rightContent: @Composable RowScope.() -> Unit = {} +) { + Row( + modifier = modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(12.dp) + ) { + if (onBackClick != null) { + IconButton(onClick = onBackClick, modifier = Modifier.size(24.dp)) { + Icon( + Icons.AutoMirrored.Outlined.ArrowBack, + contentDescription = "Назад", + tint = MaterialTheme.colorScheme.onBackground + ) + } + } + + Text( + text = title, + modifier = Modifier.weight(1f), + style = MaterialTheme.typography.headlineLarge, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + + Row(horizontalArrangement = Arrangement.spacedBy(12.dp), content = rightContent) + } +} + +@Composable +fun IkarHeaderIconBubble( + modifier: Modifier = Modifier, + onClick: (() -> Unit)? = null, + content: @Composable BoxScope.() -> Unit +) { + val shape = RoundedCornerShape(18.dp) + Surface( + modifier = modifier.then(if (onClick != null) Modifier.clickable(onClick = onClick) else Modifier), + shape = shape, + color = MaterialTheme.colorScheme.surface, + shadowElevation = 8.dp + ) { + Box( + modifier = Modifier + .size(40.dp) + .padding(10.dp), + contentAlignment = Alignment.Center, + content = content + ) + } +} + +@Composable +fun IkarSectionCard( + modifier: Modifier = Modifier, + padding: PaddingValues = PaddingValues(18.dp), + content: @Composable ColumnScope.() -> Unit +) { + Surface( + modifier = modifier, + color = MaterialTheme.colorScheme.surface, + shape = RoundedCornerShape(24.dp), + shadowElevation = 9.dp + ) { + Column( + modifier = Modifier.padding(padding), + verticalArrangement = Arrangement.spacedBy(0.dp), + content = content + ) + } +} + +@Composable +fun IkarPillCard( + modifier: Modifier = Modifier, + onClick: (() -> Unit)? = null, + contentPadding: PaddingValues = PaddingValues(horizontal = 14.dp, vertical = 12.dp), + content: @Composable ColumnScope.() -> Unit +) { + val clickableModifier = if (onClick != null) Modifier.clickable(onClick = onClick) else Modifier + Surface( + modifier = modifier.then(clickableModifier), + color = MaterialTheme.colorScheme.surface, + shape = RoundedCornerShape(20.dp), + shadowElevation = 6.dp + ) { + Column( + modifier = Modifier.padding(contentPadding), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(6.dp), + content = content + ) + } +} + +@Composable +fun IkarSearchCard( + value: String, + onValueChange: (String) -> Unit, + placeholder: String, + modifier: Modifier = Modifier +) { + val shape = RoundedCornerShape(20.dp) + BasicTextField( + value = value, + onValueChange = onValueChange, + modifier = modifier.fillMaxWidth(), + textStyle = MaterialTheme.typography.bodyLarge.copy(color = MaterialTheme.colorScheme.onSurface), + singleLine = true, + decorationBox = { innerTextField -> + Surface( + shape = shape, + color = MaterialTheme.colorScheme.surface, + tonalElevation = 0.dp, + shadowElevation = 0.dp + ) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 14.dp, vertical = 10.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(10.dp) + ) { + Icon( + Icons.Outlined.Search, + contentDescription = null, + tint = MaterialTheme.colorScheme.onSurfaceVariant, + modifier = Modifier.size(18.dp) + ) + Box(modifier = Modifier.weight(1f), contentAlignment = Alignment.CenterStart) { + if (value.isBlank()) { + Text( + placeholder, + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + } + innerTextField() + } + } + } + } + ) +} + +@Composable +fun IkarBlueNotice( + title: String, + subtitle: String, + modifier: Modifier = Modifier, + trailing: (@Composable () -> Unit)? = null +) { + Surface( + modifier = modifier.fillMaxWidth(), + color = TelegramBluePanel, + shape = RoundedCornerShape(18.dp), + shadowElevation = 0.dp + ) { + Row( + modifier = Modifier.padding(14.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(10.dp) + ) { + Column(modifier = Modifier.weight(1f), verticalArrangement = Arrangement.spacedBy(3.dp)) { + Text(title, style = MaterialTheme.typography.titleMedium, color = TelegramBlue) + Text(subtitle, style = MaterialTheme.typography.bodySmall, color = TelegramInkMuted) + } + trailing?.invoke() + } + } +} + +@Composable +fun IkarRowDivider(startIndent: Dp = 54.dp) { + Spacer( + modifier = Modifier + .fillMaxWidth() + .padding(start = startIndent) + .height(1.dp) + .background(TelegramBorder) + ) +} + +@Composable +fun IkarSectionTitle(text: String, modifier: Modifier = Modifier) { + Text( + text = text, + modifier = modifier, + style = MaterialTheme.typography.labelLarge, + color = MaterialTheme.colorScheme.primary + ) +} + +@Composable +fun IkarSettingRow( + title: String, + subtitle: String, + modifier: Modifier = Modifier, + onClick: (() -> Unit)? = null, + leading: @Composable BoxScope.() -> Unit, + trailing: @Composable (() -> Unit)? = null +) { + val clickableModifier = if (onClick != null) Modifier.clickable(onClick = onClick) else Modifier + Row( + modifier = modifier + .fillMaxWidth() + .then(clickableModifier) + .padding(vertical = 14.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(14.dp) + ) { + Box( + modifier = Modifier + .size(40.dp) + .clip(CircleShape), + contentAlignment = Alignment.Center, + content = leading + ) + Column(modifier = Modifier.weight(1f), verticalArrangement = Arrangement.spacedBy(2.dp)) { + Text(title, style = MaterialTheme.typography.titleLarge) + Text(subtitle, style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant) + } + trailing?.invoke() + } +} + +@Composable +fun IkarToggleRow( + title: String, + subtitle: String, + checked: Boolean, + onCheckedChange: (Boolean) -> Unit, + modifier: Modifier = Modifier, + enabled: Boolean = true, + leading: (@Composable BoxScope.() -> Unit)? = null +) { + Row( + modifier = modifier + .fillMaxWidth() + .padding(vertical = 14.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(12.dp) + ) { + if (leading != null) { + Box( + modifier = Modifier + .size(24.dp), + contentAlignment = Alignment.Center, + content = leading + ) + } + Column(modifier = Modifier.weight(1f), verticalArrangement = Arrangement.spacedBy(2.dp)) { + Text(title, style = MaterialTheme.typography.titleLarge) + Text(subtitle, style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant) + } + Switch( + checked = checked, + onCheckedChange = onCheckedChange, + enabled = enabled, + colors = SwitchDefaults.colors( + checkedThumbColor = MaterialTheme.colorScheme.primary, + checkedTrackColor = MaterialTheme.colorScheme.primary.copy(alpha = 0.52f), + checkedBorderColor = MaterialTheme.colorScheme.primary.copy(alpha = 0.52f), + uncheckedThumbColor = Color.White, + uncheckedTrackColor = Color(0xFFDDE2E6), + uncheckedBorderColor = Color(0xFFDDE2E6), + disabledCheckedThumbColor = MaterialTheme.colorScheme.primary.copy(alpha = 0.55f), + disabledCheckedTrackColor = MaterialTheme.colorScheme.primary.copy(alpha = 0.32f), + disabledUncheckedThumbColor = Color.White.copy(alpha = 0.85f), + disabledUncheckedTrackColor = Color(0xFFE9ECEF) + ) + ) + } +} + +@Composable +fun IkarValueRow( + title: String, + subtitle: String, + value: String, + modifier: Modifier = Modifier, + enabled: Boolean = true, + onClick: (() -> Unit)? = null, + leading: (@Composable BoxScope.() -> Unit)? = null +) { + val clickableModifier = if (enabled && onClick != null) Modifier.clickable(onClick = onClick) else Modifier + Row( + modifier = modifier + .fillMaxWidth() + .then(clickableModifier) + .padding(vertical = 14.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(12.dp) + ) { + if (leading != null) { + Box(modifier = Modifier.size(24.dp), contentAlignment = Alignment.Center, content = leading) + } + Column(modifier = Modifier.weight(1f), verticalArrangement = Arrangement.spacedBy(2.dp)) { + Text(title, style = MaterialTheme.typography.titleLarge) + Text(subtitle, style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant) + } + Text( + value, + style = MaterialTheme.typography.titleMedium, + color = if (enabled) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.onSurfaceVariant, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + } +} + +@Composable +fun IkarRoundedTag( + text: String, + modifier: Modifier = Modifier, + backgroundColor: Color = TelegramBadgeBackground, + textColor: Color = TelegramBadgeText +) { + Surface( + modifier = modifier, + color = backgroundColor, + shape = RoundedCornerShape(10.dp), + shadowElevation = 0.dp + ) { + Text( + text = text, + modifier = Modifier.padding(horizontal = 8.dp, vertical = 3.dp), + style = MaterialTheme.typography.labelMedium, + color = textColor + ) + } +} + +@Composable +fun IkarFab( + icon: ImageVector, + contentDescription: String, + modifier: Modifier = Modifier, + onClick: () -> Unit +) { + Surface( + modifier = modifier + .size(60.dp) + .clickable(onClick = onClick), + color = MaterialTheme.colorScheme.primary, + shape = RoundedCornerShape(30.dp), + shadowElevation = 12.dp + ) { + Box(contentAlignment = Alignment.Center) { + Icon(icon, contentDescription = contentDescription, tint = Color.White, modifier = Modifier.size(24.dp)) + } + } +} + +@Composable +fun IkarFloatingMainMenu( + selectedTab: IkarMainMenuTab, + modifier: Modifier = Modifier, + onChatsClick: () -> Unit, + onContactsClick: () -> Unit, + onSettingsClick: () -> Unit, + onProfileClick: () -> Unit +) { + Surface( + modifier = modifier.windowInsetsPadding(WindowInsets.navigationBars.only(WindowInsetsSides.Bottom)), + color = TelegramFloatingSurface, + shape = RoundedCornerShape(32.dp), + shadowElevation = 10.dp + ) { + Row( + modifier = Modifier + .border(1.dp, TelegramFloatingBorder, RoundedCornerShape(32.dp)) + .padding(horizontal = 12.dp, vertical = 10.dp), + horizontalArrangement = Arrangement.spacedBy(6.dp) + ) { + val unreadChatsCount = LocalUnreadChatsCount.current + IkarFloatingMenuItem( + icon = Icons.Outlined.ChatBubbleOutline, + label = "Чаты", + selected = selectedTab == IkarMainMenuTab.Chats, + badgeCount = unreadChatsCount, + onClick = onChatsClick + ) + IkarFloatingMenuItem( + icon = Icons.Outlined.SupervisorAccount, + label = "Контакты", + selected = selectedTab == IkarMainMenuTab.Contacts, + onClick = onContactsClick + ) + IkarFloatingMenuItem( + icon = Icons.Outlined.Settings, + label = "Настройки", + selected = selectedTab == IkarMainMenuTab.Settings, + onClick = onSettingsClick + ) + IkarFloatingMenuItem( + icon = Icons.Outlined.PersonOutline, + label = "Профиль", + selected = selectedTab == IkarMainMenuTab.Profile, + onClick = onProfileClick + ) + } + } +} + +@Composable +private fun IkarFloatingMenuItem( + icon: ImageVector, + label: String, + selected: Boolean, + badgeCount: Int = 0, + onClick: () -> Unit +) { + val shape = RoundedCornerShape(22.dp) + val backgroundColor = if (selected) MaterialTheme.colorScheme.primary.copy(alpha = 0.12f) else Color.Transparent + val tint = if (selected) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.onSurfaceVariant + Column( + modifier = Modifier + .clip(shape) + .clickable(onClick = onClick) + .background(backgroundColor) + .padding(horizontal = 10.dp, vertical = 8.dp), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(4.dp) + ) { + Box( + modifier = Modifier.size(28.dp), + contentAlignment = Alignment.Center + ) { + Icon(icon, contentDescription = label, tint = tint, modifier = Modifier.size(22.dp)) + if (badgeCount > 0) { + Box( + modifier = Modifier + .align(Alignment.TopEnd) + .background(TelegramBadgeBackground, CircleShape) + .border(1.dp, TelegramFloatingSurface, CircleShape) + .padding(horizontal = 4.dp, vertical = 1.dp), + contentAlignment = Alignment.Center + ) { + Text( + text = if (badgeCount > 99) "99+" else badgeCount.toString(), + style = MaterialTheme.typography.labelSmall, + color = TelegramBadgeText, + maxLines = 1 + ) + } + } + } + Text(label, style = MaterialTheme.typography.labelSmall, color = tint) + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/ui/IkarFormatters.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/ui/IkarFormatters.kt new file mode 100644 index 00000000..4bf5e667 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/ui/IkarFormatters.kt @@ -0,0 +1,146 @@ +package com.seven.ikar.kotlin.ui + +import androidx.compose.ui.graphics.Color +import com.seven.ikar.kotlin.core.contacts.DiscoverUserItem +import com.seven.ikar.kotlin.core.model.ChatSummaryDto +import com.seven.ikar.kotlin.core.model.ChatType +import com.seven.ikar.kotlin.core.model.UserSummaryDto +import com.seven.ikar.kotlin.ui.theme.TelegramBlue +import com.seven.ikar.kotlin.ui.theme.TelegramInkMuted +import java.time.OffsetDateTime +import java.time.ZoneId +import java.time.format.DateTimeFormatter +import java.util.Locale +import kotlin.math.abs + +private val AvatarPalette = listOf( + Color(0xFF5AA7F0), + Color(0xFF47BFD8), + Color(0xFF4F83F1), + Color(0xFF60C689), + Color(0xFFD488F5), + Color(0xFFF2A45A), + Color(0xFFF06C8E), + Color(0xFF7E8A98) +) + +private val TimeFormatter = DateTimeFormatter.ofPattern("HH:mm", Locale("ru", "RU")) +private val DayMonthFormatter = DateTimeFormatter.ofPattern("d MMM", Locale("ru", "RU")) +private val DayMonthYearFormatter = DateTimeFormatter.ofPattern("d MMM yyyy", Locale("ru", "RU")) + +fun ikarAvatarInitials(value: String?): String { + if (value.isNullOrBlank()) { + return "M" + } + + val parts = value + .split(' ', '-', '_') + .map { it.trim() } + .filter { it.isNotEmpty() } + .take(2) + .map { it.first().uppercaseChar() } + + return if (parts.isEmpty()) "M" else parts.joinToString("") +} + +fun ikarAvatarColor(value: String?): Color { + if (value.isNullOrBlank()) { + return AvatarPalette.first() + } + + var hash = 17 + value.trim().forEach { symbol -> + hash = (hash * 31) + symbol.uppercaseChar().code + } + + if (hash == Int.MIN_VALUE) { + hash = Int.MAX_VALUE + } + + return AvatarPalette[abs(hash) % AvatarPalette.size] +} + +fun formatPresence(user: UserSummaryDto): String { + if (user.isBot) { + return "бот" + } + if (user.isOnline) { + return "в сети" + } + + val lastSeen = parseOffsetDateTime(user.lastSeenAt) ?: return "был давно" + val now = OffsetDateTime.now() + val delta = java.time.Duration.between(lastSeen, now) + + return when { + delta < java.time.Duration.ofDays(7) -> "был недавно" + else -> "был давно" + } +} + +fun formatDiscoverPresence(item: DiscoverUserItem): String = when { + item.user.isBot -> "бот · @${item.username}" + item.secondaryLine.isNotBlank() -> item.secondaryLine + else -> formatPresence(item.user) +} + +fun formatPresenceColor(item: DiscoverUserItem): Color = when { + item.user.isOnline -> TelegramBlue + else -> TelegramInkMuted +} + +fun chatSubtitle(chat: ChatSummaryDto): String = if (!chat.secondaryText.isNullOrBlank()) { + chat.secondaryText +} else { + when (chat.type) { + ChatType.Direct -> "личный чат" + ChatType.Group -> "группа" + ChatType.Channel -> if (chat.canSendMessages) "канал" else "канал только для чтения" + } +} + +fun chatPreview(chat: ChatSummaryDto): String = if (!chat.lastMessagePreview.isNullOrBlank()) { + chat.lastMessagePreview.stripSenderPrefix() +} else { + when (chat.type) { + ChatType.Channel -> "Пока нет публикаций" + else -> "Пока нет сообщений" + } +} + +private fun String.stripSenderPrefix(): String { + val delimiter = ": " + val delimiterIndex = indexOf(delimiter) + if (delimiterIndex <= 0) { + return this + } + + val previewWithoutSender = substring(delimiterIndex + delimiter.length) + return previewWithoutSender.ifBlank { this } +} + +fun chatTypeLabel(chatType: ChatType): String = when (chatType) { + ChatType.Direct -> "ЛИЧНЫЙ" + ChatType.Group -> "ГРУППА" + ChatType.Channel -> "КАНАЛ" +} + +fun formatLastActivity(lastActivityAt: String?): String { + val value = parseOffsetDateTime(lastActivityAt) ?: return "" + val now = OffsetDateTime.now() + return when { + value.toLocalDate() == now.toLocalDate() -> value.format(TimeFormatter) + value.toLocalDate() == now.minusDays(1).toLocalDate() -> "Вчера" + value.year == now.year -> value.format(DayMonthFormatter) + else -> value.format(DayMonthYearFormatter) + } +} + +private fun parseOffsetDateTime(value: String?): OffsetDateTime? = + value?.takeIf { it.isNotBlank() }?.let { + runCatching { + OffsetDateTime.parse(it) + .atZoneSameInstant(ZoneId.systemDefault()) + .toOffsetDateTime() + }.getOrNull() + } diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/ui/SecureWindowEffect.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/ui/SecureWindowEffect.kt new file mode 100644 index 00000000..736db923 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/ui/SecureWindowEffect.kt @@ -0,0 +1,60 @@ +package com.seven.ikar.kotlin.ui + +import android.app.Activity +import android.content.Context +import android.content.ContextWrapper +import android.view.Window +import android.view.WindowManager +import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.remember +import androidx.compose.ui.platform.LocalView +import java.util.UUID + +object SecureWindowFlagController { + private val activeTokensByWindow = mutableMapOf<Int, MutableSet<String>>() + + fun setSecure(window: Window, token: String, enabled: Boolean) { + synchronized(activeTokensByWindow) { + val key = System.identityHashCode(window) + val tokens = activeTokensByWindow.getOrPut(key) { mutableSetOf() } + if (enabled) { + tokens += token + } else { + tokens -= token + } + + if (tokens.isEmpty()) { + activeTokensByWindow -= key + window.clearFlags(WindowManager.LayoutParams.FLAG_SECURE) + } else { + window.addFlags(WindowManager.LayoutParams.FLAG_SECURE) + } + } + } +} + +@Composable +fun SecureWindowEffect(enabled: Boolean) { + val view = LocalView.current + val token = remember { UUID.randomUUID().toString() } + + DisposableEffect(view, enabled, token) { + val window = view.context.findActivity()?.window + if (window != null) { + SecureWindowFlagController.setSecure(window, token, enabled) + } + + onDispose { + if (window != null) { + SecureWindowFlagController.setSecure(window, token, false) + } + } + } +} + +private tailrec fun Context.findActivity(): Activity? = when (this) { + is Activity -> this + is ContextWrapper -> baseContext.findActivity() + else -> null +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/ui/SettingsRow.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/ui/SettingsRow.kt new file mode 100644 index 00000000..f2161cfc --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/ui/SettingsRow.kt @@ -0,0 +1,48 @@ +package com.seven.ikar.kotlin.ui + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.KeyboardArrowRight +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.unit.dp + +@Composable +fun SettingsRow( + title: String, + subtitle: String? = null, + icon: ImageVector, + onClick: () -> Unit +) { + Row( + modifier = Modifier + .fillMaxWidth() + .clickable(onClick = onClick) + .padding(horizontal = 16.dp, vertical = 14.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(16.dp) + ) { + Icon(icon, contentDescription = null, tint = MaterialTheme.colorScheme.primary) + Column(modifier = Modifier.weight(1f), verticalArrangement = Arrangement.spacedBy(2.dp)) { + Text(title, style = MaterialTheme.typography.titleMedium) + if (!subtitle.isNullOrBlank()) { + Text( + subtitle, + style = MaterialTheme.typography.bodySmall, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + } + } + Icon(Icons.AutoMirrored.Outlined.KeyboardArrowRight, contentDescription = null) + } +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/ui/theme/Theme.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/ui/theme/Theme.kt new file mode 100644 index 00000000..07520e68 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/ui/theme/Theme.kt @@ -0,0 +1,135 @@ +package com.seven.ikar.kotlin.ui.theme + +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Typography +import androidx.compose.material3.darkColorScheme +import androidx.compose.material3.lightColorScheme +import androidx.compose.runtime.Composable +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.Font +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.sp +import com.seven.ikar.kotlin.R +import com.seven.ikar.kotlin.core.settings.AppSettingsSnapshot +import com.seven.ikar.kotlin.core.settings.AppThemeMode +import java.time.LocalTime + +val TelegramBlue = Color(0xFF229AF0) +val TelegramBubbleBlue = Color(0xFF2D7ED5) +val TelegramBlueStrong = Color(0xFF1A9CEF) +val TelegramBlueSoft = Color(0xFF53A6F3) +val TelegramBluePressed = Color(0xFF368DE8) +val TelegramSurface = Color(0xFFFFFFFF) +val TelegramSurfaceSoft = Color(0xFFF6F8FB) +val TelegramSurfaceMuted = Color(0xFFF0F0F0) +val TelegramBorder = Color(0xFFE6E6E6) +val TelegramInk = Color(0xFF333333) +val TelegramInkMuted = Color(0xFF808384) +val TelegramDanger = Color(0xFFD9534F) +val TelegramSuccess = Color(0xFF29A8E7) +val TelegramBackground = Color(0xFFF5F6F8) +val TelegramFabShadow = Color(0x26229AF0) +val TelegramCardShadow = Color(0x1F29384A) +val TelegramHeaderShadow = Color(0x1A000000) +val TelegramFloatingSurface = Color(0xFFF7FAFE) +val TelegramFloatingBorder = Color(0xFFDCE7F2) +val TelegramSelectionBackground = Color(0xFFEAF4FF) +val TelegramSearchBackground = Color(0xFFFFFFFF) +val TelegramBadgeBackground = Color(0xFFDDE4EC) +val TelegramBadgeText = Color(0xFF6D7782) +val TelegramBluePanel = Color(0xFFEDF6FF) + +private val OpenSans = FontFamily( + Font(R.font.opensans_regular, FontWeight.Normal), + Font(R.font.opensans_semibold, FontWeight.SemiBold), + Font(R.font.opensans_semibold, FontWeight.Bold) +) + +private val IkarTypography = Typography( + displayLarge = TextStyle(fontFamily = OpenSans, fontWeight = FontWeight.SemiBold, fontSize = 28.sp, lineHeight = 34.sp), + displayMedium = TextStyle(fontFamily = OpenSans, fontWeight = FontWeight.SemiBold, fontSize = 24.sp, lineHeight = 30.sp), + headlineLarge = TextStyle(fontFamily = OpenSans, fontWeight = FontWeight.SemiBold, fontSize = 20.sp, lineHeight = 24.sp), + headlineMedium = TextStyle(fontFamily = OpenSans, fontWeight = FontWeight.SemiBold, fontSize = 18.sp, lineHeight = 23.sp), + titleLarge = TextStyle(fontFamily = OpenSans, fontWeight = FontWeight.SemiBold, fontSize = 17.sp, lineHeight = 22.sp), + titleMedium = TextStyle(fontFamily = OpenSans, fontWeight = FontWeight.SemiBold, fontSize = 15.sp, lineHeight = 20.sp), + bodyLarge = TextStyle(fontFamily = OpenSans, fontWeight = FontWeight.Normal, fontSize = 15.sp, lineHeight = 20.sp), + bodyMedium = TextStyle(fontFamily = OpenSans, fontWeight = FontWeight.Normal, fontSize = 14.sp, lineHeight = 19.sp), + bodySmall = TextStyle(fontFamily = OpenSans, fontWeight = FontWeight.Normal, fontSize = 13.sp, lineHeight = 17.sp), + labelLarge = TextStyle(fontFamily = OpenSans, fontWeight = FontWeight.SemiBold, fontSize = 13.sp, lineHeight = 17.sp), + labelMedium = TextStyle(fontFamily = OpenSans, fontWeight = FontWeight.SemiBold, fontSize = 12.sp, lineHeight = 15.sp), + labelSmall = TextStyle(fontFamily = OpenSans, fontWeight = FontWeight.SemiBold, fontSize = 11.sp, lineHeight = 14.sp) +) + +private val LightColors = lightColorScheme( + primary = TelegramBlue, + secondary = TelegramBlueSoft, + tertiary = TelegramBubbleBlue, + background = TelegramBackground, + surface = TelegramSurface, + onPrimary = Color.White, + onSecondary = Color.White, + onTertiary = Color.White, + onBackground = TelegramInk, + onSurface = TelegramInk, + onSurfaceVariant = TelegramInkMuted, + error = TelegramDanger +) + +@Composable +fun IkarKotlinTheme( + settings: AppSettingsSnapshot = AppSettingsSnapshot(), + content: @Composable () -> Unit +) { + val systemDark = isSystemInDarkTheme() + val darkTheme = resolveDarkTheme(settings.themeMode, systemDark) + val accent = resolveAccentColor(settings.accentColorName) + val colorScheme = if (darkTheme) { + darkColorScheme( + primary = accent, + secondary = accent.copy(alpha = 0.82f), + tertiary = TelegramBubbleBlue, + background = Color(0xFF121820), + surface = Color(0xFF1C2530), + surfaceVariant = Color(0xFF253241), + onPrimary = Color.White, + onSecondary = Color.White, + onTertiary = Color.White, + onBackground = Color(0xFFEAF1F8), + onSurface = Color(0xFFEAF1F8), + onSurfaceVariant = Color(0xFFAAB7C4), + error = Color(0xFFFF8A80) + ) + } else { + LightColors.copy( + primary = accent, + secondary = accent.copy(alpha = 0.82f), + tertiary = if (settings.accentColorName == "Telegram Blue") TelegramBubbleBlue else accent + ) + } + + MaterialTheme( + colorScheme = colorScheme, + typography = IkarTypography, + content = content + ) +} + +fun resolveDarkTheme(mode: AppThemeMode, systemDark: Boolean): Boolean = when (mode) { + AppThemeMode.System -> systemDark + AppThemeMode.Light -> false + AppThemeMode.Dark -> true + AppThemeMode.Auto -> { + val hour = LocalTime.now().hour + hour >= 22 || hour < 7 + } +} + +fun resolveAccentColor(name: String): Color = when (name) { + "Mint" -> Color(0xFF1FAE8A) + "Graphite" -> Color(0xFF5B6B7C) + "Amber" -> Color(0xFFF0A526) + else -> TelegramBlue +} diff --git a/src/Ikar.AndroidKotlin/app/src/main/res/drawable-nodpi/appicon.png b/src/Ikar.AndroidKotlin/app/src/main/res/drawable-nodpi/appicon.png new file mode 100644 index 0000000000000000000000000000000000000000..9a98dae8dae24c1c033b58b856900a8aab5f55d2 GIT binary patch literal 327346 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�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 literal 0 HcmV?d00001 diff --git a/src/Ikar.AndroidKotlin/app/src/main/res/drawable-nodpi/dotnet_bot.png b/src/Ikar.AndroidKotlin/app/src/main/res/drawable-nodpi/dotnet_bot.png new file mode 100644 index 0000000000000000000000000000000000000000..054167e59747d8174d8f31cd0e92e169c55e2206 GIT binary patch literal 92532 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 L^wq0WQQ`jseOuUX literal 0 HcmV?d00001 diff --git a/src/Ikar.AndroidKotlin/app/src/main/res/drawable-nodpi/ikar_logo.png b/src/Ikar.AndroidKotlin/app/src/main/res/drawable-nodpi/ikar_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..9832247a0ca4a2225f16e6ca0664443339419bcf GIT binary patch literal 197973 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%0DsTd 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�^Sty)m+<U| zt&!F6(FyqTs_+G!NzgoI4zk3s=#~99c6a#e&tLxNrJ40_XxC>S)2dX*I>ulU?*>yW zu9ws6bV+=BFvehw9;z~)wU}7g&2!H_kyo6vX8RU+RTVxKM*49(2=~KgGJK2y(Q$vs zsu*$l_tm#TI_0!ul%EF-3yX22=K<k+<+!85V+_{UU_AvKVm*(_^00<n41&GUmk|-& zlj<8#kr7?I!+1llFz=n`ImRDjH_Y&hAw;EAuySEX-3OE_Wsneq3c6eo;XeK?W7vBE zqr&ei9Buj`-$9Y(MulHfn7(mG>y_8svFnc*TV2a5bzNf>NYcoX)mqgq(VB8V|NHt} zw^TVjnTP(&N#YHv@FVG<goE-em@HySV+?9!eJGsMQMVK)rFi#)i9XZE{km~}lRe<4 zqJ5p3gj_Oj0pk@ikYyQ3lK3e|uW$=q5zqE|7BGI4TquNaFGlyW<{1?c+VgujWBoXf zI&U-6hJUZYTNAk6s$(^^g!dgICx*7sQSlt`y=}rLzj3v_=C0ijS&`&5q!SO7YHc;O z#w<xC?Fk0&WJBp#;&*3s3Nv)Bto6z?)JMce#*sKM?In`Mz1?R#{PbI2`J_{Sc`bZx z+>e-3yv4jvK1}-uZ(hMtIrD3@Z~o6~KXT=P?oV|a(@8t2fweemaEW#l^}K4qnZ7$s z@%c}}8OkDkrR-<s!ttL)$DKrHSrTYVi^)w>%*@njv==zTwfN1mPUH-D_XJ#4(a8pK zgbc$$;OZqdz4lK(eA&UN&97|LXH1UwVGY!KP141koUyvjZ@ln{oIZ<8!<#1Heb%uv zEjqQ@*4n-!wFCInEsOlyH?MwHYi8~5HR}@(?$}z@rB!loHJ%zvo@He1o{siST9he8 zsFE?$oMUTe50}08Qcj0ITn+C`kR@$9D!ha5xwt+<I}SLU%z7Xr<hh*pz~kXrxQ?I2 zVFB^8fN~nc;shM-dH7a5z>M=WEdS0ql{tq&tWTjohzUlW#yOp!3QAd-qCWx_@!jdD z(Z=`XOqMe{48!7v>oW6EV!&a<E~inBQ~p-K(L8&gK_u*vRH5AhR)qA9{qCh#-gMWW zOJinC(z?k=iv7xXT7*%YG3vk}q}OLS&sav+Z^LwST;C8`Ux(+#y?^dgFX|#Xb6F$k zs6x#h{Q8Qux`r+KeMNuPg@`v)F<ZiDIroY)R>}js;LB``Kg%@Fd^-A-ct5a1$i+8A zqtlU2GE�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 W4fy^uhR1jS0000<MNUMnLSTZ0{Tq+~ literal 0 HcmV?d00001 diff --git a/src/Ikar.AndroidKotlin/app/src/main/res/drawable/ic_notification_transfer.xml b/src/Ikar.AndroidKotlin/app/src/main/res/drawable/ic_notification_transfer.xml new file mode 100644 index 00000000..ffabcb8f --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/res/drawable/ic_notification_transfer.xml @@ -0,0 +1,9 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M5,20h14v-2H5v2zM19,9h-4V3H9v6H5l7,7l7,-7z" /> +</vector> diff --git a/src/Ikar.AndroidKotlin/app/src/main/res/font/opensans_regular.ttf b/src/Ikar.AndroidKotlin/app/src/main/res/font/opensans_regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..2cc82d2ed0137dafa2869af5828b452de49a6aa3 GIT binary patch literal 107280 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 literal 0 HcmV?d00001 diff --git a/src/Ikar.AndroidKotlin/app/src/main/res/font/opensans_semibold.ttf b/src/Ikar.AndroidKotlin/app/src/main/res/font/opensans_semibold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..fcb528467a826ac6c6ef4f718044a45e81ce849d GIT binary patch literal 111204 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 sjk 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 literal 0 HcmV?d00001 diff --git a/src/Ikar.AndroidKotlin/app/src/main/res/values/firebase.xml b/src/Ikar.AndroidKotlin/app/src/main/res/values/firebase.xml new file mode 100644 index 00000000..ff838c65 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/res/values/firebase.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="google_app_id">1:91097833269:android:c123132a32a690ba19b67c</string> + <string name="google_api_key">AIzaSyCgjHUi4zFNRfwAwsiLBlRZCGup78N74ks</string> + <string name="gcm_defaultSenderId">91097833269</string> + <string name="project_id">ikar-3bdfb</string> + <string name="google_storage_bucket">ikar-3bdfb.firebasestorage.app</string> +</resources> diff --git a/src/Ikar.AndroidKotlin/app/src/main/res/xml/file_provider_paths.xml b/src/Ikar.AndroidKotlin/app/src/main/res/xml/file_provider_paths.xml new file mode 100644 index 00000000..da529451 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/main/res/xml/file_provider_paths.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8"?> +<paths xmlns:android="http://schemas.android.com/apk/res/android"> + <cache-path + name="cache" + path="." /> +</paths> diff --git a/src/Ikar.AndroidKotlin/build.gradle.kts b/src/Ikar.AndroidKotlin/build.gradle.kts new file mode 100644 index 00000000..2994f926 --- /dev/null +++ b/src/Ikar.AndroidKotlin/build.gradle.kts @@ -0,0 +1,6 @@ +plugins { + id("com.android.application") version "9.1.0" apply false + id("com.google.devtools.ksp") version "2.3.6" apply false + id("org.jetbrains.kotlin.plugin.compose") version "2.3.10" apply false + id("org.jetbrains.kotlin.plugin.serialization") version "2.3.10" apply false +} diff --git a/src/Ikar.AndroidKotlin/gradle.properties b/src/Ikar.AndroidKotlin/gradle.properties new file mode 100644 index 00000000..9a848c2c --- /dev/null +++ b/src/Ikar.AndroidKotlin/gradle.properties @@ -0,0 +1,5 @@ +org.gradle.jvmargs=-Xmx4g -Dfile.encoding=UTF-8 +org.gradle.java.installations.paths=C:\\Program Files\\Android\\Android Studio\\jbr +android.useAndroidX=true +android.nonTransitiveRClass=true +kotlin.code.style=official diff --git a/src/Ikar.AndroidKotlin/gradle/wrapper/gradle-wrapper.jar b/src/Ikar.AndroidKotlin/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..61285a659d17295f1de7c53e24fdf13ad755c379 GIT binary patch literal 46175 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 literal 0 HcmV?d00001 diff --git a/src/Ikar.AndroidKotlin/gradle/wrapper/gradle-wrapper.properties b/src/Ikar.AndroidKotlin/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..37f78a6a --- /dev/null +++ b/src/Ikar.AndroidKotlin/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/src/Ikar.AndroidKotlin/gradlew b/src/Ikar.AndroidKotlin/gradlew new file mode 100644 index 00000000..adff685a --- /dev/null +++ b/src/Ikar.AndroidKotlin/gradlew @@ -0,0 +1,248 @@ +#!/bin/sh + +# +# Copyright © 2015 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/src/Ikar.AndroidKotlin/gradlew.bat b/src/Ikar.AndroidKotlin/gradlew.bat new file mode 100644 index 00000000..c4bdd3ab --- /dev/null +++ b/src/Ikar.AndroidKotlin/gradlew.bat @@ -0,0 +1,93 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/src/Ikar.AndroidKotlin/scripts/new-argus-upload-keystore.ps1 b/src/Ikar.AndroidKotlin/scripts/new-argus-upload-keystore.ps1 new file mode 100644 index 00000000..bf31ff29 --- /dev/null +++ b/src/Ikar.AndroidKotlin/scripts/new-argus-upload-keystore.ps1 @@ -0,0 +1,89 @@ +param( + [string]$KeystorePath = 'signing/argus-upload.jks', + [string]$PropertiesPath = 'argus-signing.local.properties', + [string]$KeyAlias = 'argus-upload', + [switch]$Force +) + +$ErrorActionPreference = 'Stop' + +function New-Secret { + $value = ((1..3 | ForEach-Object { [Guid]::NewGuid().ToString('N') }) -join '') + return $value.Substring(0, 32) +} + +$repoRoot = Split-Path -Parent $PSScriptRoot +$resolvedKeystorePath = if ([System.IO.Path]::IsPathRooted($KeystorePath)) { + $KeystorePath +} else { + Join-Path $repoRoot $KeystorePath +} +$resolvedPropertiesPath = if ([System.IO.Path]::IsPathRooted($PropertiesPath)) { + $PropertiesPath +} else { + Join-Path $repoRoot $PropertiesPath +} + +if ((Test-Path $resolvedKeystorePath) -and (Test-Path $resolvedPropertiesPath) -and -not $Force) { + Write-Output "Keystore or properties already exist." + Write-Output "Keystore: $resolvedKeystorePath" + Write-Output "Properties: $resolvedPropertiesPath" + exit 0 +} + +if (((Test-Path $resolvedKeystorePath) -xor (Test-Path $resolvedPropertiesPath)) -and -not $Force) { + throw 'Keystore and properties are in a partial state. Use -Force to recreate the pair.' +} + +$keystoreDirectory = Split-Path -Parent $resolvedKeystorePath +if (-not (Test-Path $keystoreDirectory)) { + New-Item -ItemType Directory -Path $keystoreDirectory | Out-Null +} + +$storePassword = New-Secret +$keyPassword = $storePassword +$javaHome = if ($env:JAVA_HOME) { $env:JAVA_HOME } else { 'C:\Program Files\Android\openjdk\jdk-21.0.8' } +$keytoolPath = Join-Path $javaHome 'bin\keytool.exe' + +if (-not (Test-Path $keytoolPath)) { + throw "keytool.exe was not found: $keytoolPath" +} + +if (Test-Path $resolvedKeystorePath) { + Remove-Item $resolvedKeystorePath -Force +} + +& $keytoolPath ` + -genkeypair ` + -keystore $resolvedKeystorePath ` + -storetype PKCS12 ` + -storepass $storePassword ` + -keypass $keyPassword ` + -alias $KeyAlias ` + -keyalg RSA ` + -keysize 4096 ` + -validity 10000 ` + -dname 'CN=Ikar Argus Upload, O=Ikar, C=RU' | Out-Null + +if ($LASTEXITCODE -ne 0) { + throw "keytool failed with exit code $LASTEXITCODE." +} + +Push-Location $repoRoot +try { + $relativeKeystorePath = (Resolve-Path -LiteralPath $resolvedKeystorePath -Relative).Replace('\', '/') +} finally { + Pop-Location +} +$propertiesContent = @( + "storeFile=$relativeKeystorePath" + "storePassword=$storePassword" + "keyAlias=$KeyAlias" + "keyPassword=$keyPassword" +) -join [Environment]::NewLine + +[System.IO.File]::WriteAllText($resolvedPropertiesPath, $propertiesContent, [System.Text.Encoding]::ASCII) + +Write-Output "Created Argus upload keystore." +Write-Output "Keystore: $resolvedKeystorePath" +Write-Output "Properties: $resolvedPropertiesPath" diff --git a/src/Ikar.AndroidKotlin/scripts/prepare-argus-publication.ps1 b/src/Ikar.AndroidKotlin/scripts/prepare-argus-publication.ps1 new file mode 100644 index 00000000..b820a608 --- /dev/null +++ b/src/Ikar.AndroidKotlin/scripts/prepare-argus-publication.ps1 @@ -0,0 +1,189 @@ +param( + [string]$Slug = 'ikar-android', + [string]$Name, + [string]$Summary = 'Standalone Android client for Ikar on Kotlin and Jetpack Compose.', + [string]$Description = 'Standalone Android client on Kotlin and Jetpack Compose, prepared as a staged replacement for the current MAUI client.', + [string]$Version, + [string]$Channel = 'stable', + [string]$Platform = 'android', + [string]$Notes, + [string]$RepositoryUrl = 'https://git.kusoft.xyz/sevenhill/Massenger.git', + [string]$HomepageUrl = 'https://ikar.kusoft.xyz', + [switch]$Unlisted, + [switch]$SkipSigningInitialization +) + +$ErrorActionPreference = 'Stop' + +function Require-Tool([string]$Path, [string]$Label) { + if (-not (Test-Path $Path)) { + throw "$Label was not found: $Path" + } +} + +function Get-ApkBadgingValue([string]$BadgingText, [string]$Pattern) { + $match = [regex]::Match($BadgingText, $Pattern, [System.Text.RegularExpressions.RegexOptions]::Multiline) + if (-not $match.Success) { + return $null + } + return $match.Groups[1].Value +} + +function Resolve-ArgusPlatform([string[]]$NativeCodes) { + $normalized = $NativeCodes | Where-Object { $_ } | ForEach-Object { $_.Trim().ToLowerInvariant() } + $allUniversalAbis = @('arm64-v8a', 'armeabi-v7a', 'x86', 'x86_64') + if (@($allUniversalAbis | Where-Object { $normalized -contains $_ }).Count -eq $allUniversalAbis.Count) { + return 'android-universal' + } + if ($normalized -contains 'arm64-v8a') { + return 'android-arm64' + } + if ($normalized -contains 'armeabi-v7a') { + return 'android-armv7' + } + if ($normalized -contains 'x86_64') { + return 'android-x86_64' + } + if ($normalized -contains 'x86') { + return 'android-x86' + } + return 'android' +} + +$repoRoot = Split-Path -Parent $PSScriptRoot +Set-Location $repoRoot + +$javaHome = if ($env:JAVA_HOME) { $env:JAVA_HOME } else { 'C:\Program Files\Android\openjdk\jdk-21.0.8' } +$androidHome = if ($env:ANDROID_HOME) { $env:ANDROID_HOME } else { 'C:\Users\seven\AppData\Local\Android\Sdk' } +$env:JAVA_HOME = $javaHome +$env:ANDROID_HOME = $androidHome + +$gradlePath = Join-Path $repoRoot 'gradlew.bat' +$aaptPath = Join-Path $androidHome 'build-tools\36.1.0\aapt.exe' +$apksignerPath = Join-Path $androidHome 'build-tools\36.1.0\apksigner.bat' +$signingPropertiesPath = Join-Path $repoRoot 'argus-signing.local.properties' +$signingInitScript = Join-Path $PSScriptRoot 'new-argus-upload-keystore.ps1' + +Require-Tool $gradlePath 'Gradle wrapper' +Require-Tool $aaptPath 'aapt' +Require-Tool $apksignerPath 'apksigner' +Require-Tool $signingInitScript 'Argus signing init script' + +if (-not (Test-Path $signingPropertiesPath)) { + if ($SkipSigningInitialization) { + throw "Signing properties were not found: $signingPropertiesPath" + } + & $signingInitScript + if ($LASTEXITCODE -ne 0) { + throw "Signing initialization failed with exit code $LASTEXITCODE." + } +} + +& $gradlePath :app:assembleRelease --console=plain +if ($LASTEXITCODE -ne 0) { + throw "Gradle release build failed with exit code $LASTEXITCODE." +} + +$outputMetadataPath = Join-Path $repoRoot 'app\build\outputs\apk\release\output-metadata.json' +if (-not (Test-Path $outputMetadataPath)) { + throw "Release output metadata was not found: $outputMetadataPath" +} + +$outputMetadata = Get-Content $outputMetadataPath -Raw | ConvertFrom-Json +$outputFile = $outputMetadata.elements[0].outputFile +$releaseApkPath = Join-Path $repoRoot ("app\build\outputs\apk\release\{0}" -f $outputFile) +if (-not (Test-Path $releaseApkPath)) { + throw "Release APK was not found: $releaseApkPath" +} +if ($releaseApkPath -like '*-unsigned.apk') { + throw "Release APK is unsigned: $releaseApkPath" +} + +$badging = & $aaptPath dump badging $releaseApkPath +if ($LASTEXITCODE -ne 0) { + throw "aapt badging failed with exit code $LASTEXITCODE." +} +$badgingText = ($badging | Out-String) +$packageName = Get-ApkBadgingValue $badgingText "package: name='([^']+)'" +$versionCode = Get-ApkBadgingValue $badgingText "versionCode='([^']+)'" +$versionName = Get-ApkBadgingValue $badgingText "versionName='([^']+)'" +$targetSdk = Get-ApkBadgingValue $badgingText "targetSdkVersion:'([^']+)'" +$applicationLabel = Get-ApkBadgingValue $badgingText "application-label:'([^']+)'" +$nativeCodeLine = ($badging | Where-Object { $_ -like 'native-code:*' } | Select-Object -First 1) +$nativeCodes = if ($nativeCodeLine) { + [regex]::Matches($nativeCodeLine, "'([^']+)'") | ForEach-Object { $_.Groups[1].Value } +} else { + @() +} +$detectedPlatform = Resolve-ArgusPlatform $nativeCodes +$resolvedPlatform = if ([string]::IsNullOrWhiteSpace($Platform)) { + $detectedPlatform +} else { + $Platform.Trim() +} + +if (-not $packageName) { + throw 'Package name could not be extracted from APK.' +} +if (-not $versionCode) { + throw 'Version code could not be extracted from APK.' +} +if (-not $versionName) { + throw 'Version name could not be extracted from APK.' +} +if (-not $targetSdk) { + throw 'Target SDK could not be extracted from APK.' +} + +& $apksignerPath verify --print-certs $releaseApkPath | Out-Null +if ($LASTEXITCODE -ne 0) { + throw "apksigner verification failed with exit code $LASTEXITCODE." +} + +$resolvedName = if ($Name) { $Name } elseif ($applicationLabel) { $applicationLabel } else { 'Ikar' } +$releaseVersion = if ($Version) { $Version } else { $versionName } +$stageDirectory = Join-Path $repoRoot ("build\argus-publication\v{0}" -f $versionCode) +if (-not (Test-Path $stageDirectory)) { + New-Item -ItemType Directory -Path $stageDirectory | Out-Null +} + +$stagedApkName = "{0}-{1}.apk" -f $Slug, $versionCode +$stagedApkPath = Join-Path $stageDirectory $stagedApkName +Copy-Item $releaseApkPath $stagedApkPath -Force + +$metadata = [ordered]@{ + packagePath = $stagedApkPath + slug = $Slug + name = $resolvedName + summary = $Summary + description = $Description + version = $releaseVersion + channel = $Channel + platform = $resolvedPlatform + packageKind = 'apk' + notes = if ($Notes) { $Notes } else { $null } + repositoryUrl = if ($RepositoryUrl) { $RepositoryUrl } else { $null } + homepageUrl = if ($HomepageUrl) { $HomepageUrl } else { $null } + androidPackageName = $packageName + androidVersionCode = [int]$versionCode + targetSdkVersion = [int]$targetSdk + isListed = (-not $Unlisted) + verifiedFromApk = [ordered]@{ + outputFile = $releaseApkPath + packageName = $packageName + versionCode = [int]$versionCode + versionName = $versionName + targetSdkVersion = [int]$targetSdk + nativeCodes = $nativeCodes + detectedPlatform = $detectedPlatform + applicationLabel = if ($applicationLabel) { $applicationLabel } else { $null } + verifiedAt = [DateTimeOffset]::UtcNow.ToString('O') + } +} + +$metadataPath = Join-Path $stageDirectory 'argus-publication.json' +$metadata | ConvertTo-Json -Depth 6 | Set-Content -Path $metadataPath -Encoding UTF8 + +Write-Output "Prepared Argus publication files." +Write-Output "APK: $stagedApkPath" +Write-Output "Metadata: $metadataPath" diff --git a/src/Ikar.AndroidKotlin/scripts/publish-release.ps1 b/src/Ikar.AndroidKotlin/scripts/publish-release.ps1 new file mode 100644 index 00000000..42e3d6b2 --- /dev/null +++ b/src/Ikar.AndroidKotlin/scripts/publish-release.ps1 @@ -0,0 +1,141 @@ +param( + [string]$BaseUrl = 'https://argus.kusoft.xyz', + [Parameter(Mandatory = $true)] + [string]$Username, + [Parameter(Mandatory = $true)] + [string]$Password, + [Parameter(Mandatory = $true)] + [string]$Slug, + [Parameter(Mandatory = $true)] + [string]$Name, + [Parameter(Mandatory = $true)] + [string]$Summary, + [Parameter(Mandatory = $true)] + [string]$Description, + [Parameter(Mandatory = $true)] + [string]$AndroidPackageName, + [Parameter(Mandatory = $true)] + [string]$Version, + [Parameter(Mandatory = $true)] + [ValidateRange(1, [int]::MaxValue)] + [int]$AndroidVersionCode, + [Parameter(Mandatory = $true)] + [string]$PackagePath, + [string]$Channel = 'stable', + [string]$Platform = 'android', + [string]$PackageKind = 'apk', + [string]$Notes, + [string]$RepositoryUrl, + [string]$HomepageUrl = 'https://ikar.kusoft.xyz', + [switch]$Unlisted +) + +$ErrorActionPreference = 'Stop' +Add-Type -AssemblyName System.Net.Http + +function Read-HttpBody([System.Net.Http.HttpResponseMessage]$Response) { + if ($null -eq $Response.Content) { + return '' + } + + return $Response.Content.ReadAsStringAsync().GetAwaiter().GetResult() +} + +function Ensure-Success( + [System.Net.Http.HttpResponseMessage]$Response, + [string]$Operation +) { + if ($Response.IsSuccessStatusCode) { + return + } + + $body = Read-HttpBody $Response + throw "$Operation failed with status $([int]$Response.StatusCode) ($($Response.ReasonPhrase)). Body: $body" +} + +function New-JsonContent([string]$Json) { + return [System.Net.Http.StringContent]::new($Json, [System.Text.Encoding]::UTF8, 'application/json') +} + +$resolvedPackagePath = (Resolve-Path -LiteralPath $PackagePath).Path +if (-not (Test-Path $resolvedPackagePath)) { + throw "Package file was not found: $resolvedPackagePath" +} + +$baseUri = $BaseUrl.TrimEnd('/') +$cookieContainer = [System.Net.CookieContainer]::new() +$handler = [System.Net.Http.HttpClientHandler]::new() +$handler.CookieContainer = $cookieContainer +$handler.UseCookies = $true +$client = [System.Net.Http.HttpClient]::new($handler) +$client.Timeout = [TimeSpan]::FromMinutes(15) + +try { + $loginPayload = @{ + username = $Username + password = $Password + } | ConvertTo-Json -Compress + + $loginResponse = $client.PostAsync( + "$baseUri/api/admin/session/login", + (New-JsonContent $loginPayload) + ).GetAwaiter().GetResult() + Ensure-Success $loginResponse 'Argus login' + + $appPayload = @{ + name = $Name + summary = $Summary + description = $Description + androidPackageName = $AndroidPackageName + repositoryUrl = if ([string]::IsNullOrWhiteSpace($RepositoryUrl)) { $null } else { $RepositoryUrl } + homepageUrl = if ([string]::IsNullOrWhiteSpace($HomepageUrl)) { $null } else { $HomepageUrl } + isListed = (-not $Unlisted) + } | ConvertTo-Json -Compress + + $appResponse = $client.PutAsync( + "$baseUri/api/admin/apps/$Slug", + (New-JsonContent $appPayload) + ).GetAwaiter().GetResult() + Ensure-Success $appResponse 'Argus app metadata update' + + $form = [System.Net.Http.MultipartFormDataContent]::new() + $fields = [ordered]@{ + Version = $Version + Channel = $Channel + Platform = $Platform + PackageKind = $PackageKind + AndroidVersionCode = [string]$AndroidVersionCode + } + + foreach ($entry in $fields.GetEnumerator()) { + $form.Add([System.Net.Http.StringContent]::new($entry.Value, [System.Text.Encoding]::UTF8), $entry.Key) + } + + if (-not [string]::IsNullOrWhiteSpace($Notes)) { + $form.Add([System.Net.Http.StringContent]::new($Notes, [System.Text.Encoding]::UTF8), 'Notes') + } + + $fileStream = [System.IO.File]::OpenRead($resolvedPackagePath) + try { + $fileContent = [System.Net.Http.StreamContent]::new($fileStream) + $fileContent.Headers.ContentType = [System.Net.Http.Headers.MediaTypeHeaderValue]::Parse('application/vnd.android.package-archive') + $form.Add($fileContent, 'Package', [System.IO.Path]::GetFileName($resolvedPackagePath)) + + $releaseResponse = $client.PostAsync( + "$baseUri/api/admin/apps/$Slug/releases", + $form + ).GetAwaiter().GetResult() + Ensure-Success $releaseResponse 'Argus release upload' + + $releaseBody = Read-HttpBody $releaseResponse + if (-not [string]::IsNullOrWhiteSpace($releaseBody)) { + Write-Output $releaseBody + } + } finally { + $fileStream.Dispose() + $form.Dispose() + } +} finally { + $client.Dispose() + $handler.Dispose() +} diff --git a/src/Ikar.AndroidKotlin/settings.gradle.kts b/src/Ikar.AndroidKotlin/settings.gradle.kts new file mode 100644 index 00000000..4e4c91b1 --- /dev/null +++ b/src/Ikar.AndroidKotlin/settings.gradle.kts @@ -0,0 +1,18 @@ +pluginManagement { + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + google() + mavenCentral() + } +} + +rootProject.name = "IkarAndroidKotlin" +include(":app") diff --git a/src/Ikar.Server.Tests/BotsControllerTests.cs b/src/Ikar.Server.Tests/BotsControllerTests.cs new file mode 100644 index 00000000..6f295f27 --- /dev/null +++ b/src/Ikar.Server.Tests/BotsControllerTests.cs @@ -0,0 +1,151 @@ +using Ikar.Server.Data.Entities; +using Ikar.Shared; +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; + +namespace Ikar.Server.Tests; + +public sealed class BotsControllerTests +{ + [Fact] + public async Task DeleteBot_RemovesBotProfileAndSafeData_ButKeepsMessageHistory() + { + await using var database = new SqliteTestDatabase(); + await using var dbContext = await database.CreateContextAsync(); + + var owner = CreateUser("owner"); + var botUser = CreateUser("helperbot", isBot: true); + botUser.Sessions.Add(new UserSession + { + UserId = botUser.Id, + User = botUser, + TokenHash = "bot-session" + }); + botUser.PushDevices.Add(new PushDevice + { + UserId = botUser.Id, + User = botUser, + Platform = PushPlatform.Android, + InstallationId = "bot-installation", + DeviceToken = "bot-device-token", + NotificationsEnabled = true + }); + + var bot = new Bot + { + Id = Guid.NewGuid(), + UserId = botUser.Id, + User = botUser, + OwnerUserId = owner.Id, + OwnerUser = owner, + TokenHash = "bot-token" + }; + var command = new BotCommand + { + BotId = bot.Id, + Bot = bot, + Command = "help", + Description = "Show help" + }; + + var chat = CreateDirectChat(owner, botUser); + var message = new Message + { + Id = Guid.NewGuid(), + ChatId = chat.Id, + Chat = chat, + SenderId = botUser.Id, + Sender = botUser, + Text = "history", + SentAt = new DateTimeOffset(2026, 5, 17, 12, 0, 0, TimeSpan.Zero) + }; + chat.Messages.Add(message); + var update = new BotUpdate + { + BotId = bot.Id, + Bot = bot, + ChatId = chat.Id, + Chat = chat, + MessageId = message.Id, + Message = message, + CreatedAt = message.SentAt + }; + + dbContext.AddRange(owner, botUser, bot, command, chat, update); + await dbContext.SaveChangesAsync(); + + var controller = ControllerTestFixture.CreateBotsController(dbContext, owner.Id); + var response = await controller.DeleteBot(bot.Id, CancellationToken.None); + + Assert.IsType<NoContentResult>(response); + Assert.False(await dbContext.Bots.AnyAsync(x => x.Id == bot.Id)); + Assert.False(await dbContext.BotCommands.AnyAsync(x => x.BotId == bot.Id)); + Assert.False(await dbContext.BotUpdates.AnyAsync(x => x.BotId == bot.Id)); + Assert.False(await dbContext.UserSessions.AnyAsync(x => x.UserId == botUser.Id)); + Assert.False(await dbContext.PushDevices.AnyAsync(x => x.UserId == botUser.Id)); + + var reloadedBotUser = await dbContext.Users.SingleAsync(x => x.Id == botUser.Id); + Assert.True(reloadedBotUser.IsBot); + Assert.True(reloadedBotUser.IsBlocked); + Assert.NotNull(reloadedBotUser.BlockedAt); + + var reloadedMessage = await dbContext.Messages.AsNoTracking().SingleAsync(x => x.Id == message.Id); + Assert.Equal(botUser.Id, reloadedMessage.SenderId); + Assert.Equal("history", reloadedMessage.Text); + } + + [Fact] + public async Task DeleteBot_ReturnsNotFoundForBotOwnedByAnotherUser() + { + await using var database = new SqliteTestDatabase(); + await using var dbContext = await database.CreateContextAsync(); + + var owner = CreateUser("owner"); + var otherUser = CreateUser("other"); + var botUser = CreateUser("otherbot", isBot: true); + var bot = new Bot + { + Id = Guid.NewGuid(), + UserId = botUser.Id, + User = botUser, + OwnerUserId = owner.Id, + OwnerUser = owner, + TokenHash = "other-bot-token" + }; + + dbContext.AddRange(owner, otherUser, botUser, bot); + await dbContext.SaveChangesAsync(); + + var controller = ControllerTestFixture.CreateBotsController(dbContext, otherUser.Id); + var response = await controller.DeleteBot(bot.Id, CancellationToken.None); + + Assert.IsType<NotFoundResult>(response); + Assert.True(await dbContext.Bots.AnyAsync(x => x.Id == bot.Id)); + } + + private static User CreateUser(string username, bool isBot = false) => + new() + { + Id = Guid.NewGuid(), + Username = username, + NormalizedUsername = username.ToUpperInvariant(), + DisplayName = username, + PasswordHash = "test", + IsBot = isBot + }; + + private static Chat CreateDirectChat(User first, User second) + { + var chat = new Chat + { + Id = Guid.NewGuid(), + Type = ChatType.Direct, + CreatedById = first.Id, + CreatedBy = first, + CreatedAt = new DateTimeOffset(2026, 5, 17, 11, 0, 0, TimeSpan.Zero) + }; + chat.Members.Add(new ChatMember { ChatId = chat.Id, Chat = chat, UserId = first.Id, User = first }); + chat.Members.Add(new ChatMember { ChatId = chat.Id, Chat = chat, UserId = second.Id, User = second }); + return chat; + } +} diff --git a/src/Ikar.Server.Tests/ChannelDtoMapperTests.cs b/src/Ikar.Server.Tests/ChannelDtoMapperTests.cs new file mode 100644 index 00000000..ac521c8e --- /dev/null +++ b/src/Ikar.Server.Tests/ChannelDtoMapperTests.cs @@ -0,0 +1,140 @@ +using Ikar.Server.Data.Entities; +using Ikar.Server.Infrastructure; +using Ikar.Shared; + +namespace Ikar.Server.Tests; + +public sealed class ChannelDtoMapperTests +{ + [Fact] + public void ChannelDetails_HideOtherSubscribersFromRegularSubscriber() + { + var owner = CreateUser("owner", "Owner"); + var subscriber = CreateUser("subscriber", "Subscriber"); + var hiddenSubscriber = CreateUser("hidden", "Hidden Subscriber"); + var channel = CreateChannel(owner, subscriber, hiddenSubscriber); + + var subscriberDetails = channel.ToDetailsDto(subscriber.Id, new PresenceTracker()); + var ownerDetails = channel.ToDetailsDto(owner.Id, new PresenceTracker()); + + Assert.Equal(3, subscriberDetails.SubscriberCount); + Assert.Equal("Product news and release notes.", subscriberDetails.Description); + Assert.Equal(1, subscriberDetails.AdminCount); + Assert.False(subscriberDetails.CanPostAsChannel); + Assert.False(subscriberDetails.CanSendMessages); + Assert.Contains(subscriberDetails.Members!, member => member.User.Id == owner.Id); + Assert.Contains(subscriberDetails.Members!, member => member.User.Id == subscriber.Id); + Assert.DoesNotContain(subscriberDetails.Members!, member => member.User.Id == hiddenSubscriber.Id); + Assert.Equal(3, ownerDetails.Members!.Count); + Assert.True(ownerDetails.CanPostAsChannel); + } + + [Fact] + public void PublicChannelDetails_AllowPreviewAndSubscribe_ForNonMember() + { + var owner = CreateUser("owner", "Owner"); + var subscriber = CreateUser("subscriber", "Subscriber"); + var viewer = CreateUser("viewer", "Viewer"); + var channel = CreateChannel(owner, subscriber); + channel.PublicUsername = "ikar_updates"; + + var details = channel.ToDetailsDto(viewer.Id, new PresenceTracker()); + + Assert.Equal(2, details.SubscriberCount); + Assert.False(details.IsSubscribed); + Assert.True(details.CanSubscribe); + Assert.False(details.CanSendMessages); + Assert.False(details.CanPostAsChannel); + var visibleMember = Assert.Single(details.Members!); + Assert.Equal(owner.Id, visibleMember.User.Id); + } + + [Fact] + public void ChannelPost_MasksSenderForRegularSubscriber_AndKeepsViewCount() + { + var owner = CreateUser("owner", "Owner"); + var subscriber = CreateUser("subscriber", "Subscriber"); + var channel = CreateChannel(owner, subscriber); + var post = new Message + { + Id = Guid.NewGuid(), + ChatId = channel.Id, + Chat = channel, + SenderId = owner.Id, + Sender = owner, + Text = "Channel post", + PostedAsChannel = true, + SentAt = DateTimeOffset.UtcNow + }; + post.Views.Add(new MessageView + { + MessageId = post.Id, + ViewerUserId = subscriber.Id, + ViewedAt = DateTimeOffset.UtcNow + }); + + var subscriberDto = post.ToDto(new PresenceTracker(), subscriber.Id); + var ownerDto = post.ToDto(new PresenceTracker(), owner.Id); + + Assert.True(subscriberDto.PostedAsChannel); + Assert.Equal(channel.Id, subscriberDto.Sender.Id); + Assert.Equal("Ikar Updates", subscriberDto.DisplayAuthorName); + Assert.Equal(1, subscriberDto.ViewCount); + Assert.Equal(owner.Id, ownerDto.Sender.Id); + } + + private static Chat CreateChannel(User owner, params User[] subscribers) + { + var channel = new Chat + { + Id = Guid.NewGuid(), + Type = ChatType.Channel, + Title = "Ikar Updates", + Description = "Product news and release notes.", + CreatedById = owner.Id, + CreatedBy = owner, + CreatedAt = DateTimeOffset.UtcNow + }; + channel.Members.Add(new ChatMember + { + ChatId = channel.Id, + Chat = channel, + UserId = owner.Id, + User = owner, + IsOwner = true, + Role = ChatMemberRole.Owner, + CanPinMessages = true, + CanDeleteMessages = true, + CanInviteUsers = true, + CanPostMessages = true + }); + + foreach (var subscriber in subscribers) + { + channel.Members.Add(new ChatMember + { + ChatId = channel.Id, + Chat = channel, + UserId = subscriber.Id, + User = subscriber, + Role = ChatMemberRole.Member, + CanPinMessages = false, + CanDeleteMessages = false, + CanInviteUsers = false, + CanPostMessages = false + }); + } + + return channel; + } + + private static User CreateUser(string username, string displayName) => + new() + { + Id = Guid.NewGuid(), + Username = username, + NormalizedUsername = username.ToUpperInvariant(), + DisplayName = displayName, + PasswordHash = "test" + }; +} diff --git a/src/Ikar.Server.Tests/ChannelMembersControllerTests.cs b/src/Ikar.Server.Tests/ChannelMembersControllerTests.cs new file mode 100644 index 00000000..0e20cf4d --- /dev/null +++ b/src/Ikar.Server.Tests/ChannelMembersControllerTests.cs @@ -0,0 +1,80 @@ +using Ikar.Server.Data.Entities; +using Ikar.Shared; + +namespace Ikar.Server.Tests; + +public sealed class ChannelMembersControllerTests +{ + [Fact] + public async Task AddMembers_CanAddBotAsChannelAdmin() + { + await using var database = new SqliteTestDatabase(); + await using var dbContext = await database.CreateContextAsync(); + var owner = CreateUser("owner"); + var bot = CreateUser("news_bot", isBot: true); + var channel = CreateChannel(owner); + dbContext.AddRange(owner, bot, channel); + await dbContext.SaveChangesAsync(); + + var controller = ControllerTestFixture.CreateChatsController(dbContext, owner.Id); + var response = await controller.AddMembers( + channel.Id, + new AddChatMembersRequest([bot.Id], ChatMemberRole.Admin), + CancellationToken.None); + + var details = ControllerTestFixture.ValueOf(response); + var members = details.Members ?? throw new InvalidOperationException("Chat members were not returned."); + var botMember = Assert.Single(members, member => member.User.Id == bot.Id); + Assert.True(botMember.User.IsBot); + Assert.Equal(ChatMemberRole.Admin, botMember.Role); + Assert.True(botMember.Permissions.CanManageMembers); + Assert.True(botMember.Permissions.CanPostMessages); + Assert.True(botMember.Permissions.CanPinMessages); + Assert.True(botMember.Permissions.CanDeleteMessages); + Assert.True(botMember.Permissions.CanInviteUsers); + Assert.Equal(2, details.SubscriberCount); + Assert.Equal(2, details.AdminCount); + } + + private static User CreateUser(string username, bool isBot = false) => + new() + { + Id = Guid.NewGuid(), + Username = username, + NormalizedUsername = username.ToUpperInvariant(), + DisplayName = username, + PasswordHash = "test", + IsBot = isBot + }; + + private static Chat CreateChannel(User owner) + { + var channel = new Chat + { + Id = Guid.NewGuid(), + Type = ChatType.Channel, + Title = "News", + Description = "Public news channel", + PublicUsername = "news", + CreatedById = owner.Id, + CreatedBy = owner, + CreatedAt = new DateTimeOffset(2026, 1, 1, 9, 0, 0, TimeSpan.Zero), + LastActivityAt = new DateTimeOffset(2026, 1, 1, 9, 0, 0, TimeSpan.Zero) + }; + channel.Members.Add(new ChatMember + { + ChatId = channel.Id, + Chat = channel, + UserId = owner.Id, + User = owner, + IsOwner = true, + Role = ChatMemberRole.Owner, + CanPinMessages = true, + CanDeleteMessages = true, + CanInviteUsers = true, + CanPostMessages = true + }); + + return channel; + } +} diff --git a/src/Ikar.Server.Tests/ClientVersionRequestReaderTests.cs b/src/Ikar.Server.Tests/ClientVersionRequestReaderTests.cs new file mode 100644 index 00000000..42c669ce --- /dev/null +++ b/src/Ikar.Server.Tests/ClientVersionRequestReaderTests.cs @@ -0,0 +1,55 @@ +using Ikar.Server.Data.Entities; +using Ikar.Server.Infrastructure.Auth; +using Ikar.Shared; +using Microsoft.AspNetCore.Http; + +namespace Ikar.Server.Tests; + +public sealed class ClientVersionRequestReaderTests +{ + [Fact] + public void Read_UsesClientVersionHeaders() + { + var context = new DefaultHttpContext(); + context.Request.Headers[ClientVersionMetadata.PlatformHeaderName] = " android "; + context.Request.Headers[ClientVersionMetadata.VersionCodeHeaderName] = "168"; + context.Request.Headers[ClientVersionMetadata.VersionNameHeaderName] = "3.55"; + + var snapshot = ClientVersionRequestReader.Read(context.Request); + + Assert.Equal("android", snapshot.ClientPlatform); + Assert.Equal(168, snapshot.ClientVersionCode); + Assert.Equal("3.55", snapshot.ClientVersionName); + } + + [Fact] + public void Apply_DoesNotClearExistingClientVersionWhenSnapshotIsEmpty() + { + var session = new UserSession + { + ClientPlatform = "android", + ClientVersionCode = 168, + ClientVersionName = "3.55" + }; + + var changed = ClientVersionRequestReader.Apply(session, new(null, null, null)); + + Assert.False(changed); + Assert.Equal("android", session.ClientPlatform); + Assert.Equal(168, session.ClientVersionCode); + Assert.Equal("3.55", session.ClientVersionName); + } + + [Fact] + public void Apply_StoresClientVersionOnPushDevice() + { + var device = new PushDevice(); + + var changed = ClientVersionRequestReader.Apply(device, new("android", 168, "3.55")); + + Assert.True(changed); + Assert.Equal("android", device.ClientPlatform); + Assert.Equal(168, device.ClientVersionCode); + Assert.Equal("3.55", device.ClientVersionName); + } +} diff --git a/src/Ikar.Server.Tests/ControllerTestFixture.cs b/src/Ikar.Server.Tests/ControllerTestFixture.cs new file mode 100644 index 00000000..447c3013 --- /dev/null +++ b/src/Ikar.Server.Tests/ControllerTestFixture.cs @@ -0,0 +1,145 @@ +using System.Security.Claims; +using Ikar.Server.Controllers; +using Ikar.Server.Data; +using Ikar.Server.Infrastructure; +using Ikar.Server.Infrastructure.Bots; +using Ikar.Server.Infrastructure.Auth; +using Ikar.Server.Infrastructure.Hubs; +using Ikar.Server.Infrastructure.Push; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.SignalR; +using Microsoft.Data.Sqlite; +using Microsoft.EntityFrameworkCore; + +namespace Ikar.Server.Tests; + +internal sealed class SqliteTestDatabase : IAsyncDisposable +{ + private readonly SqliteConnection _connection = new("Data Source=:memory:"); + + public async Task<IkarDbContext> CreateContextAsync() + { + await _connection.OpenAsync(); + var options = new DbContextOptionsBuilder<IkarDbContext>() + .UseSqlite(_connection) + .Options; + var dbContext = new IkarDbContext(options); + await dbContext.Database.EnsureCreatedAsync(); + return dbContext; + } + + public async ValueTask DisposeAsync() + { + await _connection.DisposeAsync(); + } +} + +internal static class ControllerTestFixture +{ + public static ChatsController CreateChatsController(IkarDbContext dbContext, Guid userId) + { + var controller = new ChatsController( + dbContext, + new PresenceTracker(), + new NoopHubContext<MessengerHub>(), + attachmentStorageService: null!, + new PushDispatchQueue(), + new BotUpdateService(dbContext)); + AttachUser(controller, userId); + return controller; + } + + public static UsersController CreateUsersController(IkarDbContext dbContext, Guid userId) + { + var controller = new UsersController( + dbContext, + new PresenceTracker(), + avatarStorageService: null!); + AttachUser(controller, userId); + return controller; + } + + public static BotsController CreateBotsController(IkarDbContext dbContext, Guid userId) + { + var controller = new BotsController(dbContext, new BotTokenService()); + AttachUser(controller, userId); + return controller; + } + + public static StoriesController CreateStoriesController(IkarDbContext dbContext, Guid userId) + { + var controller = new StoriesController( + dbContext, + new PresenceTracker(), + attachmentStorageService: null!); + AttachUser(controller, userId); + return controller; + } + + public static T ValueOf<T>(ActionResult<T> actionResult) + { + var ok = Assert.IsType<OkObjectResult>(actionResult.Result); + return Assert.IsAssignableFrom<T>(ok.Value); + } + + private static void AttachUser(ControllerBase controller, Guid userId) + { + var identity = new ClaimsIdentity( + [new Claim(ClaimTypes.NameIdentifier, userId.ToString())], + authenticationType: "Test"); + controller.ControllerContext = new ControllerContext + { + HttpContext = new DefaultHttpContext + { + User = new ClaimsPrincipal(identity) + } + }; + } +} + +internal sealed class NoopHubContext<THub> : IHubContext<THub> + where THub : Hub +{ + public IHubClients Clients { get; } = new NoopHubClients(); + + public IGroupManager Groups { get; } = new NoopGroupManager(); + + private sealed class NoopHubClients : IHubClients + { + private static readonly IClientProxy Proxy = new NoopClientProxy(); + + public IClientProxy All => Proxy; + + public IClientProxy AllExcept(IReadOnlyList<string> excludedConnectionIds) => Proxy; + + public IClientProxy Client(string connectionId) => Proxy; + + public IClientProxy Clients(IReadOnlyList<string> connectionIds) => Proxy; + + public IClientProxy Group(string groupName) => Proxy; + + public IClientProxy GroupExcept(string groupName, IReadOnlyList<string> excludedConnectionIds) => Proxy; + + public IClientProxy Groups(IReadOnlyList<string> groupNames) => Proxy; + + public IClientProxy User(string userId) => Proxy; + + public IClientProxy Users(IReadOnlyList<string> userIds) => Proxy; + } + + private sealed class NoopClientProxy : IClientProxy + { + public Task SendCoreAsync(string method, object?[] args, CancellationToken cancellationToken = default) => + Task.CompletedTask; + } + + private sealed class NoopGroupManager : IGroupManager + { + public Task AddToGroupAsync(string connectionId, string groupName, CancellationToken cancellationToken = default) => + Task.CompletedTask; + + public Task RemoveFromGroupAsync(string connectionId, string groupName, CancellationToken cancellationToken = default) => + Task.CompletedTask; + } +} diff --git a/src/Ikar.Server.Tests/Ikar.Server.Tests.csproj b/src/Ikar.Server.Tests/Ikar.Server.Tests.csproj new file mode 100644 index 00000000..8336950c --- /dev/null +++ b/src/Ikar.Server.Tests/Ikar.Server.Tests.csproj @@ -0,0 +1,25 @@ +<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <TargetFramework>net10.0</TargetFramework> + <ImplicitUsings>enable</ImplicitUsings> + <Nullable>enable</Nullable> + <IsPackable>false</IsPackable> + </PropertyGroup> + + <ItemGroup> + <PackageReference Include="Microsoft.Data.Sqlite" Version="10.0.4" /> + <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.1" /> + <PackageReference Include="xunit" Version="2.9.3" /> + <PackageReference Include="xunit.runner.visualstudio" Version="3.1.4" /> + </ItemGroup> + + <ItemGroup> + <Using Include="Xunit" /> + </ItemGroup> + + <ItemGroup> + <ProjectReference Include="..\Ikar.Server\Ikar.Server.csproj" /> + </ItemGroup> + +</Project> diff --git a/src/Ikar.Server.Tests/PrivacyAndStoriesControllerTests.cs b/src/Ikar.Server.Tests/PrivacyAndStoriesControllerTests.cs new file mode 100644 index 00000000..60d45e49 --- /dev/null +++ b/src/Ikar.Server.Tests/PrivacyAndStoriesControllerTests.cs @@ -0,0 +1,182 @@ +using Ikar.Server.Data.Entities; +using Ikar.Shared; +using Microsoft.AspNetCore.Mvc; + +namespace Ikar.Server.Tests; + +public sealed class PrivacyAndStoriesControllerTests +{ + [Fact] + public async Task UpdatePrivacySettings_NormalizesVisibilityAndDropsOwnUserId() + { + await using var database = new SqliteTestDatabase(); + await using var dbContext = await database.CreateContextAsync(); + var alice = CreateUser("alice"); + var bob = CreateUser("bob"); + dbContext.Users.AddRange(alice, bob); + await dbContext.SaveChangesAsync(); + + var controller = ControllerTestFixture.CreateUsersController(dbContext, alice.Id); + var response = await controller.UpdateMyPrivacySettings( + new UpdatePrivacySettingsRequest( + PhoneNumberVisibility: "invalid", + LastSeenVisibility: "nobody", + ProfilePhotoVisibility: "everyone", + BlockedUserIds: [alice.Id, bob.Id, bob.Id], + AlwaysAllowUserIds: [alice.Id], + NeverAllowUserIds: [bob.Id], + PasscodeLockEnabled: true, + ShowMessagePreview: false), + CancellationToken.None); + + var settings = ControllerTestFixture.ValueOf(response); + Assert.Equal("contacts", settings.PhoneNumberVisibility); + Assert.Equal("nobody", settings.LastSeenVisibility); + Assert.Equal([bob.Id], settings.BlockedUserIds); + Assert.Empty(settings.AlwaysAllowUserIds); + Assert.Equal([bob.Id], settings.NeverAllowUserIds); + Assert.True(settings.PasscodeLockEnabled); + Assert.False(settings.ShowMessagePreview); + } + + [Fact] + public async Task GetStories_ReturnsEveryoneStoriesWithoutSharedChat() + { + await using var database = new SqliteTestDatabase(); + await using var dbContext = await database.CreateContextAsync(); + var alice = CreateUser("alice"); + var bob = CreateUser("bob"); + var charlie = CreateUser("charlie"); + var sharedChat = CreateDirectChat(alice, bob); + var peerStory = CreateStory(bob, "peer", StoryVisibility.Everyone); + var publicStory = CreateStory(charlie, "public", StoryVisibility.Everyone); + dbContext.AddRange(alice, bob, charlie, sharedChat, peerStory, publicStory); + await dbContext.SaveChangesAsync(); + + var controller = ControllerTestFixture.CreateStoriesController(dbContext, alice.Id); + var response = await controller.GetStories(CancellationToken.None); + + var stories = ControllerTestFixture.ValueOf(response); + Assert.Contains(stories, story => story.Id == peerStory.Id); + Assert.Contains(stories, story => story.Id == publicStory.Id); + } + + [Fact] + public async Task GetStories_ContactsOnlyReturnsStoriesFromSharedChats() + { + await using var database = new SqliteTestDatabase(); + await using var dbContext = await database.CreateContextAsync(); + var alice = CreateUser("alice"); + var bob = CreateUser("bob"); + var charlie = CreateUser("charlie"); + var sharedChat = CreateDirectChat(alice, bob); + var visibleStory = CreateStory(bob, "visible", StoryVisibility.Contacts); + var hiddenStory = CreateStory(charlie, "hidden", StoryVisibility.Contacts); + dbContext.AddRange(alice, bob, charlie, sharedChat, visibleStory, hiddenStory); + await dbContext.SaveChangesAsync(); + + var controller = ControllerTestFixture.CreateStoriesController(dbContext, alice.Id); + var response = await controller.GetStories(CancellationToken.None); + + var stories = ControllerTestFixture.ValueOf(response); + var story = Assert.Single(stories); + Assert.Equal(visibleStory.Id, story.Id); + Assert.Equal("visible", story.Text); + } + + [Fact] + public async Task GetStories_PrivateOnlyReturnsOwnStories() + { + await using var database = new SqliteTestDatabase(); + await using var dbContext = await database.CreateContextAsync(); + var alice = CreateUser("alice"); + var bob = CreateUser("bob"); + var sharedChat = CreateDirectChat(alice, bob); + var ownStory = CreateStory(alice, "own", StoryVisibility.Private); + var peerStory = CreateStory(bob, "peer", StoryVisibility.Private); + dbContext.AddRange(alice, bob, sharedChat, ownStory, peerStory); + await dbContext.SaveChangesAsync(); + + var controller = ControllerTestFixture.CreateStoriesController(dbContext, alice.Id); + var response = await controller.GetStories(CancellationToken.None); + + var stories = ControllerTestFixture.ValueOf(response); + var story = Assert.Single(stories); + Assert.Equal(ownStory.Id, story.Id); + Assert.Equal("own", story.Text); + } + + [Fact] + public async Task GetAvatar_RespectsProfilePhotoContactsVisibility() + { + var avatarPath = Path.GetTempFileName(); + await File.WriteAllTextAsync(avatarPath, "avatar"); + try + { + await using var database = new SqliteTestDatabase(); + await using var dbContext = await database.CreateContextAsync(); + var alice = CreateUser("alice"); + var bob = CreateUser("bob"); + var charlie = CreateUser("charlie"); + alice.AvatarStoragePath = avatarPath; + alice.AvatarContentType = "image/png"; + alice.PrivacySettings = new UserPrivacySettings + { + UserId = alice.Id, + User = alice, + ProfilePhotoVisibility = "contacts" + }; + var sharedChat = CreateDirectChat(alice, bob); + dbContext.AddRange(alice, bob, charlie, sharedChat); + await dbContext.SaveChangesAsync(); + + var bobController = ControllerTestFixture.CreateUsersController(dbContext, bob.Id); + var bobResponse = await bobController.GetAvatar(alice.Id, Path.GetFileName(avatarPath), CancellationToken.None); + Assert.IsType<PhysicalFileResult>(bobResponse); + + var charlieController = ControllerTestFixture.CreateUsersController(dbContext, charlie.Id); + var charlieResponse = await charlieController.GetAvatar(alice.Id, Path.GetFileName(avatarPath), CancellationToken.None); + Assert.IsType<NotFoundResult>(charlieResponse); + } + finally + { + File.Delete(avatarPath); + } + } + + private static User CreateUser(string username) => + new() + { + Id = Guid.NewGuid(), + Username = username, + NormalizedUsername = username.ToUpperInvariant(), + DisplayName = username, + PasswordHash = "test" + }; + + private static Chat CreateDirectChat(User first, User second) + { + var chat = new Chat + { + Id = Guid.NewGuid(), + Type = ChatType.Direct, + CreatedById = first.Id, + CreatedBy = first + }; + chat.Members.Add(new ChatMember { ChatId = chat.Id, Chat = chat, UserId = first.Id, User = first }); + chat.Members.Add(new ChatMember { ChatId = chat.Id, Chat = chat, UserId = second.Id, User = second }); + return chat; + } + + private static Story CreateStory(User author, string text, StoryVisibility visibility) => + new() + { + Id = Guid.NewGuid(), + AuthorUserId = author.Id, + AuthorUser = author, + Text = text, + Visibility = visibility, + CreatedAt = DateTimeOffset.UtcNow.AddMinutes(-5), + ExpiresAt = DateTimeOffset.UtcNow.AddHours(1) + }; +} diff --git a/src/Ikar.Server.Tests/PushNotificationDispatcherTests.cs b/src/Ikar.Server.Tests/PushNotificationDispatcherTests.cs new file mode 100644 index 00000000..6114c55c --- /dev/null +++ b/src/Ikar.Server.Tests/PushNotificationDispatcherTests.cs @@ -0,0 +1,175 @@ +using Ikar.Server.Data.Entities; +using Ikar.Server.Infrastructure.Push; +using Ikar.Shared; +using Microsoft.Extensions.Logging.Abstractions; + +namespace Ikar.Server.Tests; + +public sealed class PushNotificationDispatcherTests +{ + [Fact] + public async Task DispatchMessageReactionAsync_SendsOnlyToMessageAuthorDevices() + { + await using var database = new SqliteTestDatabase(); + await using var dbContext = await database.CreateContextAsync(); + + var owner = CreateUser("owner"); + var reactor = CreateUser("reactor"); + var ownerDevice = CreateAndroidDevice(owner, "owner-device", notificationsEnabled: true); + var reactorDevice = CreateAndroidDevice(reactor, "reactor-device", notificationsEnabled: true); + var disabledOwnerDevice = CreateAndroidDevice(owner, "disabled-owner-device", notificationsEnabled: false); + var chat = CreateChat(owner, reactor); + var message = new Message + { + Chat = chat, + ChatId = chat.Id, + Sender = owner, + SenderId = owner.Id, + Text = "hello" + }; + + dbContext.AddRange(owner, reactor, chat, message, ownerDevice, reactorDevice, disabledOwnerDevice); + await dbContext.SaveChangesAsync(); + + var sender = new RecordingPushNotificationSender(); + var dispatcher = new PushNotificationDispatcher( + dbContext, + sender, + NullLogger<PushNotificationDispatcher>.Instance); + + await dispatcher.DispatchMessageReactionAsync(chat, message, reactor, "+1"); + + var call = Assert.Single(sender.ReactionCalls); + Assert.Equal(chat.Id, call.Chat.Id); + Assert.Equal(message.Id, call.Message.Id); + Assert.Equal(reactor.Id, call.Reactor.Id); + Assert.Equal("+1", call.Emoji); + var device = Assert.Single(call.Devices); + Assert.Equal(ownerDevice.Id, device.Id); + } + + [Fact] + public async Task DispatchMessageReactionAsync_DoesNotNotifySelfReaction() + { + await using var database = new SqliteTestDatabase(); + await using var dbContext = await database.CreateContextAsync(); + + var owner = CreateUser("owner"); + var ownerDevice = CreateAndroidDevice(owner, "owner-device", notificationsEnabled: true); + var chat = CreateChat(owner); + var message = new Message + { + Chat = chat, + ChatId = chat.Id, + Sender = owner, + SenderId = owner.Id, + Text = "hello" + }; + + dbContext.AddRange(owner, chat, message, ownerDevice); + await dbContext.SaveChangesAsync(); + + var sender = new RecordingPushNotificationSender(); + var dispatcher = new PushNotificationDispatcher( + dbContext, + sender, + NullLogger<PushNotificationDispatcher>.Instance); + + await dispatcher.DispatchMessageReactionAsync(chat, message, owner, "+1"); + + Assert.Empty(sender.ReactionCalls); + } + + private static User CreateUser(string username) => + new() + { + Username = username, + NormalizedUsername = username.ToUpperInvariant(), + DisplayName = username, + PasswordHash = "test" + }; + + private static Chat CreateChat(params User[] users) + { + var chat = new Chat + { + Type = users.Length == 1 ? ChatType.Direct : ChatType.Group, + Title = "Test chat", + CreatedBy = users[0], + CreatedById = users[0].Id + }; + + foreach (var user in users) + { + chat.Members.Add(new ChatMember + { + Chat = chat, + ChatId = chat.Id, + User = user, + UserId = user.Id + }); + } + + return chat; + } + + private static PushDevice CreateAndroidDevice(User user, string installationId, bool notificationsEnabled) => + new() + { + User = user, + UserId = user.Id, + Platform = PushPlatform.Android, + InstallationId = installationId, + DeviceToken = $"{installationId}-token", + NotificationsEnabled = notificationsEnabled + }; + + private sealed class RecordingPushNotificationSender : IPushNotificationSender + { + public List<ReactionPushCall> ReactionCalls { get; } = []; + + public Task SendMessageAsync( + Chat chat, + Message message, + IReadOnlyCollection<PushDevice> devices, + CancellationToken cancellationToken = default) => + Task.CompletedTask; + + public Task SendMessageReactionAsync( + Chat chat, + Message message, + User reactor, + string emoji, + IReadOnlyCollection<PushDevice> devices, + CancellationToken cancellationToken = default) + { + ReactionCalls.Add(new ReactionPushCall(chat, message, reactor, emoji, devices.ToList())); + return Task.CompletedTask; + } + + public Task SendIncomingCallAsync( + IncomingCallDto call, + IReadOnlyCollection<PushDevice> devices, + CancellationToken cancellationToken = default) => + Task.CompletedTask; + + public Task SendCallEndedAsync( + CallEndedDto call, + IReadOnlyCollection<PushDevice> devices, + CancellationToken cancellationToken = default) => + Task.CompletedTask; + + public Task SendAppUpdateAvailableAsync( + AndroidAppReleaseDto release, + IReadOnlyCollection<PushDevice> devices, + CancellationToken cancellationToken = default) => + Task.CompletedTask; + } + + private sealed record ReactionPushCall( + Chat Chat, + Message Message, + User Reactor, + string Emoji, + IReadOnlyCollection<PushDevice> Devices); +} diff --git a/src/Ikar.Server.Tests/SearchControllerTests.cs b/src/Ikar.Server.Tests/SearchControllerTests.cs new file mode 100644 index 00000000..2cbb2b69 --- /dev/null +++ b/src/Ikar.Server.Tests/SearchControllerTests.cs @@ -0,0 +1,178 @@ +using Ikar.Server.Data.Entities; +using Ikar.Shared; + +namespace Ikar.Server.Tests; + +public sealed class SearchControllerTests +{ + [Fact] + public async Task SearchPage_FiltersByAuthorDateAndType_AndReturnsJumpFields() + { + await using var database = new SqliteTestDatabase(); + await using var dbContext = await database.CreateContextAsync(); + var alice = CreateUser("alice"); + var bob = CreateUser("bob"); + var chat = CreateChat(alice, bob); + var targetMessage = CreateMessage(chat, bob, "alpha image", new DateTimeOffset(2026, 1, 3, 10, 0, 0, TimeSpan.Zero)); + targetMessage.Attachments.Add(new MessageAttachment + { + MessageId = targetMessage.Id, + OriginalFileName = "alpha.png", + ContentType = "image/png", + StoragePath = "alpha.png", + FileSizeBytes = 123 + }); + dbContext.AddRange( + alice, + bob, + chat, + CreateMessage(chat, alice, "alpha document", new DateTimeOffset(2026, 1, 2, 10, 0, 0, TimeSpan.Zero)), + targetMessage, + CreateMessage(chat, bob, "alpha later file", new DateTimeOffset(2026, 1, 4, 10, 0, 0, TimeSpan.Zero))); + await dbContext.SaveChangesAsync(); + + var controller = ControllerTestFixture.CreateChatsController(dbContext, alice.Id); + var response = await controller.SearchPage( + q: "alpha", + type: "media", + page: 1, + limit: 10, + dateFrom: new DateTimeOffset(2026, 1, 3, 0, 0, 0, TimeSpan.Zero), + dateTo: new DateTimeOffset(2026, 1, 3, 23, 59, 59, TimeSpan.Zero), + authorId: bob.Id); + + var page = ControllerTestFixture.ValueOf(response); + var result = Assert.Single(page.Results); + Assert.False(page.HasMore); + Assert.Equal(1, page.Page); + Assert.Equal(targetMessage.Id, result.MessageId); + Assert.Equal(chat.Id, result.ChatId); + Assert.Equal(bob.Id, result.SenderUserId); + Assert.Equal(targetMessage.SentAt, result.MessageSentAt); + Assert.Equal(targetMessage.Id, result.Message?.Id); + } + + [Fact] + public async Task SearchMessagesPage_PaginatesMessageResults() + { + await using var database = new SqliteTestDatabase(); + await using var dbContext = await database.CreateContextAsync(); + var alice = CreateUser("alice"); + var bob = CreateUser("bob"); + var chat = CreateChat(alice, bob); + dbContext.AddRange( + alice, + bob, + chat, + CreateMessage(chat, bob, "alpha one", new DateTimeOffset(2026, 1, 1, 10, 0, 0, TimeSpan.Zero)), + CreateMessage(chat, bob, "alpha two", new DateTimeOffset(2026, 1, 2, 10, 0, 0, TimeSpan.Zero)), + CreateMessage(chat, bob, "alpha three", new DateTimeOffset(2026, 1, 3, 10, 0, 0, TimeSpan.Zero))); + await dbContext.SaveChangesAsync(); + + var controller = ControllerTestFixture.CreateChatsController(dbContext, alice.Id); + var firstPageResponse = await controller.SearchMessagesPage(chat.Id, q: "alpha", page: 1, limit: 2); + var secondPageResponse = await controller.SearchMessagesPage(chat.Id, q: "alpha", page: 2, limit: 2); + + var firstPage = ControllerTestFixture.ValueOf(firstPageResponse); + var secondPage = ControllerTestFixture.ValueOf(secondPageResponse); + Assert.True(firstPage.HasMore); + Assert.Equal(["alpha three", "alpha two"], firstPage.Messages.Select(x => x.Text).ToArray()); + Assert.False(secondPage.HasMore); + Assert.Equal(["alpha one"], secondPage.Messages.Select(x => x.Text).ToArray()); + } + + [Fact] + public async Task SearchPage_ReturnsPublicChannelForNonMember_ByAtUsername() + { + await using var database = new SqliteTestDatabase(); + await using var dbContext = await database.CreateContextAsync(); + var viewer = CreateUser("viewer"); + var owner = CreateUser("owner"); + var publicChannel = CreateChannel(owner, "Daily News", "daily_news", "Public news channel"); + var privateChannel = CreateChannel(owner, "Daily News Private", null, "Private news channel"); + dbContext.AddRange(viewer, owner, publicChannel, privateChannel); + await dbContext.SaveChangesAsync(); + + var controller = ControllerTestFixture.CreateChatsController(dbContext, viewer.Id); + var response = await controller.SearchPage(q: "@daily_news", page: 1, limit: 10); + + var page = ControllerTestFixture.ValueOf(response); + var result = Assert.Single(page.Results); + Assert.Equal(publicChannel.Id, result.Chat.Id); + Assert.Equal(ChatType.Channel, result.Chat.Type); + Assert.True(result.Chat.CanSubscribe); + Assert.False(result.Chat.IsSubscribed); + } + + private static User CreateUser(string username) => + new() + { + Id = Guid.NewGuid(), + Username = username, + NormalizedUsername = username.ToUpperInvariant(), + DisplayName = username, + PasswordHash = "test" + }; + + private static Chat CreateChat(User first, User second) + { + var chat = new Chat + { + Id = Guid.NewGuid(), + Type = ChatType.Direct, + CreatedById = first.Id, + CreatedBy = first, + CreatedAt = new DateTimeOffset(2026, 1, 1, 9, 0, 0, TimeSpan.Zero) + }; + chat.Members.Add(new ChatMember { ChatId = chat.Id, Chat = chat, UserId = first.Id, User = first }); + chat.Members.Add(new ChatMember { ChatId = chat.Id, Chat = chat, UserId = second.Id, User = second }); + return chat; + } + + private static Message CreateMessage(Chat chat, User sender, string text, DateTimeOffset sentAt) + { + var message = new Message + { + Id = Guid.NewGuid(), + ChatId = chat.Id, + Chat = chat, + SenderId = sender.Id, + Sender = sender, + Text = text, + SentAt = sentAt + }; + chat.Messages.Add(message); + return message; + } + + private static Chat CreateChannel(User owner, string title, string? publicUsername, string description) + { + var channel = new Chat + { + Id = Guid.NewGuid(), + Type = ChatType.Channel, + Title = title, + Description = description, + PublicUsername = publicUsername, + CreatedById = owner.Id, + CreatedBy = owner, + CreatedAt = new DateTimeOffset(2026, 1, 1, 9, 0, 0, TimeSpan.Zero), + LastActivityAt = new DateTimeOffset(2026, 1, 1, 9, 0, 0, TimeSpan.Zero) + }; + channel.Members.Add(new ChatMember + { + ChatId = channel.Id, + Chat = channel, + UserId = owner.Id, + User = owner, + IsOwner = true, + Role = ChatMemberRole.Owner, + CanPinMessages = true, + CanDeleteMessages = true, + CanInviteUsers = true, + CanPostMessages = true + }); + + return channel; + } +} diff --git a/src/Ikar.Server/Controllers/AdminController.cs b/src/Ikar.Server/Controllers/AdminController.cs new file mode 100644 index 00000000..f82c731b --- /dev/null +++ b/src/Ikar.Server/Controllers/AdminController.cs @@ -0,0 +1,261 @@ +using System.Security.Claims; +using System.Security.Cryptography; +using Microsoft.AspNetCore.Authentication; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Options; +using Ikar.Server.Data; +using Ikar.Server.Infrastructure.Admin; +using Ikar.Shared; + +namespace Ikar.Server.Controllers; + +[ApiController] +[Route("admin/api")] +public sealed class AdminController( + IOptions<AdminOptions> adminOptions, + AdminService adminService, + IkarDbContext dbContext) : ControllerBase +{ + [HttpGet("session")] + [AllowAnonymous] + public async Task<ActionResult<AdminSessionStateDto>> GetSessionState() + { + var auth = await HttpContext.AuthenticateAsync(AdminAuthConstants.Scheme); + return Ok(new AdminSessionStateDto( + adminOptions.Value.IsConfigured, + auth.Succeeded, + auth.Principal?.Identity?.Name)); + } + + [HttpPost("session/login")] + [AllowAnonymous] + public async Task<IActionResult> Login(AdminLoginRequest request) + { + if (!adminOptions.Value.IsConfigured) + { + return StatusCode(StatusCodes.Status503ServiceUnavailable, "Admin login is not configured."); + } + + var username = request.Username?.Trim() ?? string.Empty; + var password = request.Password ?? string.Empty; + if (string.IsNullOrWhiteSpace(username) || string.IsNullOrWhiteSpace(password)) + { + return ValidationProblem("Username and password are required."); + } + + if (!SecureEquals(adminOptions.Value.Username, username) || + !SecureEquals(adminOptions.Value.Password, password)) + { + return Unauthorized("Invalid admin credentials."); + } + + var claims = new List<Claim> + { + new(ClaimTypes.Name, adminOptions.Value.Username), + new(ClaimTypes.Role, "Admin") + }; + + var identity = new ClaimsIdentity(claims, AdminAuthConstants.Scheme); + var principal = new ClaimsPrincipal(identity); + + await HttpContext.SignInAsync(AdminAuthConstants.Scheme, principal); + return NoContent(); + } + + [HttpPost("session/logout")] + [Authorize(Policy = AdminAuthConstants.Policy)] + public async Task<IActionResult> Logout() + { + await HttpContext.SignOutAsync(AdminAuthConstants.Scheme); + return NoContent(); + } + + [HttpGet("status")] + [Authorize(Policy = AdminAuthConstants.Policy)] + public async Task<ActionResult<AdminStatusDto>> GetStatus(CancellationToken cancellationToken) => + Ok(await adminService.GetStatusAsync(cancellationToken)); + + [HttpGet("app-updates/compatibility-report")] + [Authorize(Policy = AdminAuthConstants.Policy)] + public async Task<ActionResult<AdminAndroidUpdateCompatibilityReportDto>> GetAndroidUpdateCompatibilityReport(CancellationToken cancellationToken) => + Ok(await adminService.GetAndroidUpdateCompatibilityReportAsync(cancellationToken)); + + [HttpGet("users")] + [Authorize(Policy = AdminAuthConstants.Policy)] + public async Task<ActionResult<IReadOnlyList<AdminUserDto>>> GetUsers([FromQuery] string? q, CancellationToken cancellationToken) => + Ok(await adminService.GetUsersAsync(q, cancellationToken)); + + [HttpPost("users/{userId:guid}/block")] + [Authorize(Policy = AdminAuthConstants.Policy)] + public async Task<IActionResult> BlockUser(Guid userId, CancellationToken cancellationToken) + { + var updated = await adminService.SetUserBlockedAsync(userId, true, cancellationToken); + return updated ? NoContent() : NotFound(); + } + + [HttpPost("users/{userId:guid}/unblock")] + [Authorize(Policy = AdminAuthConstants.Policy)] + public async Task<IActionResult> UnblockUser(Guid userId, CancellationToken cancellationToken) + { + var updated = await adminService.SetUserBlockedAsync(userId, false, cancellationToken); + return updated ? NoContent() : NotFound(); + } + + [HttpDelete("users/{userId:guid}")] + [Authorize(Policy = AdminAuthConstants.Policy)] + public async Task<IActionResult> DeleteUser(Guid userId, CancellationToken cancellationToken) + { + var deleted = await adminService.DeleteUserAsync(userId, cancellationToken); + return deleted ? NoContent() : NotFound(); + } + + [HttpGet("chats")] + [Authorize(Policy = AdminAuthConstants.Policy)] + public async Task<ActionResult<IReadOnlyList<AdminChatDto>>> GetChats([FromQuery] string? q, CancellationToken cancellationToken) => + Ok(await adminService.GetChatsAsync(q, cancellationToken)); + + [HttpGet("chats/{chatId:guid}/details")] + [Authorize(Policy = AdminAuthConstants.Policy)] + public async Task<ActionResult<AdminChatDetailsDto>> GetChatDetails(Guid chatId, CancellationToken cancellationToken) + { + var details = await adminService.GetChatDetailsAsync(chatId, cancellationToken); + return details is null ? NotFound() : Ok(details); + } + + [HttpPut("chats/{chatId:guid}/settings")] + [Authorize(Policy = AdminAuthConstants.Policy)] + public async Task<ActionResult<AdminChatDetailsDto>> UpdateChatSettings( + Guid chatId, + AdminChatSettingsRequest request, + CancellationToken cancellationToken) + { + try + { + var details = await adminService.UpdateChatSettingsAsync(chatId, request, cancellationToken); + return details is null ? NotFound() : Ok(details); + } + catch (InvalidOperationException ex) + { + return BadRequest(ex.Message); + } + } + + [HttpPut("chats/{chatId:guid}/members/{memberUserId:guid}/permissions")] + [Authorize(Policy = AdminAuthConstants.Policy)] + public async Task<ActionResult<AdminChatDetailsDto>> UpdateChatMemberPermissions( + Guid chatId, + Guid memberUserId, + AdminChatMemberPermissionsRequest request, + CancellationToken cancellationToken) + { + var details = await adminService.UpdateMemberPermissionsAsync(chatId, memberUserId, request, cancellationToken); + return details is null ? NotFound() : Ok(details); + } + + [HttpPost("chats/{chatId:guid}/invite-links")] + [Authorize(Policy = AdminAuthConstants.Policy)] + public async Task<ActionResult<AdminChatDetailsDto>> CreateInviteLink( + Guid chatId, + AdminCreateInviteLinkRequest request, + CancellationToken cancellationToken) + { + try + { + var details = await adminService.CreateInviteLinkAsync(chatId, request, cancellationToken); + return details is null ? NotFound() : Ok(details); + } + catch (InvalidOperationException ex) + { + return BadRequest(ex.Message); + } + } + + [HttpDelete("chats/{chatId:guid}/invite-links/{inviteLinkId:guid}")] + [Authorize(Policy = AdminAuthConstants.Policy)] + public async Task<ActionResult<AdminChatDetailsDto>> RevokeInviteLink( + Guid chatId, + Guid inviteLinkId, + CancellationToken cancellationToken) + { + var details = await adminService.RevokeInviteLinkAsync(chatId, inviteLinkId, cancellationToken); + return details is null ? NotFound() : Ok(details); + } + + [HttpPost("chats/{chatId:guid}/join-requests/{joinRequestId:guid}")] + [Authorize(Policy = AdminAuthConstants.Policy)] + public async Task<ActionResult<AdminChatDetailsDto>> ResolveJoinRequest( + Guid chatId, + Guid joinRequestId, + AdminResolveJoinRequestRequest request, + CancellationToken cancellationToken) + { + var details = await adminService.ResolveJoinRequestAsync(chatId, joinRequestId, request.Approve, cancellationToken); + return details is null ? NotFound() : Ok(details); + } + + [HttpDelete("chats/{chatId:guid}")] + [Authorize(Policy = AdminAuthConstants.Policy)] + public async Task<IActionResult> DeleteChat(Guid chatId, CancellationToken cancellationToken) + { + var deleted = await adminService.DeleteChatAsync(chatId, cancellationToken); + return deleted ? NoContent() : NotFound(); + } + + [HttpGet("attachments")] + [Authorize(Policy = AdminAuthConstants.Policy)] + public async Task<ActionResult<IReadOnlyList<AdminAttachmentDto>>> GetAttachments([FromQuery] string? q, CancellationToken cancellationToken) => + Ok(await adminService.GetAttachmentsAsync(q, cancellationToken)); + + [HttpGet("attachments/{attachmentId:guid}/content")] + [Authorize(Policy = AdminAuthConstants.Policy)] + public async Task<IActionResult> DownloadAttachment(Guid attachmentId, CancellationToken cancellationToken) + { + var attachment = await dbContext.MessageAttachments + .AsNoTracking() + .SingleOrDefaultAsync(x => x.Id == attachmentId, cancellationToken); + + if (attachment is null || !System.IO.File.Exists(attachment.StoragePath)) + { + return NotFound(); + } + + var stream = System.IO.File.OpenRead(attachment.StoragePath); + var contentType = string.IsNullOrWhiteSpace(attachment.ContentType) + ? "application/octet-stream" + : attachment.ContentType; + + return File(stream, contentType, attachment.OriginalFileName); + } + + [HttpDelete("attachments/{attachmentId:guid}")] + [Authorize(Policy = AdminAuthConstants.Policy)] + public async Task<IActionResult> DeleteAttachment(Guid attachmentId, CancellationToken cancellationToken) + { + var deleted = await adminService.DeleteAttachmentAsync(attachmentId, cancellationToken); + return deleted ? NoContent() : NotFound(); + } + + [HttpGet("moderation-log")] + [Authorize(Policy = AdminAuthConstants.Policy)] + public async Task<ActionResult<IReadOnlyList<AdminModerationLogItemDto>>> GetModerationLog( + [FromQuery] Guid? chatId, + [FromQuery] int limit = 100, + CancellationToken cancellationToken = default) + => Ok(await adminService.GetModerationLogAsync(chatId, limit, cancellationToken)); + + [HttpPost("messages/cleanup-expired")] + [Authorize(Policy = AdminAuthConstants.Policy)] + public async Task<ActionResult<AdminExpiredMessagesCleanupDto>> CleanupExpiredMessages(CancellationToken cancellationToken) => + Ok(await adminService.CleanupExpiredMessagesAsync(cancellationToken)); + + private static bool SecureEquals(string left, string right) + { + var leftBytes = System.Text.Encoding.UTF8.GetBytes(left ?? string.Empty); + var rightBytes = System.Text.Encoding.UTF8.GetBytes(right ?? string.Empty); + return CryptographicOperations.FixedTimeEquals(leftBytes, rightBytes); + } + + public sealed record AdminLoginRequest(string? Username, string? Password); +} diff --git a/src/Ikar.Server/Controllers/AppUpdatesController.cs b/src/Ikar.Server/Controllers/AppUpdatesController.cs new file mode 100644 index 00000000..f7a1e9c2 --- /dev/null +++ b/src/Ikar.Server/Controllers/AppUpdatesController.cs @@ -0,0 +1,83 @@ +using Microsoft.AspNetCore.Mvc; +using Ikar.Server.Infrastructure.Updates; +using Ikar.Shared; + +namespace Ikar.Server.Controllers; + +[ApiController] +[Route("api/app-updates")] +public sealed class AppUpdatesController( + AndroidAppUpdateService androidAppUpdateService, + AndroidUpdateCompatibilityTrackingService trackingService) : ControllerBase +{ + [HttpGet("android/latest")] + [ResponseCache(Location = ResponseCacheLocation.None, NoStore = true)] + [ProducesResponseType(typeof(AndroidAppReleaseDto), StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public async Task<ActionResult<AndroidAppReleaseDto>> GetLatestAndroidRelease(CancellationToken cancellationToken) + { + ApplyNoCacheHeaders(); + await trackingService.TrackHitAsync(Request, "android/latest", null, cancellationToken); + var release = await androidAppUpdateService.GetLatestReleaseAsync(cancellationToken); + return release is null ? NotFound() : Ok(release); + } + + [HttpGet("android/download/{fileName}")] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public async Task<IActionResult> DownloadAndroidRelease(string fileName, CancellationToken cancellationToken) + { + await trackingService.TrackHitAsync(Request, "android/download/file", fileName, cancellationToken); + var package = await androidAppUpdateService.ResolvePackageAsync(fileName, cancellationToken); + if (package is null) + { + return NotFound(); + } + + if (!string.IsNullOrWhiteSpace(package.RedirectUrl)) + { + return Redirect(package.RedirectUrl); + } + + var physicalPath = package.PhysicalPath!; + return PhysicalFile( + physicalPath, + "application/vnd.android.package-archive", + package.FileName, + enableRangeProcessing: true); + } + + [HttpGet("android/download/latest")] + [ResponseCache(Location = ResponseCacheLocation.None, NoStore = true)] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public async Task<IActionResult> DownloadLatestAndroidRelease(CancellationToken cancellationToken) + { + ApplyNoCacheHeaders(); + await trackingService.TrackHitAsync(Request, "android/download/latest", null, cancellationToken); + var package = await androidAppUpdateService.ResolveLatestPackageAsync(cancellationToken); + if (package is null) + { + return NotFound(); + } + + if (!string.IsNullOrWhiteSpace(package.RedirectUrl)) + { + return Redirect(package.RedirectUrl); + } + + var physicalPath = package.PhysicalPath!; + return PhysicalFile( + physicalPath, + "application/vnd.android.package-archive", + package.FileName, + enableRangeProcessing: true); + } + + private void ApplyNoCacheHeaders() + { + Response.Headers.CacheControl = "no-store, no-cache, must-revalidate, max-age=0"; + Response.Headers.Pragma = "no-cache"; + Response.Headers.Expires = "0"; + } +} diff --git a/src/Ikar.Server/Controllers/AuthController.cs b/src/Ikar.Server/Controllers/AuthController.cs new file mode 100644 index 00000000..3abb808c --- /dev/null +++ b/src/Ikar.Server/Controllers/AuthController.cs @@ -0,0 +1,275 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; +using Ikar.Server.Data; +using Ikar.Server.Data.Entities; +using Ikar.Server.Infrastructure; +using Ikar.Server.Infrastructure.Auth; +using Ikar.Shared; + +namespace Ikar.Server.Controllers; + +[ApiController] +[Route("api/[controller]")] +public sealed class AuthController( + IkarDbContext dbContext, + TokenService tokenService, + PresenceTracker presenceTracker, + PhoneAuthChallengeStore phoneAuthChallengeStore) : ControllerBase +{ + private readonly PasswordHasher<User> _passwordHasher = new(); + + [HttpPost("register")] + [AllowAnonymous] + public async Task<ActionResult<AuthSessionDto>> Register(RegisterRequest request, CancellationToken cancellationToken) + { + var username = request.Username?.Trim() ?? string.Empty; + var displayName = request.DisplayName?.Trim() ?? string.Empty; + var password = request.Password ?? string.Empty; + var phoneNumber = request.PhoneNumber?.Trim() ?? string.Empty; + var normalizedPhoneNumber = PhoneNumberNormalizer.Normalize(phoneNumber); + + if (string.IsNullOrWhiteSpace(username) || + string.IsNullOrWhiteSpace(displayName) || + password.Length < 6 || + normalizedPhoneNumber is null) + { + return ValidationProblem("Username, display name, phone number and a password of at least 6 characters are required."); + } + + var normalizedUsername = username.ToUpperInvariant(); + if (await dbContext.Users.AnyAsync(x => x.NormalizedUsername == normalizedUsername, cancellationToken)) + { + return Conflict("Username is already taken."); + } + + if (await dbContext.Users.AnyAsync(x => x.NormalizedPhoneNumber == normalizedPhoneNumber, cancellationToken)) + { + return Conflict("Phone number is already used."); + } + + var user = new User + { + Username = username, + NormalizedUsername = normalizedUsername, + DisplayName = displayName, + PhoneNumber = phoneNumber, + NormalizedPhoneNumber = normalizedPhoneNumber + }; + + user.PasswordHash = _passwordHasher.HashPassword(user, password); + dbContext.Users.Add(user); + try + { + await dbContext.SaveChangesAsync(cancellationToken); + } + catch (DbUpdateException) + { + var usernameTaken = await dbContext.Users + .AsNoTracking() + .AnyAsync(x => x.NormalizedUsername == normalizedUsername, cancellationToken); + if (usernameTaken) + { + return Conflict("Username is already taken."); + } + + var phoneTaken = await dbContext.Users + .AsNoTracking() + .AnyAsync(x => x.NormalizedPhoneNumber == normalizedPhoneNumber, cancellationToken); + if (phoneTaken) + { + return Conflict("Phone number is already used."); + } + + throw; + } + + var session = await tokenService.CreateSessionAsync( + user, + ClientVersionRequestReader.Read(Request), + cancellationToken); + return Ok(session with { User = user.ToDto(presenceTracker) }); + } + + [HttpPost("login")] + [AllowAnonymous] + public async Task<ActionResult<AuthSessionDto>> Login(LoginRequest request, CancellationToken cancellationToken) + { + var username = request.Username?.Trim() ?? string.Empty; + var password = request.Password ?? string.Empty; + var normalizedUsername = username.ToUpperInvariant(); + var user = await dbContext.Users.SingleOrDefaultAsync( + x => x.NormalizedUsername == normalizedUsername, + cancellationToken); + + if (user is null) + { + return Unauthorized("Invalid username or password."); + } + + if (user.IsBot) + { + return Unauthorized("Bot accounts cannot sign in through the user client."); + } + + if (user.IsBlocked) + { + return StatusCode(StatusCodes.Status423Locked, "User is blocked."); + } + + var verification = _passwordHasher.VerifyHashedPassword(user, user.PasswordHash, password); + if (verification == PasswordVerificationResult.Failed) + { + return Unauthorized("Invalid username or password."); + } + + var session = await tokenService.CreateSessionAsync( + user, + ClientVersionRequestReader.Read(Request), + cancellationToken); + return Ok(session with { User = user.ToDto(presenceTracker) }); + } + + [HttpPost("request-code")] + [AllowAnonymous] + public async Task<ActionResult<PhoneCodeChallengeDto>> RequestPhoneCode( + RequestPhoneCodeRequest request, + CancellationToken cancellationToken) + { + var normalizedPhoneNumber = PhoneNumberNormalizer.Normalize(request.PhoneNumber); + if (normalizedPhoneNumber is null) + { + return ValidationProblem("Valid phone number is required."); + } + + var user = await dbContext.Users + .AsNoTracking() + .SingleOrDefaultAsync(x => x.NormalizedPhoneNumber == normalizedPhoneNumber, cancellationToken); + if (user?.IsBlocked == true) + { + return StatusCode(StatusCodes.Status423Locked, "User is blocked."); + } + + var challenge = phoneAuthChallengeStore.Create(normalizedPhoneNumber, user is not null); + return Ok(new PhoneCodeChallengeDto( + challenge.Id, + challenge.ExpiresAt, + challenge.Code, + challenge.IsRegistered)); + } + + [HttpPost("verify-code")] + [AllowAnonymous] + public async Task<ActionResult<AuthSessionDto>> VerifyPhoneCode( + VerifyPhoneCodeRequest request, + CancellationToken cancellationToken) + { + var normalizedPhoneNumber = PhoneNumberNormalizer.Normalize(request.PhoneNumber); + if (normalizedPhoneNumber is null) + { + return ValidationProblem("Valid phone number is required."); + } + + var challenge = phoneAuthChallengeStore.Consume( + request.ChallengeId?.Trim() ?? string.Empty, + normalizedPhoneNumber, + request.Code?.Trim() ?? string.Empty); + if (challenge is null) + { + return Unauthorized("Invalid or expired verification code."); + } + + var user = await dbContext.Users.SingleOrDefaultAsync( + x => x.NormalizedPhoneNumber == normalizedPhoneNumber, + cancellationToken); + + if (user is null) + { + var displayName = request.DisplayName?.Trim() ?? string.Empty; + if (string.IsNullOrWhiteSpace(displayName)) + { + return ValidationProblem("Display name is required for a new account."); + } + + user = await CreatePhoneOnlyUserAsync(normalizedPhoneNumber, request.PhoneNumber, displayName, cancellationToken); + } + + if (user.IsBlocked) + { + return StatusCode(StatusCodes.Status423Locked, "User is blocked."); + } + + var session = await tokenService.CreateSessionAsync( + user, + ClientVersionRequestReader.Read(Request), + cancellationToken); + return Ok(session with { User = user.ToDto(presenceTracker) }); + } + + [HttpPost("refresh")] + [AllowAnonymous] + public async Task<ActionResult<AuthSessionDto>> Refresh(RefreshSessionRequest request, CancellationToken cancellationToken) + { + if (string.IsNullOrWhiteSpace(request.RefreshToken)) + { + return Unauthorized(); + } + + var session = await tokenService.RefreshSessionAsync( + request.RefreshToken, + ClientVersionRequestReader.Read(Request), + cancellationToken); + if (session is null) + { + return Unauthorized(); + } + + return Ok(session with { User = session.User with { IsOnline = presenceTracker.IsOnline(session.User.Id) } }); + } + + [HttpPost("logout")] + [Authorize] + public async Task<IActionResult> Logout(CancellationToken cancellationToken) + { + await tokenService.RevokeSessionAsync(User.GetRequiredSessionId(), cancellationToken); + return NoContent(); + } + + private async Task<User> CreatePhoneOnlyUserAsync( + string normalizedPhoneNumber, + string rawPhoneNumber, + string displayName, + CancellationToken cancellationToken) + { + var username = await GenerateInternalUsernameAsync(cancellationToken); + var user = new User + { + Username = username, + NormalizedUsername = username.ToUpperInvariant(), + DisplayName = displayName, + PhoneNumber = rawPhoneNumber.Trim(), + NormalizedPhoneNumber = normalizedPhoneNumber + }; + + user.PasswordHash = _passwordHasher.HashPassword(user, Guid.NewGuid().ToString("N")); + dbContext.Users.Add(user); + await dbContext.SaveChangesAsync(cancellationToken); + return user; + } + + private async Task<string> GenerateInternalUsernameAsync(CancellationToken cancellationToken) + { + while (true) + { + var candidate = $"user_{Guid.NewGuid():N}".ToLowerInvariant(); + var exists = await dbContext.Users + .AsNoTracking() + .AnyAsync(x => x.NormalizedUsername == candidate.ToUpperInvariant(), cancellationToken); + if (!exists) + { + return candidate; + } + } + } +} diff --git a/src/Ikar.Server/Controllers/BotApiController.cs b/src/Ikar.Server/Controllers/BotApiController.cs new file mode 100644 index 00000000..d9d7518b --- /dev/null +++ b/src/Ikar.Server/Controllers/BotApiController.cs @@ -0,0 +1,289 @@ +using System.Text.RegularExpressions; +using Ikar.Server.Data; +using Ikar.Server.Data.Entities; +using Ikar.Server.Infrastructure; +using Ikar.Server.Infrastructure.Auth; +using Ikar.Server.Infrastructure.Bots; +using Ikar.Server.Infrastructure.Hubs; +using Ikar.Server.Infrastructure.Push; +using Ikar.Shared; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.SignalR; +using Microsoft.EntityFrameworkCore; + +namespace Ikar.Server.Controllers; + +[ApiController] +[AllowAnonymous] +[Route("api/bot/{token}")] +public sealed class BotApiController( + IkarDbContext dbContext, + PresenceTracker presenceTracker, + BotTokenService botTokenService, + BotUpdateService botUpdateService, + IHubContext<MessengerHub> hubContext, + PushDispatchQueue pushDispatchQueue) : ControllerBase +{ + [HttpGet("getMe")] + public async Task<ActionResult<UserSummaryDto>> GetMe(string token, CancellationToken cancellationToken) + { + var bot = await LoadBotByTokenAsync(token, cancellationToken); + if (bot is null) + { + return Unauthorized(); + } + + if (!bot.IsEnabled) + { + return StatusCode(StatusCodes.Status423Locked, "Bot is disabled."); + } + + return Ok(bot.User.ToDto(presenceTracker)); + } + + [HttpGet("getUpdates")] + public async Task<ActionResult<BotUpdatesResponseDto>> GetUpdates( + string token, + [FromQuery] long offset = 0, + [FromQuery] int limit = 100, + [FromQuery] int timeoutSeconds = 20, + CancellationToken cancellationToken = default) + { + var bot = await LoadBotByTokenAsync(token, cancellationToken); + if (bot is null) + { + return Unauthorized(); + } + + if (!bot.IsEnabled) + { + return StatusCode(StatusCodes.Status423Locked, "Bot is disabled."); + } + + limit = Math.Clamp(limit, 1, 100); + timeoutSeconds = Math.Clamp(timeoutSeconds, 0, 50); + + var timeoutAt = DateTimeOffset.UtcNow.AddSeconds(timeoutSeconds); + while (true) + { + var updates = await LoadUpdatesAsync(bot, offset, limit, cancellationToken); + if (updates.Count > 0 || timeoutSeconds == 0 || DateTimeOffset.UtcNow >= timeoutAt) + { + var messages = updates + .Select(x => x.Message) + .Where(x => x is not null) + .Cast<Message>() + .ToList(); + if (messages.Count > 0) + { + await botUpdateService.MarkMessagesReadByBotAsync(bot.UserId, messages, cancellationToken); + } + + var payload = updates + .Select(update => new BotUpdateDto( + update.Id, + BotUpdateKind.Message, + update.Message?.ToDto(presenceTracker, bot.UserId))) + .ToList(); + + var nextOffset = payload.Count == 0 ? offset : payload[^1].Id + 1; + return Ok(new BotUpdatesResponseDto(nextOffset, payload)); + } + + await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken); + } + } + + [HttpGet("getMyCommands")] + public async Task<ActionResult<IReadOnlyList<BotCommandDto>>> GetMyCommands(string token, CancellationToken cancellationToken) + { + var bot = await LoadBotByTokenAsync(token, cancellationToken); + if (bot is null) + { + return Unauthorized(); + } + + return Ok(bot.Commands + .OrderBy(x => x.SortOrder) + .ThenBy(x => x.Command, StringComparer.OrdinalIgnoreCase) + .Select(x => new BotCommandDto(x.Command, x.Description)) + .ToList()); + } + + [HttpPost("setMyCommands")] + public async Task<ActionResult<IReadOnlyList<BotCommandDto>>> SetMyCommands( + string token, + SetBotCommandsRequest request, + CancellationToken cancellationToken) + { + var bot = await LoadBotByTokenAsync(token, cancellationToken); + if (bot is null) + { + return Unauthorized(); + } + + if (!bot.IsEnabled) + { + return StatusCode(StatusCodes.Status423Locked, "Bot is disabled."); + } + + var commands = NormalizeCommands(request.Commands); + var existingCommands = await dbContext.BotCommands + .Where(x => x.BotId == bot.Id) + .ToListAsync(cancellationToken); + dbContext.BotCommands.RemoveRange(existingCommands); + await dbContext.SaveChangesAsync(cancellationToken); + + for (var index = 0; index < commands.Count; index++) + { + dbContext.BotCommands.Add(new BotCommand + { + BotId = bot.Id, + Command = commands[index].Command, + Description = commands[index].Description, + SortOrder = index + }); + } + + bot.UpdatedAt = DateTimeOffset.UtcNow; + await dbContext.SaveChangesAsync(cancellationToken); + return Ok(commands); + } + + [HttpPost("sendMessage")] + public async Task<ActionResult<MessageDto>> SendMessage( + string token, + BotSendMessageRequest request, + CancellationToken cancellationToken) + { + var bot = await LoadBotByTokenAsync(token, cancellationToken); + if (bot is null) + { + return Unauthorized(); + } + + if (!bot.IsEnabled) + { + return StatusCode(StatusCodes.Status423Locked, "Bot is disabled."); + } + + var text = request.Text?.Trim() ?? string.Empty; + if (string.IsNullOrWhiteSpace(text)) + { + return ValidationProblem("Message text is required."); + } + + var chat = await dbContext.Chats + .Include(x => x.Members) + .SingleOrDefaultAsync( + x => x.Id == request.ChatId && x.Members.Any(member => member.UserId == bot.UserId), + cancellationToken); + if (chat is null) + { + return NotFound("Chat not found."); + } + + if (!DtoMapper.BuildPermissions(chat.Members.FirstOrDefault(member => member.UserId == bot.UserId), chat.Type).CanPostMessages) + { + return StatusCode(StatusCodes.Status403Forbidden, "Bot cannot publish in this chat."); + } + + var message = new Message + { + ChatId = chat.Id, + Chat = chat, + SenderId = bot.UserId, + Sender = bot.User, + PostedAsChannel = chat.Type == ChatType.Channel, + AuthorSignature = chat.Type == ChatType.Channel && chat.ChannelSignaturesEnabled + ? string.IsNullOrWhiteSpace(bot.User.DisplayName) ? bot.User.Username : bot.User.DisplayName + : null, + Text = text, + SentAt = DateTimeOffset.UtcNow + }; + + chat.LastActivityAt = message.SentAt; + dbContext.Messages.Add(message); + await dbContext.SaveChangesAsync(cancellationToken); + + await NotifyMessageCreatedAsync(chat, message, cancellationToken); + await pushDispatchQueue.EnqueueAsync(chat.Id, message.Id); + + return Ok(message.ToDto(presenceTracker, bot.UserId)); + } + + private async Task<Bot?> LoadBotByTokenAsync(string token, CancellationToken cancellationToken) + { + var tokenHash = botTokenService.HashToken(token); + return await dbContext.Bots + .Include(x => x.User) + .ThenInclude(x => x.Sessions) + .Include(x => x.Commands) + .SingleOrDefaultAsync(x => x.TokenHash == tokenHash, cancellationToken); + } + + private async Task<List<BotUpdate>> LoadUpdatesAsync(Bot bot, long offset, int limit, CancellationToken cancellationToken) + { + return await dbContext.BotUpdates + .AsNoTracking() + .Where(x => x.BotId == bot.Id && x.Id >= offset) + .OrderBy(x => x.Id) + .Take(limit) + .Include(x => x.Message) + .ThenInclude(x => x.Sender) + .ThenInclude(x => x.Sessions) + .Include(x => x.Message) + .ThenInclude(x => x.Attachments) + .Include(x => x.Message) + .ThenInclude(x => x.Reactions) + .Include(x => x.Message) + .ThenInclude(x => x.Views) + .Include(x => x.Message) + .ThenInclude(x => x.Chat) + .ThenInclude(x => x.Members) + .ToListAsync(cancellationToken); + } + + private Task NotifyMessageCreatedAsync(Chat chat, Message message, CancellationToken cancellationToken) + { + var tasks = chat.Members.Select(async member => + { + var dto = message.ToDto(presenceTracker, member.UserId); + await hubContext.Clients.User(member.UserId.ToString()) + .SendAsync("MessageCreated", dto, cancellationToken); + }); + + return Task.WhenAll(tasks); + } + + private static List<BotCommandDto> NormalizeCommands(IReadOnlyList<BotCommandDto> commands) + { + var normalized = new List<BotCommandDto>(); + var seen = new HashSet<string>(StringComparer.OrdinalIgnoreCase); + + foreach (var command in commands ?? Array.Empty<BotCommandDto>()) + { + var normalizedCommand = (command.Command ?? string.Empty).Trim().TrimStart('/'); + var normalizedDescription = (command.Description ?? string.Empty).Trim(); + if (string.IsNullOrWhiteSpace(normalizedCommand) || string.IsNullOrWhiteSpace(normalizedDescription)) + { + continue; + } + + if (!Regex.IsMatch(normalizedCommand, "^[a-z0-9_]{1,32}$", RegexOptions.IgnoreCase)) + { + continue; + } + + if (!seen.Add(normalizedCommand)) + { + continue; + } + + normalized.Add(new BotCommandDto(normalizedCommand.ToLowerInvariant(), normalizedDescription)); + } + + return normalized; + } +} diff --git a/src/Ikar.Server/Controllers/BotsController.cs b/src/Ikar.Server/Controllers/BotsController.cs new file mode 100644 index 00000000..4c8e5ccb --- /dev/null +++ b/src/Ikar.Server/Controllers/BotsController.cs @@ -0,0 +1,307 @@ +using System.Text.RegularExpressions; +using Ikar.Server.Data; +using Ikar.Server.Data.Entities; +using Ikar.Server.Infrastructure; +using Ikar.Server.Infrastructure.Auth; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; +using Ikar.Shared; + +namespace Ikar.Server.Controllers; + +[ApiController] +[Authorize] +[Route("api/[controller]")] +public sealed class BotsController( + IkarDbContext dbContext, + BotTokenService botTokenService) : ControllerBase +{ + private static readonly Regex BotUsernameRegex = new("^[A-Za-z0-9_]{5,64}$", RegexOptions.Compiled); + private readonly PasswordHasher<User> _passwordHasher = new(); + + [HttpGet("mine")] + public async Task<ActionResult<IReadOnlyList<BotSummaryDto>>> GetMine(CancellationToken cancellationToken) + { + var ownerUserId = User.GetRequiredUserId(); + var bots = await dbContext.Bots + .Include(x => x.User) + .Include(x => x.Commands) + .AsNoTracking() + .Where(x => x.OwnerUserId == ownerUserId) + .OrderBy(x => x.User.DisplayName) + .ToListAsync(cancellationToken); + + return Ok(bots.Select(x => x.ToDto()).ToList()); + } + + [HttpGet("{botId:guid}")] + public async Task<ActionResult<BotSummaryDto>> GetBot(Guid botId, CancellationToken cancellationToken) + { + var bot = await LoadOwnedBotAsync(botId, User.GetRequiredUserId(), cancellationToken); + if (bot is null) + { + return NotFound(); + } + + return Ok(bot.ToDto()); + } + + [HttpPost] + public async Task<ActionResult<CreatedBotDto>> CreateBot( + CreateBotRequest request, + CancellationToken cancellationToken) + { + var ownerUserId = User.GetRequiredUserId(); + var validationError = await ValidateBotDefinitionAsync( + request.Username, + request.DisplayName, + request.About, + excludingBotId: null, + cancellationToken); + if (validationError is not null) + { + return ValidationProblem(validationError); + } + + var botUser = new User + { + Username = request.Username.Trim(), + NormalizedUsername = request.Username.Trim().ToUpperInvariant(), + DisplayName = request.DisplayName.Trim(), + About = string.IsNullOrWhiteSpace(request.About) ? null : request.About.Trim(), + IsBot = true + }; + botUser.PasswordHash = _passwordHasher.HashPassword(botUser, Guid.NewGuid().ToString("N")); + + var bot = new Bot + { + User = botUser, + OwnerUserId = ownerUserId + }; + + var rawToken = botTokenService.GenerateToken(bot.Id); + bot.TokenHash = botTokenService.HashToken(rawToken); + + dbContext.Bots.Add(bot); + await dbContext.SaveChangesAsync(cancellationToken); + + var created = await LoadOwnedBotAsync(bot.Id, ownerUserId, cancellationToken) + ?? throw new InvalidOperationException("Newly created bot was not found."); + + return Ok(new CreatedBotDto(created.ToDto(), rawToken)); + } + + [HttpPut("{botId:guid}")] + public async Task<ActionResult<BotSummaryDto>> UpdateBot( + Guid botId, + UpdateBotRequest request, + CancellationToken cancellationToken) + { + var ownerUserId = User.GetRequiredUserId(); + var bot = await LoadOwnedBotAsync(botId, ownerUserId, cancellationToken); + if (bot is null) + { + return NotFound(); + } + + var validationError = await ValidateBotDefinitionAsync( + bot.User.Username, + request.DisplayName, + request.About, + excludingBotId: botId, + cancellationToken); + if (validationError is not null) + { + return ValidationProblem(validationError); + } + + bot.User.DisplayName = request.DisplayName.Trim(); + bot.User.About = string.IsNullOrWhiteSpace(request.About) ? null : request.About.Trim(); + bot.IsEnabled = request.IsEnabled; + bot.UpdatedAt = DateTimeOffset.UtcNow; + await dbContext.SaveChangesAsync(cancellationToken); + + return Ok(bot.ToDto()); + } + + [HttpPut("{botId:guid}/commands")] + public async Task<ActionResult<BotSummaryDto>> SetCommands( + Guid botId, + SetBotCommandsRequest request, + CancellationToken cancellationToken) + { + var ownerUserId = User.GetRequiredUserId(); + var bot = await LoadOwnedBotAsync(botId, ownerUserId, cancellationToken); + if (bot is null) + { + return NotFound(); + } + + var normalizedCommands = NormalizeCommands(request.Commands); + var existingCommands = await dbContext.BotCommands + .Where(x => x.BotId == bot.Id) + .ToListAsync(cancellationToken); + dbContext.BotCommands.RemoveRange(existingCommands); + await dbContext.SaveChangesAsync(cancellationToken); + + for (var index = 0; index < normalizedCommands.Count; index++) + { + dbContext.BotCommands.Add(new BotCommand + { + BotId = bot.Id, + Command = normalizedCommands[index].Command, + Description = normalizedCommands[index].Description, + SortOrder = index + }); + } + + bot.UpdatedAt = DateTimeOffset.UtcNow; + await dbContext.SaveChangesAsync(cancellationToken); + var reloaded = await LoadOwnedBotAsync(bot.Id, ownerUserId, cancellationToken) + ?? throw new InvalidOperationException("Updated bot was not found."); + return Ok(reloaded.ToDto()); + } + + [HttpPost("{botId:guid}/regenerate-token")] + public async Task<ActionResult<RegenerateBotTokenResponseDto>> RegenerateToken(Guid botId, CancellationToken cancellationToken) + { + var ownerUserId = User.GetRequiredUserId(); + var bot = await LoadOwnedBotAsync(botId, ownerUserId, cancellationToken); + if (bot is null) + { + return NotFound(); + } + + var rawToken = botTokenService.GenerateToken(bot.Id); + bot.TokenHash = botTokenService.HashToken(rawToken); + bot.UpdatedAt = DateTimeOffset.UtcNow; + await dbContext.SaveChangesAsync(cancellationToken); + + return Ok(new RegenerateBotTokenResponseDto(rawToken)); + } + + [HttpDelete("{botId:guid}")] + public async Task<IActionResult> DeleteBot(Guid botId, CancellationToken cancellationToken) + { + var ownerUserId = User.GetRequiredUserId(); + var bot = await dbContext.Bots + .Include(x => x.User) + .ThenInclude(x => x.Sessions) + .Include(x => x.User) + .ThenInclude(x => x.PushDevices) + .SingleOrDefaultAsync( + x => x.Id == botId && x.OwnerUserId == ownerUserId, + cancellationToken); + if (bot is null) + { + return NotFound(); + } + + var botCommands = await dbContext.BotCommands + .Where(x => x.BotId == bot.Id) + .ToListAsync(cancellationToken); + var botUpdates = await dbContext.BotUpdates + .Where(x => x.BotId == bot.Id) + .ToListAsync(cancellationToken); + + dbContext.BotUpdates.RemoveRange(botUpdates); + dbContext.BotCommands.RemoveRange(botCommands); + dbContext.UserSessions.RemoveRange(bot.User.Sessions); + dbContext.PushDevices.RemoveRange(bot.User.PushDevices); + bot.User.IsBlocked = true; + bot.User.BlockedAt = DateTimeOffset.UtcNow; + dbContext.Bots.Remove(bot); + + await dbContext.SaveChangesAsync(cancellationToken); + return NoContent(); + } + + private async Task<Bot?> LoadOwnedBotAsync(Guid botId, Guid ownerUserId, CancellationToken cancellationToken) + { + return await dbContext.Bots + .Include(x => x.User) + .Include(x => x.Commands) + .SingleOrDefaultAsync( + x => x.Id == botId && x.OwnerUserId == ownerUserId, + cancellationToken); + } + + private async Task<string?> ValidateBotDefinitionAsync( + string? username, + string? displayName, + string? about, + Guid? excludingBotId, + CancellationToken cancellationToken) + { + var trimmedUsername = username?.Trim() ?? string.Empty; + var trimmedDisplayName = displayName?.Trim() ?? string.Empty; + var normalizedUsername = trimmedUsername.ToUpperInvariant(); + + if (string.IsNullOrWhiteSpace(trimmedDisplayName)) + { + return "Display name is required."; + } + + if (trimmedDisplayName.Length > 120) + { + return "Display name must be 120 characters or fewer."; + } + + if (!string.IsNullOrWhiteSpace(about) && about.Trim().Length > 70) + { + return "About must be 70 characters or fewer."; + } + + if (!BotUsernameRegex.IsMatch(trimmedUsername) || + !trimmedUsername.EndsWith("bot", StringComparison.OrdinalIgnoreCase)) + { + return "Bot username must contain only latin letters, digits or underscore and end with 'bot'."; + } + + var usernameTaken = await dbContext.Users + .AsNoTracking() + .Include(x => x.BotProfile) + .AnyAsync( + x => x.NormalizedUsername == normalizedUsername && + (!excludingBotId.HasValue || x.BotProfile == null || x.BotProfile.Id != excludingBotId.Value), + cancellationToken); + if (usernameTaken) + { + return "Username is already taken."; + } + + return null; + } + + private static List<BotCommandDto> NormalizeCommands(IReadOnlyList<BotCommandDto> commands) + { + var normalized = new List<BotCommandDto>(); + var seen = new HashSet<string>(StringComparer.OrdinalIgnoreCase); + + foreach (var command in commands ?? Array.Empty<BotCommandDto>()) + { + var normalizedCommand = (command.Command ?? string.Empty).Trim().TrimStart('/'); + var normalizedDescription = (command.Description ?? string.Empty).Trim(); + if (string.IsNullOrWhiteSpace(normalizedCommand) || string.IsNullOrWhiteSpace(normalizedDescription)) + { + continue; + } + + if (!Regex.IsMatch(normalizedCommand, "^[a-z0-9_]{1,32}$", RegexOptions.IgnoreCase)) + { + continue; + } + + if (!seen.Add(normalizedCommand)) + { + continue; + } + + normalized.Add(new BotCommandDto(normalizedCommand.ToLowerInvariant(), normalizedDescription)); + } + + return normalized; + } +} diff --git a/src/Ikar.Server/Controllers/ChatsController.cs b/src/Ikar.Server/Controllers/ChatsController.cs new file mode 100644 index 00000000..f1cf37a2 --- /dev/null +++ b/src/Ikar.Server/Controllers/ChatsController.cs @@ -0,0 +1,3273 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.SignalR; +using Microsoft.EntityFrameworkCore; +using Ikar.Server.Data; +using Ikar.Server.Data.Entities; +using Ikar.Server.Infrastructure; +using Ikar.Server.Infrastructure.Bots; +using Ikar.Server.Infrastructure.Hubs; +using Ikar.Server.Infrastructure.Push; +using Ikar.Server.Infrastructure.Storage; +using Ikar.Shared; +using System.Net.Mime; +using System.Security.Cryptography; + +namespace Ikar.Server.Controllers; + +[ApiController] +[Authorize] +[Route("api/[controller]")] +public sealed class ChatsController( + IkarDbContext dbContext, + PresenceTracker presenceTracker, + IHubContext<MessengerHub> hubContext, + AttachmentStorageService attachmentStorageService, + PushDispatchQueue pushDispatchQueue, + BotUpdateService botUpdateService) : ControllerBase +{ + private const long MaxAttachmentSizeBytes = 25 * 1024 * 1024; + private const long MaxAlbumSizeBytes = 100 * 1024 * 1024; + private const int MaxAlbumAttachments = 10; + private const int DefaultMessagePageSize = 50; + private const int MaxMessagePageSize = 100; + + [HttpGet] + public async Task<ActionResult<IReadOnlyList<ChatSummaryDto>>> GetChats(CancellationToken cancellationToken) + { + var userId = User.GetRequiredUserId(); + + var chats = await dbContext.Chats + .Where(x => x.Members.Any(member => member.UserId == userId)) + .Include(x => x.Members) + .ThenInclude(x => x.User) + .AsNoTracking() + .AsSplitQuery() + .ToListAsync(cancellationToken); + + var chatIds = chats.Select(x => x.Id).ToList(); + var latestMessagesByChatId = await LoadLatestMessagesByChatIdAsync(chatIds, cancellationToken); + var unreadCountsByChatId = await LoadUnreadCountsByChatIdAsync(userId, chatIds, cancellationToken); + + return Ok(chats + .OrderByDescending(x => x.LastActivityAt ?? x.CreatedAt) + .Select(x => x.ToSummaryDto( + userId, + presenceTracker, + latestMessagesByChatId.GetValueOrDefault(x.Id), + unreadCountsByChatId.GetValueOrDefault(x.Id))) + .ToList()); + } + + [HttpGet("folders")] + public async Task<ActionResult<IReadOnlyList<ChatFolderDto>>> GetFolders(CancellationToken cancellationToken) + { + var userId = User.GetRequiredUserId(); + var memberships = await dbContext.ChatMembers + .Where(member => member.UserId == userId) + .Select(member => new + { + member.ChatId, + member.IsArchived, + member.IsPinned, + member.FolderKey, + member.LastReadAt + }) + .ToListAsync(cancellationToken); + + var chatIds = memberships.Select(x => x.ChatId).ToList(); + var unreadCounts = await LoadUnreadCountsByChatIdAsync(userId, chatIds, cancellationToken); + var folders = new List<ChatFolderDto> + { + new("all", "All chats", memberships.Count, unreadCounts.Values.Sum()), + new("unread", "Unread", unreadCounts.Count(x => x.Value > 0), unreadCounts.Values.Sum()), + new("pinned", "Pinned", memberships.Count(x => x.IsPinned), memberships.Where(x => x.IsPinned).Sum(x => unreadCounts.GetValueOrDefault(x.ChatId))), + new("archive", "Archive", memberships.Count(x => x.IsArchived), memberships.Where(x => x.IsArchived).Sum(x => unreadCounts.GetValueOrDefault(x.ChatId))) + }; + + folders.AddRange(memberships + .Where(x => !string.IsNullOrWhiteSpace(x.FolderKey)) + .GroupBy(x => x.FolderKey!) + .OrderBy(group => group.Key, StringComparer.OrdinalIgnoreCase) + .Select(group => new ChatFolderDto( + group.Key, + group.Key, + group.Count(), + group.Sum(x => unreadCounts.GetValueOrDefault(x.ChatId))))); + + return Ok(folders); + } + + [HttpGet("search")] + public async Task<ActionResult<IReadOnlyList<ChatSearchResultDto>>> Search( + [FromQuery] string q, + [FromQuery] string? filter = null, + [FromQuery] string? type = null, + [FromQuery] int page = 1, + [FromQuery] int limit = 50, + [FromQuery] DateTimeOffset? date = null, + [FromQuery] DateTimeOffset? dateFrom = null, + [FromQuery] DateTimeOffset? dateTo = null, + [FromQuery] Guid? authorId = null, + [FromQuery] string? author = null, + CancellationToken cancellationToken = default) + { + var userId = User.GetRequiredUserId(); + var searchPage = await SearchChatsPageAsync( + userId, + q, + BuildSearchFilters(filter, type, date, dateFrom, dateTo, authorId, author), + page, + limit, + cancellationToken); + WriteSearchPageHeaders(searchPage.Page, searchPage.Limit, searchPage.HasMore); + return Ok(searchPage.Results); + } + + [HttpGet("search/page")] + public async Task<ActionResult<ChatSearchPageDto>> SearchPage( + [FromQuery] string q, + [FromQuery] string? filter = null, + [FromQuery] string? type = null, + [FromQuery] int page = 1, + [FromQuery] int limit = 50, + [FromQuery] DateTimeOffset? date = null, + [FromQuery] DateTimeOffset? dateFrom = null, + [FromQuery] DateTimeOffset? dateTo = null, + [FromQuery] Guid? authorId = null, + [FromQuery] string? author = null, + CancellationToken cancellationToken = default) + { + var userId = User.GetRequiredUserId(); + var searchPage = await SearchChatsPageAsync( + userId, + q, + BuildSearchFilters(filter, type, date, dateFrom, dateTo, authorId, author), + page, + limit, + cancellationToken); + return Ok(searchPage); + } + + [HttpGet("{chatId:guid}")] + public async Task<ActionResult<ChatDetailsDto>> GetChat(Guid chatId, CancellationToken cancellationToken) + { + var userId = User.GetRequiredUserId(); + var chat = await LoadChatMetadata( + chatId, + userId, + cancellationToken, + asNoTracking: false, + allowPublicChannelPreview: true); + + if (chat is null) + { + return NotFound(); + } + + var currentMembership = chat.Members.FirstOrDefault(member => member.UserId == userId); + var previousReadAt = currentMembership?.LastReadAt; + var firstUnreadMessageId = previousReadAt is null + ? null + : await dbContext.Messages + .Where(message => + message.ChatId == chatId && + message.SenderId != userId && + message.SentAt > previousReadAt.Value) + .OrderBy(message => message.SentAt) + .Select(message => (Guid?)message.Id) + .FirstOrDefaultAsync(cancellationToken); + + if (currentMembership is not null && chat.Type != ChatType.Channel) + { + await UpdateReadReceiptForOpenedChatAsync(chat, userId, cancellationToken); + } + + var page = await LoadMessagesPageAsync(chat, beforeMessageId: null, DefaultMessagePageSize, cancellationToken); + await MarkChannelMessagesViewedAsync(chat, userId, page.Messages, cancellationToken); + var pinnedMessages = await LoadPinnedMessagesAsync(chat, cancellationToken); + return Ok(chat.ToDetailsDto( + userId, + presenceTracker, + firstUnreadMessageId, + page.Messages, + page.HasMoreMessages, + pinnedMessages)); + } + + [HttpGet("{chatId:guid}/info")] + public async Task<ActionResult<ChatInfoDto>> GetChatInfo(Guid chatId, CancellationToken cancellationToken) + { + var userId = User.GetRequiredUserId(); + var chat = await LoadChatMetadata( + chatId, + userId, + cancellationToken, + allowPublicChannelPreview: true); + if (chat is null) + { + return NotFound(); + } + + var page = await LoadMessagesPageAsync(chat, beforeMessageId: null, DefaultMessagePageSize, cancellationToken); + var pinnedMessages = await LoadPinnedMessagesAsync(chat, cancellationToken); + var details = chat.ToDetailsDto( + userId, + presenceTracker, + messagesOverride: page.Messages, + hasMoreMessages: page.HasMoreMessages, + pinnedMessagesOverride: pinnedMessages); + + var mediaCount = await dbContext.MessageAttachments + .CountAsync(x => + x.Message.ChatId == chatId && + x.Message.DeletedAt == null && + (x.ContentType.StartsWith("image/") || x.ContentType.StartsWith("video/")), + cancellationToken); + var fileCount = await dbContext.MessageAttachments + .CountAsync(x => + x.Message.ChatId == chatId && + x.Message.DeletedAt == null && + !x.ContentType.StartsWith("image/") && + !x.ContentType.StartsWith("video/") && + !x.ContentType.StartsWith("audio/"), + cancellationToken); + var voiceCount = await dbContext.MessageAttachments + .CountAsync(x => x.Message.ChatId == chatId && x.Message.DeletedAt == null && x.ContentType.StartsWith("audio/"), cancellationToken); + var linkCount = await dbContext.Messages + .CountAsync(x => + x.ChatId == chatId && + x.DeletedAt == null && + (x.Text.Contains("http://") || x.Text.Contains("https://")), + cancellationToken); + var pinnedCount = await dbContext.Messages + .CountAsync(x => x.ChatId == chatId && x.DeletedAt == null && x.PinnedAt != null, cancellationToken); + var canInspectInviteLinks = ResolvePermissions(chat, userId).CanInviteUsers; + var inviteLinks = canInspectInviteLinks + ? await dbContext.ChatInviteLinks + .AsNoTracking() + .Where(x => x.ChatId == chatId) + .OrderByDescending(x => x.CreatedAt) + .Take(20) + .ToListAsync(cancellationToken) + : []; + var topics = await LoadChatTopicDtosAsync(chatId, cancellationToken); + + return Ok(new ChatInfoDto( + details, + mediaCount, + fileCount, + linkCount, + voiceCount, + pinnedCount, + topics.Count, + chat.PublicUsername, + inviteLinks.Select(ToInviteLinkDto).ToList(), + topics, + details.SubscriberCount, + details.AdminCount, + chat.LinkedDiscussionChatId, + chat.ChannelSignaturesEnabled, + details.CanManageChannel, + details.CanPostAsChannel, + chat.Description)); + } + + [HttpGet("{chatId:guid}/invite-links")] + public async Task<ActionResult<IReadOnlyList<ChatInviteLinkDto>>> GetInviteLinks(Guid chatId, CancellationToken cancellationToken) + { + var userId = User.GetRequiredUserId(); + var chat = await LoadChatMetadata(chatId, userId, cancellationToken); + if (chat is null) + { + return NotFound(); + } + + if (!ResolvePermissions(chat, userId).CanInviteUsers) + { + return StatusCode(StatusCodes.Status403Forbidden, "You cannot manage invite links in this chat."); + } + + var links = await dbContext.ChatInviteLinks + .AsNoTracking() + .Where(x => x.ChatId == chatId) + .OrderByDescending(x => x.CreatedAt) + .ToListAsync(cancellationToken); + return Ok(links.Select(ToInviteLinkDto).ToList()); + } + + [HttpPost("{chatId:guid}/invite-links")] + public async Task<ActionResult<ChatInviteLinkDto>> CreateInviteLink( + Guid chatId, + CreateChatInviteLinkRequest request, + CancellationToken cancellationToken) + { + var userId = User.GetRequiredUserId(); + var chat = await LoadChatMetadata(chatId, userId, cancellationToken, asNoTracking: false); + if (chat is null) + { + return NotFound(); + } + + if (!ResolvePermissions(chat, userId).CanInviteUsers) + { + return StatusCode(StatusCodes.Status403Forbidden, "You cannot create invite links in this chat."); + } + + if (chat.Type == ChatType.Direct) + { + return BadRequest("Direct chats do not support invite links."); + } + + var link = new ChatInviteLink + { + ChatId = chatId, + CreatedById = userId, + Token = await GenerateInviteTokenAsync(cancellationToken), + Title = TrimToNull(request.Title, 64), + CreatesJoinRequest = request.CreatesJoinRequest, + CreatedAt = DateTimeOffset.UtcNow + }; + + dbContext.ChatInviteLinks.Add(link); + await dbContext.SaveChangesAsync(cancellationToken); + return Ok(ToInviteLinkDto(link)); + } + + [HttpDelete("{chatId:guid}/invite-links/{inviteLinkId:guid}")] + public async Task<IActionResult> RevokeInviteLink(Guid chatId, Guid inviteLinkId, CancellationToken cancellationToken) + { + var userId = User.GetRequiredUserId(); + var chat = await LoadChatMetadata(chatId, userId, cancellationToken); + if (chat is null) + { + return NotFound(); + } + + if (!ResolvePermissions(chat, userId).CanInviteUsers) + { + return StatusCode(StatusCodes.Status403Forbidden, "You cannot revoke invite links in this chat."); + } + + var link = await dbContext.ChatInviteLinks + .SingleOrDefaultAsync(x => x.Id == inviteLinkId && x.ChatId == chatId, cancellationToken); + if (link is null) + { + return NotFound(); + } + + link.IsRevoked = true; + link.RevokedAt = DateTimeOffset.UtcNow; + await dbContext.SaveChangesAsync(cancellationToken); + return NoContent(); + } + + [HttpGet("{chatId:guid}/join-requests")] + public async Task<ActionResult<IReadOnlyList<ChatJoinRequestDto>>> GetJoinRequests(Guid chatId, CancellationToken cancellationToken) + { + var userId = User.GetRequiredUserId(); + var chat = await LoadChatMetadata(chatId, userId, cancellationToken); + if (chat is null) + { + return NotFound(); + } + + if (!CanManageMembers(chat, userId)) + { + return StatusCode(StatusCodes.Status403Forbidden, "Only admins can review join requests."); + } + + var requests = await dbContext.ChatJoinRequests + .AsNoTracking() + .Include(x => x.User) + .ThenInclude(x => x.Sessions) + .Include(x => x.ResolvedByUser) + .ThenInclude(x => x!.Sessions) + .Where(x => x.ChatId == chatId) + .OrderByDescending(x => x.RequestedAt) + .Take(100) + .ToListAsync(cancellationToken); + + return Ok(requests.Select(ToJoinRequestDto).ToList()); + } + + [HttpPost("{chatId:guid}/join-requests/{joinRequestId:guid}")] + public async Task<ActionResult<ChatJoinRequestDto>> ResolveJoinRequest( + Guid chatId, + Guid joinRequestId, + ResolveChatJoinRequestRequest request, + CancellationToken cancellationToken) + { + var userId = User.GetRequiredUserId(); + var chat = await dbContext.Chats + .Include(x => x.Members) + .ThenInclude(x => x.User) + .SingleOrDefaultAsync(x => x.Id == chatId && x.Members.Any(member => member.UserId == userId), cancellationToken); + if (chat is null) + { + return NotFound(); + } + + if (!CanManageMembers(chat, userId)) + { + return StatusCode(StatusCodes.Status403Forbidden, "Only admins can resolve join requests."); + } + + var joinRequest = await dbContext.ChatJoinRequests + .Include(x => x.User) + .ThenInclude(x => x.Sessions) + .Include(x => x.ResolvedByUser) + .ThenInclude(x => x!.Sessions) + .SingleOrDefaultAsync(x => x.Id == joinRequestId && x.ChatId == chatId, cancellationToken); + if (joinRequest is null) + { + return NotFound(); + } + + if (joinRequest.Status != ChatJoinRequestStatus.Pending) + { + return Ok(ToJoinRequestDto(joinRequest)); + } + + joinRequest.Status = request.Approve ? ChatJoinRequestStatus.Approved : ChatJoinRequestStatus.Declined; + joinRequest.ResolvedAt = DateTimeOffset.UtcNow; + joinRequest.ResolvedByUserId = userId; + + if (request.Approve && chat.Members.All(member => member.UserId != joinRequest.UserId)) + { + chat.Members.Add(CreateSubscriberMembership(chat, joinRequest.UserId)); + chat.LastActivityAt = DateTimeOffset.UtcNow; + } + + await AddModerationLogAsync( + userId, + chatId, + ModerationLogTargetType.JoinRequest, + joinRequest.Id, + request.Approve ? "join_request.approved" : "join_request.declined", + null, + cancellationToken); + await dbContext.SaveChangesAsync(cancellationToken); + await NotifyChatsChangedAsync(chat.Members.Select(member => member.UserId).Append(joinRequest.UserId), cancellationToken); + return Ok(ToJoinRequestDto(joinRequest)); + } + + [HttpPost("join/{token}")] + public async Task<ActionResult<ChatDetailsDto>> JoinByInviteLink(string token, CancellationToken cancellationToken) + { + var userId = User.GetRequiredUserId(); + var normalizedToken = token?.Trim() ?? string.Empty; + var invite = await dbContext.ChatInviteLinks + .Include(x => x.Chat) + .ThenInclude(x => x.Members) + .ThenInclude(x => x.User) + .SingleOrDefaultAsync(x => x.Token == normalizedToken && !x.IsRevoked, cancellationToken); + if (invite is null) + { + return NotFound(); + } + + if (invite.Chat.Type == ChatType.Direct) + { + return BadRequest("Direct chats do not support invite links."); + } + + if (invite.CreatesJoinRequest) + { + if (invite.Chat.Members.Any(x => x.UserId == userId)) + { + var existingChat = await LoadChatWithMessages(invite.ChatId, userId, cancellationToken) + ?? throw new InvalidOperationException("Joined chat could not be loaded."); + return Ok(existingChat.ToDetailsDto(userId, presenceTracker)); + } + + var existingRequest = await dbContext.ChatJoinRequests + .SingleOrDefaultAsync(x => x.InviteLinkId == invite.Id && x.UserId == userId, cancellationToken); + if (existingRequest is null) + { + existingRequest = new ChatJoinRequest + { + ChatId = invite.ChatId, + InviteLinkId = invite.Id, + UserId = userId, + RequestedAt = DateTimeOffset.UtcNow + }; + dbContext.ChatJoinRequests.Add(existingRequest); + await AddModerationLogAsync( + userId, + invite.ChatId, + ModerationLogTargetType.JoinRequest, + existingRequest.Id, + "join_request.created", + null, + cancellationToken); + await dbContext.SaveChangesAsync(cancellationToken); + } + + return Accepted(new { joinRequestId = existingRequest.Id, status = existingRequest.Status.ToString() }); + } + + if (!invite.Chat.Members.Any(x => x.UserId == userId)) + { + invite.Chat.Members.Add(CreateSubscriberMembership(invite.Chat, userId)); + invite.Chat.LastActivityAt = DateTimeOffset.UtcNow; + await AddModerationLogAsync(userId, invite.ChatId, ModerationLogTargetType.InviteLink, invite.Id, "invite_link.joined", null, cancellationToken); + await dbContext.SaveChangesAsync(cancellationToken); + var joined = await LoadChatWithMessages(invite.ChatId, userId, cancellationToken) + ?? throw new InvalidOperationException("Joined chat could not be loaded."); + await NotifyChatCreatedAsync(joined, cancellationToken); + return Ok(joined.ToDetailsDto(userId, presenceTracker)); + } + + var loaded = await LoadChatWithMessages(invite.ChatId, userId, cancellationToken) + ?? throw new InvalidOperationException("Joined chat could not be loaded."); + return Ok(loaded.ToDetailsDto(userId, presenceTracker)); + } + + [HttpPost("{chatId:guid}/subscribe")] + public async Task<ActionResult<ChatDetailsDto>> SubscribeToChannel(Guid chatId, CancellationToken cancellationToken) + { + var userId = User.GetRequiredUserId(); + var chat = await dbContext.Chats + .Include(x => x.Members) + .ThenInclude(x => x.User) + .SingleOrDefaultAsync(x => x.Id == chatId && x.Type == ChatType.Channel, cancellationToken); + if (chat is null) + { + return NotFound(); + } + + if (chat.Members.Any(member => member.UserId == userId)) + { + var existing = await LoadChatWithMessages(chatId, userId, cancellationToken) + ?? throw new InvalidOperationException("Subscribed channel could not be loaded."); + return Ok(existing.ToDetailsDto(userId, presenceTracker)); + } + + if (string.IsNullOrWhiteSpace(chat.PublicUsername)) + { + return StatusCode(StatusCodes.Status403Forbidden, "Private channels require an invite link."); + } + + chat.Members.Add(CreateSubscriberMembership(chat, userId)); + chat.LastActivityAt = DateTimeOffset.UtcNow; + await AddModerationLogAsync(userId, chatId, ModerationLogTargetType.User, userId, "channel.subscribed", null, cancellationToken); + await dbContext.SaveChangesAsync(cancellationToken); + + var loaded = await LoadChatWithMessages(chatId, userId, cancellationToken) + ?? throw new InvalidOperationException("Subscribed channel could not be loaded."); + await NotifyChatCreatedAsync(loaded, cancellationToken); + return Ok(loaded.ToDetailsDto(userId, presenceTracker)); + } + + [HttpDelete("{chatId:guid}/subscribe")] + public async Task<IActionResult> UnsubscribeFromChannel(Guid chatId, CancellationToken cancellationToken) + { + var userId = User.GetRequiredUserId(); + var chat = await dbContext.Chats + .Include(x => x.Members) + .SingleOrDefaultAsync(x => x.Id == chatId && x.Type == ChatType.Channel, cancellationToken); + if (chat is null) + { + return NotFound(); + } + + var membership = chat.Members.FirstOrDefault(member => member.UserId == userId); + if (membership is null) + { + return NoContent(); + } + + if (membership.IsOwner || membership.Role == ChatMemberRole.Owner) + { + return BadRequest("Transfer channel ownership before leaving the channel."); + } + + dbContext.ChatMembers.Remove(membership); + await AddModerationLogAsync(userId, chatId, ModerationLogTargetType.User, userId, "channel.unsubscribed", null, cancellationToken); + await dbContext.SaveChangesAsync(cancellationToken); + await NotifyChatsChangedAsync([userId], cancellationToken); + return NoContent(); + } + + [HttpGet("{chatId:guid}/topics")] + public async Task<ActionResult<IReadOnlyList<ChatTopicDto>>> GetTopics(Guid chatId, CancellationToken cancellationToken) + { + var userId = User.GetRequiredUserId(); + var chat = await LoadChatMetadata(chatId, userId, cancellationToken); + if (chat is null) + { + return NotFound(); + } + + return Ok(await LoadChatTopicDtosAsync(chatId, cancellationToken)); + } + + [HttpPost("{chatId:guid}/topics")] + public async Task<ActionResult<ChatTopicDto>> CreateTopic( + Guid chatId, + CreateChatTopicRequest request, + CancellationToken cancellationToken) + { + var userId = User.GetRequiredUserId(); + var chat = await LoadChatMetadata(chatId, userId, cancellationToken, asNoTracking: false); + if (chat is null) + { + return NotFound(); + } + + if (chat.Type == ChatType.Direct) + { + return BadRequest("Direct chats do not support topics."); + } + + if (!CanManageMembers(chat, userId)) + { + return StatusCode(StatusCodes.Status403Forbidden, "Only admins can create topics."); + } + + var title = request.Title?.Trim() ?? string.Empty; + if (title.Length is < 2 or > 80) + { + return ValidationProblem("Topic title must be between 2 and 80 characters."); + } + + var topic = new ChatTopic + { + ChatId = chatId, + CreatedById = userId, + Title = title, + Icon = string.IsNullOrWhiteSpace(request.Icon) ? "💬" : request.Icon.Trim()[..Math.Min(request.Icon.Trim().Length, 8)], + CreatedAt = DateTimeOffset.UtcNow, + LastActivityAt = DateTimeOffset.UtcNow + }; + chat.TopicsEnabled = true; + dbContext.ChatTopics.Add(topic); + await dbContext.SaveChangesAsync(cancellationToken); + return Ok(new ChatTopicDto(topic.Id, topic.ChatId, topic.Title, topic.Icon, topic.IsPinned, topic.IsClosed, topic.CreatedAt, topic.LastActivityAt, 0)); + } + + [HttpGet("{chatId:guid}/messages")] + public async Task<ActionResult<ChatMessagesPageDto>> GetMessages( + Guid chatId, + [FromQuery] Guid? beforeMessageId = null, + [FromQuery] int limit = DefaultMessagePageSize, + CancellationToken cancellationToken = default) + { + var userId = User.GetRequiredUserId(); + var chat = await LoadChatMetadata(chatId, userId, cancellationToken, allowPublicChannelPreview: true); + if (chat is null) + { + return NotFound(); + } + + var page = await LoadMessagesPageAsync(chat, beforeMessageId, limit, cancellationToken); + await MarkChannelMessagesViewedAsync(chat, userId, page.Messages, cancellationToken); + var messages = page.Messages + .Select(message => message.ToDto(presenceTracker, userId)) + .ToList(); + + return Ok(new ChatMessagesPageDto(messages, page.HasMoreMessages)); + } + + [HttpGet("{chatId:guid}/messages/search")] + public async Task<ActionResult<IReadOnlyList<MessageDto>>> SearchMessages( + Guid chatId, + [FromQuery] string q, + [FromQuery] string? filter = null, + [FromQuery] string? type = null, + [FromQuery] int page = 1, + [FromQuery] int limit = 50, + [FromQuery] DateTimeOffset? date = null, + [FromQuery] DateTimeOffset? dateFrom = null, + [FromQuery] DateTimeOffset? dateTo = null, + [FromQuery] Guid? authorId = null, + [FromQuery] string? author = null, + CancellationToken cancellationToken = default) + { + var userId = User.GetRequiredUserId(); + var chat = await LoadChatMetadata(chatId, userId, cancellationToken, allowPublicChannelPreview: true); + if (chat is null) + { + return NotFound(); + } + + var searchPage = await SearchMessagesPageAsync( + chat, + userId, + q, + BuildSearchFilters(filter, type, date, dateFrom, dateTo, authorId, author), + page, + limit, + cancellationToken); + WriteSearchPageHeaders(searchPage.Page, searchPage.Limit, searchPage.HasMore); + return Ok(searchPage.Messages); + } + + [HttpGet("{chatId:guid}/messages/search/page")] + public async Task<ActionResult<MessageSearchPageDto>> SearchMessagesPage( + Guid chatId, + [FromQuery] string q, + [FromQuery] string? filter = null, + [FromQuery] string? type = null, + [FromQuery] int page = 1, + [FromQuery] int limit = 50, + [FromQuery] DateTimeOffset? date = null, + [FromQuery] DateTimeOffset? dateFrom = null, + [FromQuery] DateTimeOffset? dateTo = null, + [FromQuery] Guid? authorId = null, + [FromQuery] string? author = null, + CancellationToken cancellationToken = default) + { + var userId = User.GetRequiredUserId(); + var chat = await LoadChatMetadata(chatId, userId, cancellationToken, allowPublicChannelPreview: true); + if (chat is null) + { + return NotFound(); + } + + return Ok(await SearchMessagesPageAsync( + chat, + userId, + q, + BuildSearchFilters(filter, type, date, dateFrom, dateTo, authorId, author), + page, + limit, + cancellationToken)); + } + + [HttpPut("{chatId:guid}/state")] + public async Task<ActionResult<ChatSummaryDto>> UpdateChatState( + Guid chatId, + ChatStateRequest request, + CancellationToken cancellationToken) + { + var userId = User.GetRequiredUserId(); + var chat = await dbContext.Chats + .Include(x => x.Members) + .ThenInclude(x => x.User) + .SingleOrDefaultAsync( + x => x.Id == chatId && x.Members.Any(member => member.UserId == userId), + cancellationToken); + + if (chat is null) + { + return NotFound(); + } + + var membership = chat.Members.First(member => member.UserId == userId); + membership.IsPinned = request.IsPinned ?? membership.IsPinned; + membership.IsArchived = request.IsArchived ?? membership.IsArchived; + membership.MutedUntil = request.IsMuted switch + { + false => null, + true => request.MutedUntil ?? DateTimeOffset.UtcNow.AddYears(1), + _ => request.MutedUntil ?? membership.MutedUntil + }; + + if (request.FolderKey is not null) + { + membership.FolderKey = NormalizeFolderKey(request.FolderKey); + } + + if (request.HasProtectedContent is not null || request.DefaultMessageTtlSeconds is not null) + { + if (!CanManageMembers(chat, userId)) + { + return StatusCode(StatusCodes.Status403Forbidden, "Only admins can update chat security settings."); + } + + chat.HasProtectedContent = request.HasProtectedContent ?? chat.HasProtectedContent; + if (request.DefaultMessageTtlSeconds is not null) + { + chat.DefaultMessageTtlSeconds = NormalizeTtlSeconds(request.DefaultMessageTtlSeconds, allowNull: true); + } + await AddModerationLogAsync( + userId, + chatId, + ModerationLogTargetType.Chat, + chatId, + "chat.security.updated", + null, + cancellationToken); + } + + if (request.ChannelSignaturesEnabled is not null || request.LinkedDiscussionChatId is not null) + { + if (chat.Type != ChatType.Channel) + { + return BadRequest("Only channels support channel settings."); + } + + if (!CanManageMembers(chat, userId)) + { + return StatusCode(StatusCodes.Status403Forbidden, "Only admins can update channel settings."); + } + + if (request.ChannelSignaturesEnabled is not null) + { + chat.ChannelSignaturesEnabled = request.ChannelSignaturesEnabled.Value; + } + + if (request.LinkedDiscussionChatId is not null) + { + var discussionChatExists = await dbContext.Chats + .AsNoTracking() + .AnyAsync(x => + x.Id == request.LinkedDiscussionChatId.Value && + x.Type == ChatType.Group && + x.Members.Any(member => member.UserId == userId), + cancellationToken); + if (!discussionChatExists) + { + return BadRequest("Linked discussion chat must be an accessible group chat."); + } + + chat.LinkedDiscussionChatId = request.LinkedDiscussionChatId; + } + + await AddModerationLogAsync( + userId, + chatId, + ModerationLogTargetType.Chat, + chatId, + "channel.settings.updated", + null, + cancellationToken); + } + + await dbContext.SaveChangesAsync(cancellationToken); + + var latestMessages = await LoadLatestMessagesByChatIdAsync([chatId], cancellationToken); + var unreadCounts = await LoadUnreadCountsByChatIdAsync(userId, [chatId], cancellationToken); + await NotifyChatsChangedAsync([userId], cancellationToken); + return Ok(chat.ToSummaryDto( + userId, + presenceTracker, + latestMessages.GetValueOrDefault(chatId), + unreadCounts.GetValueOrDefault(chatId))); + } + + [HttpPost("{chatId:guid}/members")] + public async Task<ActionResult<ChatDetailsDto>> AddMembers( + Guid chatId, + AddChatMembersRequest request, + CancellationToken cancellationToken) + { + var userId = User.GetRequiredUserId(); + var requestedMemberIds = (request.MemberIds ?? Array.Empty<Guid>()) + .Where(id => id != Guid.Empty) + .Distinct() + .ToList(); + + if (requestedMemberIds.Count == 0) + { + return BadRequest("At least one member is required."); + } + + if (request.Role is not ChatMemberRole.Member and not ChatMemberRole.Admin) + { + return BadRequest("Members can only be added as a member or admin."); + } + + var chat = await dbContext.Chats + .Include(x => x.Members) + .ThenInclude(x => x.User) + .SingleOrDefaultAsync( + x => x.Id == chatId && x.Members.Any(member => member.UserId == userId), + cancellationToken); + + if (chat is null) + { + return NotFound(); + } + + if (chat.Type != ChatType.Channel) + { + return BadRequest("Only channels support adding members with this endpoint."); + } + + if (!CanManageMembers(chat, userId)) + { + return StatusCode(StatusCodes.Status403Forbidden, "Only admins can add members."); + } + + var existingMemberIds = chat.Members + .Select(member => member.UserId) + .ToHashSet(); + var newMemberIds = requestedMemberIds + .Where(id => !existingMemberIds.Contains(id)) + .ToList(); + + if (newMemberIds.Count == 0) + { + var existing = await LoadChatWithMessages(chatId, userId, cancellationToken) + ?? throw new InvalidOperationException("The chat could not be reloaded."); + var existingPage = await LoadMessagesPageAsync(existing, beforeMessageId: null, DefaultMessagePageSize, cancellationToken); + var existingPinnedMessages = await LoadPinnedMessagesAsync(existing, cancellationToken); + return Ok(existing.ToDetailsDto( + userId, + presenceTracker, + messagesOverride: existingPage.Messages, + hasMoreMessages: existingPage.HasMoreMessages, + pinnedMessagesOverride: existingPinnedMessages)); + } + + var users = await dbContext.Users + .Where(user => newMemberIds.Contains(user.Id) && !user.IsBlocked) + .Select(user => user.Id) + .ToListAsync(cancellationToken); + + if (users.Count != newMemberIds.Count) + { + return BadRequest("Some members do not exist."); + } + + var role = request.Role; + var isAdmin = role == ChatMemberRole.Admin; + var joinedAt = DateTimeOffset.UtcNow; + + foreach (var memberId in newMemberIds) + { + chat.Members.Add(new ChatMember + { + ChatId = chat.Id, + Chat = chat, + UserId = memberId, + Role = role, + IsOwner = false, + CanPinMessages = isAdmin || request.CanPinMessages, + CanDeleteMessages = isAdmin || request.CanDeleteMessages, + CanInviteUsers = isAdmin || request.CanInviteUsers, + CanPostMessages = isAdmin || request.CanPostMessages, + JoinedAt = joinedAt + }); + + await AddModerationLogAsync( + userId, + chatId, + ModerationLogTargetType.User, + memberId, + isAdmin ? "member.admin.added" : "member.added", + null, + cancellationToken); + } + + chat.LastActivityAt = DateTimeOffset.UtcNow; + await dbContext.SaveChangesAsync(cancellationToken); + await NotifyChatsChangedAsync(chat.Members.Select(member => member.UserId).Concat(newMemberIds), cancellationToken); + + var loaded = await LoadChatWithMessages(chatId, userId, cancellationToken) + ?? throw new InvalidOperationException("The chat could not be reloaded."); + var page = await LoadMessagesPageAsync(loaded, beforeMessageId: null, DefaultMessagePageSize, cancellationToken); + var pinnedMessages = await LoadPinnedMessagesAsync(loaded, cancellationToken); + return Ok(loaded.ToDetailsDto( + userId, + presenceTracker, + messagesOverride: page.Messages, + hasMoreMessages: page.HasMoreMessages, + pinnedMessagesOverride: pinnedMessages)); + } + + [HttpPut("{chatId:guid}/members/{memberUserId:guid}/permissions")] + public async Task<ActionResult<ChatDetailsDto>> UpdateMemberPermissions( + Guid chatId, + Guid memberUserId, + UpdateChatMemberPermissionsRequest request, + CancellationToken cancellationToken) + { + var userId = User.GetRequiredUserId(); + var chat = await dbContext.Chats + .Include(x => x.Members) + .ThenInclude(x => x.User) + .SingleOrDefaultAsync( + x => x.Id == chatId && + x.Members.Any(member => member.UserId == userId) && + x.Members.Any(member => member.UserId == memberUserId), + cancellationToken); + + if (chat is null) + { + return NotFound(); + } + + if (!CanManageMembers(chat, userId)) + { + return StatusCode(StatusCodes.Status403Forbidden, "Only admins can update member permissions."); + } + + var target = chat.Members.First(member => member.UserId == memberUserId); + if (target.IsOwner && target.UserId != userId) + { + return BadRequest("Owner permissions cannot be changed by another member."); + } + + target.Role = request.Role; + target.IsOwner = request.Role == ChatMemberRole.Owner; + target.CanPinMessages = request.CanPinMessages; + target.CanDeleteMessages = request.CanDeleteMessages; + target.CanInviteUsers = request.CanInviteUsers; + target.CanPostMessages = request.CanPostMessages; + + await AddModerationLogAsync(userId, chatId, ModerationLogTargetType.User, memberUserId, "member.permissions.updated", null, cancellationToken); + await dbContext.SaveChangesAsync(cancellationToken); + await NotifyChatsChangedAsync(chat.Members.Select(member => member.UserId), cancellationToken); + + var loaded = await LoadChatWithMessages(chatId, userId, cancellationToken) + ?? throw new InvalidOperationException("The chat could not be reloaded."); + var page = await LoadMessagesPageAsync(loaded, beforeMessageId: null, DefaultMessagePageSize, cancellationToken); + var pinnedMessages = await LoadPinnedMessagesAsync(loaded, cancellationToken); + return Ok(loaded.ToDetailsDto(userId, presenceTracker, messagesOverride: page.Messages, hasMoreMessages: page.HasMoreMessages, pinnedMessagesOverride: pinnedMessages)); + } + + [HttpDelete("{chatId:guid}")] + public async Task<IActionResult> DeleteChat( + Guid chatId, + [FromQuery] bool forEveryone = false, + CancellationToken cancellationToken = default) + { + var userId = User.GetRequiredUserId(); + var chat = await dbContext.Chats + .Include(x => x.Members) + .ThenInclude(x => x.User) + .Include(x => x.Messages) + .ThenInclude(x => x.Attachments) + .SingleOrDefaultAsync(x => x.Id == chatId && x.Members.Any(member => member.UserId == userId), cancellationToken); + + if (chat is null) + { + return NotFound(); + } + + var affectedUserIds = chat.Members + .Select(x => x.UserId) + .ToHashSet(); + + if (forEveryone) + { + var currentMembership = chat.Members.First(x => x.UserId == userId); + if (chat.Type != ChatType.Direct && !currentMembership.IsOwner) + { + return StatusCode(StatusCodes.Status403Forbidden, "Only chat owners can delete this chat for everyone."); + } + + var attachmentPaths = chat.Messages + .SelectMany(x => x.Attachments) + .Select(x => x.StoragePath) + .Where(x => !string.IsNullOrWhiteSpace(x)) + .Distinct() + .ToList(); + + dbContext.Chats.Remove(chat); + await dbContext.SaveChangesAsync(cancellationToken); + + DeleteFiles(attachmentPaths); + await NotifyChatsChangedAsync(affectedUserIds, cancellationToken); + return NoContent(); + } + + var membership = chat.Members.FirstOrDefault(x => x.UserId == userId); + if (membership is null) + { + return NotFound(); + } + + dbContext.ChatMembers.Remove(membership); + chat.Members.Remove(membership); + + if (chat.Members.Count == 0) + { + var attachmentPaths = chat.Messages + .SelectMany(x => x.Attachments) + .Select(x => x.StoragePath) + .Where(x => !string.IsNullOrWhiteSpace(x)) + .Distinct() + .ToList(); + + dbContext.Chats.Remove(chat); + await dbContext.SaveChangesAsync(cancellationToken); + + DeleteFiles(attachmentPaths); + await NotifyChatsChangedAsync(affectedUserIds, cancellationToken); + return NoContent(); + } + + if (chat.Type == ChatType.Direct && chat.Members.Count == 1) + { + chat.Title = string.IsNullOrWhiteSpace(membership.User.DisplayName) + ? membership.User.PhoneNumber ?? "Dialog" + : membership.User.DisplayName; + } + + if (chat.CreatedById == userId) + { + var replacementOwner = chat.Members + .OrderByDescending(x => x.IsOwner) + .ThenBy(x => x.JoinedAt) + .First(); + + replacementOwner.IsOwner = true; + replacementOwner.Role = ChatMemberRole.Owner; + replacementOwner.CanDeleteMessages = true; + replacementOwner.CanPinMessages = true; + replacementOwner.CanInviteUsers = true; + replacementOwner.CanPostMessages = true; + chat.CreatedById = replacementOwner.UserId; + } + + if (chat.Type == ChatType.Channel && chat.Members.All(x => !x.IsOwner)) + { + var replacementChannelOwner = chat.Members + .OrderBy(x => x.JoinedAt) + .First(); + replacementChannelOwner.IsOwner = true; + replacementChannelOwner.Role = ChatMemberRole.Owner; + replacementChannelOwner.CanDeleteMessages = true; + replacementChannelOwner.CanPinMessages = true; + replacementChannelOwner.CanInviteUsers = true; + replacementChannelOwner.CanPostMessages = true; + } + + chat.LastActivityAt = chat.Messages + .OrderByDescending(x => x.SentAt) + .Select(x => (DateTimeOffset?)x.SentAt) + .FirstOrDefault() ?? chat.CreatedAt; + + await dbContext.SaveChangesAsync(cancellationToken); + await NotifyChatsChangedAsync(affectedUserIds, cancellationToken); + return NoContent(); + } + + [HttpDelete("{chatId:guid}/history")] + public async Task<IActionResult> ClearChatHistory(Guid chatId, CancellationToken cancellationToken = default) + { + var userId = User.GetRequiredUserId(); + var chat = await dbContext.Chats + .Include(x => x.Members) + .ThenInclude(x => x.User) + .Include(x => x.Messages) + .ThenInclude(x => x.Attachments) + .SingleOrDefaultAsync(x => x.Id == chatId && x.Members.Any(member => member.UserId == userId), cancellationToken); + + if (chat is null) + { + return NotFound(); + } + + var hasBotPeer = chat.Type == ChatType.Direct && + chat.Members.Any(member => member.UserId != userId && member.User.IsBot); + if (!hasBotPeer) + { + return StatusCode( + StatusCodes.Status403Forbidden, + "Chat history can only be cleared in direct chats with bots."); + } + + var attachmentPaths = chat.Messages + .SelectMany(x => x.Attachments) + .Select(x => x.StoragePath) + .Where(x => !string.IsNullOrWhiteSpace(x)) + .Distinct() + .ToList(); + + var attachments = chat.Messages + .SelectMany(x => x.Attachments) + .ToList(); + var messages = chat.Messages.ToList(); + + dbContext.MessageAttachments.RemoveRange(attachments); + dbContext.Messages.RemoveRange(messages); + chat.LastActivityAt = chat.CreatedAt; + + await dbContext.SaveChangesAsync(cancellationToken); + + DeleteFiles(attachmentPaths); + await NotifyChatsChangedAsync(chat.Members.Select(x => x.UserId), cancellationToken); + return NoContent(); + } + + [HttpPost("direct")] + public async Task<ActionResult<ChatDetailsDto>> CreateDirectChat(CreateDirectChatRequest request, CancellationToken cancellationToken) + { + var currentUserId = User.GetRequiredUserId(); + if (request.UserId == currentUserId) + { + return BadRequest("You cannot create a direct chat with yourself."); + } + + var otherUserExists = await dbContext.Users.AnyAsync(x => x.Id == request.UserId && !x.IsBlocked, cancellationToken); + if (!otherUserExists) + { + return NotFound("User not found."); + } + + if (await IsBlockedByPrivacyAsync(currentUserId, request.UserId, cancellationToken) || + await IsBlockedByPrivacyAsync(request.UserId, currentUserId, cancellationToken)) + { + return StatusCode(StatusCodes.Status403Forbidden, "Direct chats are blocked by privacy settings."); + } + + var existingChat = await dbContext.Chats + .Include(x => x.Members) + .ThenInclude(x => x.User) + .Include(x => x.Messages) + .ThenInclude(x => x.Sender) + .Include(x => x.Messages) + .ThenInclude(x => x.Attachments) + .AsSplitQuery() + .SingleOrDefaultAsync(x => + x.Type == ChatType.Direct && + x.Members.Count == 2 && + x.Members.Any(m => m.UserId == currentUserId) && + x.Members.Any(m => m.UserId == request.UserId), + cancellationToken); + + if (existingChat is not null) + { + return Ok(existingChat.ToDetailsDto(currentUserId, presenceTracker)); + } + + var chat = new Chat + { + Type = ChatType.Direct, + CreatedById = currentUserId, + LastActivityAt = DateTimeOffset.UtcNow, + Members = + [ + new ChatMember { UserId = currentUserId, IsOwner = true, Role = ChatMemberRole.Owner, CanDeleteMessages = true }, + new ChatMember { UserId = request.UserId, IsOwner = false } + ] + }; + + dbContext.Chats.Add(chat); + await dbContext.SaveChangesAsync(cancellationToken); + + var loaded = await LoadChatWithMessages(chat.Id, currentUserId, cancellationToken) + ?? throw new InvalidOperationException("Newly created chat could not be loaded."); + + await NotifyChatCreatedAsync(loaded, cancellationToken); + return Ok(loaded.ToDetailsDto(currentUserId, presenceTracker)); + } + + [HttpPost("group")] + public async Task<ActionResult<ChatDetailsDto>> CreateGroupChat(CreateGroupChatRequest request, CancellationToken cancellationToken) + { + var currentUserId = User.GetRequiredUserId(); + var title = request.Title?.Trim() ?? string.Empty; + var memberIds = (request.MemberIds ?? Array.Empty<Guid>()) + .Append(currentUserId) + .Distinct() + .ToList(); + + if (string.IsNullOrWhiteSpace(title) || memberIds.Count < 3) + { + return BadRequest("A title and at least 2 invited members are required for a group chat."); + } + + var users = await dbContext.Users + .Where(x => memberIds.Contains(x.Id) && !x.IsBlocked) + .Select(x => x.Id) + .ToListAsync(cancellationToken); + + if (users.Count != memberIds.Count) + { + return BadRequest("Some group members do not exist."); + } + + var chat = new Chat + { + Type = ChatType.Group, + Title = title, + CreatedById = currentUserId, + LastActivityAt = DateTimeOffset.UtcNow, + Members = memberIds + .Select(x => new ChatMember + { + UserId = x, + IsOwner = x == currentUserId, + Role = x == currentUserId ? ChatMemberRole.Owner : ChatMemberRole.Member, + CanDeleteMessages = x == currentUserId + }) + .ToList() + }; + + dbContext.Chats.Add(chat); + await dbContext.SaveChangesAsync(cancellationToken); + + var loaded = await LoadChatWithMessages(chat.Id, currentUserId, cancellationToken) + ?? throw new InvalidOperationException("Newly created group chat could not be loaded."); + + await NotifyChatCreatedAsync(loaded, cancellationToken); + return Ok(loaded.ToDetailsDto(currentUserId, presenceTracker)); + } + + [HttpPost("channel")] + public async Task<ActionResult<ChatDetailsDto>> CreateChannel(CreateChannelRequest request, CancellationToken cancellationToken) + { + var currentUserId = User.GetRequiredUserId(); + var title = request.Title?.Trim() ?? string.Empty; + var description = TrimToNull(request.Description, 255); + var memberIds = (request.MemberIds ?? Array.Empty<Guid>()) + .Append(currentUserId) + .Distinct() + .ToList(); + string? publicUsername; + + if (string.IsNullOrWhiteSpace(title)) + { + return BadRequest("Channel title is required."); + } + + try + { + publicUsername = NormalizePublicUsername(request.PublicUsername); + } + catch (InvalidOperationException ex) + { + return BadRequest(ex.Message); + } + + if (publicUsername is not null) + { + var usernameTaken = await dbContext.Chats + .AnyAsync(x => x.PublicUsername == publicUsername, cancellationToken); + if (usernameTaken) + { + return Conflict("Public username is already taken."); + } + } + + var users = await dbContext.Users + .Where(x => memberIds.Contains(x.Id) && !x.IsBlocked) + .Select(x => x.Id) + .ToListAsync(cancellationToken); + + if (users.Count != memberIds.Count) + { + return BadRequest("Some channel members do not exist."); + } + + var chat = new Chat + { + Type = ChatType.Channel, + Title = title, + Description = description, + PublicUsername = publicUsername, + ChannelSignaturesEnabled = request.ChannelSignaturesEnabled, + CreatedById = currentUserId, + LastActivityAt = DateTimeOffset.UtcNow, + Members = memberIds + .Select(x => new ChatMember + { + UserId = x, + IsOwner = x == currentUserId, + Role = x == currentUserId ? ChatMemberRole.Owner : ChatMemberRole.Member, + CanPinMessages = x == currentUserId, + CanDeleteMessages = x == currentUserId, + CanInviteUsers = x == currentUserId, + CanPostMessages = x == currentUserId + }) + .ToList() + }; + + dbContext.Chats.Add(chat); + if (publicUsername is null && request.CreateInviteLink) + { + dbContext.ChatInviteLinks.Add(new ChatInviteLink + { + ChatId = chat.Id, + CreatedById = currentUserId, + Token = await GenerateInviteTokenAsync(cancellationToken), + Title = "Основная ссылка", + CreatedAt = DateTimeOffset.UtcNow + }); + } + + await dbContext.SaveChangesAsync(cancellationToken); + + var loaded = await LoadChatWithMessages(chat.Id, currentUserId, cancellationToken) + ?? throw new InvalidOperationException("Newly created channel could not be loaded."); + + await NotifyChatCreatedAsync(loaded, cancellationToken); + return Ok(loaded.ToDetailsDto(currentUserId, presenceTracker)); + } + + [HttpPost("{chatId:guid}/messages")] + public async Task<ActionResult<MessageDto>> SendMessage(Guid chatId, SendMessageRequest request, CancellationToken cancellationToken) + { + var userId = User.GetRequiredUserId(); + var text = request.Text?.Trim() ?? string.Empty; + if (string.IsNullOrWhiteSpace(text)) + { + return BadRequest("Message text is required."); + } + + var chat = await dbContext.Chats + .Include(x => x.Members) + .FirstOrDefaultAsync(x => x.Id == chatId && x.Members.Any(m => m.UserId == userId), cancellationToken); + + if (chat is null) + { + return NotFound(); + } + + if (!CanUserPublish(chat, userId)) + { + return StatusCode(StatusCodes.Status403Forbidden, "Only channel owners can publish."); + } + + var replyToMessage = await ResolveReplyTargetAsync(chatId, request.ReplyToMessageId, userId, cancellationToken); + if (request.ReplyToMessageId is not null && replyToMessage is null) + { + return NotFound("The replied message was not found."); + } + + if (request.TopicId is not null) + { + var topic = await dbContext.ChatTopics + .SingleOrDefaultAsync(x => x.Id == request.TopicId.Value && x.ChatId == chatId, cancellationToken); + if (topic is null || topic.IsClosed) + { + return NotFound("The topic was not found."); + } + topic.LastActivityAt = DateTimeOffset.UtcNow; + } + + var sender = await dbContext.Users.SingleAsync(x => x.Id == userId, cancellationToken); + var ttlSeconds = NormalizeTtlSeconds(request.TtlSeconds ?? chat.DefaultMessageTtlSeconds, allowNull: true); + var sentAt = DateTimeOffset.UtcNow; + var message = new Message + { + ChatId = chatId, + Chat = chat, + SenderId = userId, + Sender = sender, + PostedAsChannel = ShouldPostAsChannel(chat), + AuthorSignature = ResolveChannelAuthorSignature(chat, sender), + Text = text, + ReplyToMessageId = replyToMessage?.Id, + ReplyToMessage = replyToMessage, + TopicId = request.TopicId, + HasProtectedContent = request.HasProtectedContent ?? chat.HasProtectedContent, + TtlSeconds = ttlSeconds, + ExpiresAt = ttlSeconds is null ? null : sentAt.AddSeconds(ttlSeconds.Value), + SentAt = sentAt + }; + + chat.LastActivityAt = message.SentAt; + dbContext.Messages.Add(message); + await dbContext.SaveChangesAsync(cancellationToken); + + var loadedMessage = await LoadMessageForMemberAsync(chatId, message.Id, userId, cancellationToken) + ?? throw new InvalidOperationException("The created message could not be reloaded."); + + var dto = loadedMessage.ToDto(presenceTracker, userId); + await NotifyMessageCreatedAsync(loadedMessage.Chat, loadedMessage, cancellationToken); + await botUpdateService.EnqueueIncomingMessageAsync(loadedMessage.Id, cancellationToken); + await pushDispatchQueue.EnqueueAsync(chat.Id, message.Id); + + return Ok(dto); + } + + [HttpPost("{chatId:guid}/messages/{messageId:guid}/forward")] + public async Task<ActionResult<MessageDto>> ForwardMessage( + Guid chatId, + Guid messageId, + ForwardMessageRequest request, + CancellationToken cancellationToken) + { + var userId = User.GetRequiredUserId(); + var sourceMessage = await LoadMessageForMemberAsync(chatId, messageId, userId, cancellationToken); + if (sourceMessage is null) + { + return NotFound(); + } + + if (sourceMessage.DeletedAt is not null) + { + return BadRequest("Deleted messages cannot be forwarded."); + } + + if (sourceMessage.HasProtectedContent || sourceMessage.Chat.HasProtectedContent) + { + return BadRequest("Protected messages cannot be forwarded."); + } + + var targetChat = await dbContext.Chats + .Include(x => x.Members) + .FirstOrDefaultAsync( + x => x.Id == request.TargetChatId && + x.Members.Any(member => member.UserId == userId), + cancellationToken); + if (targetChat is null) + { + return NotFound(); + } + + if (!CanUserPublish(targetChat, userId)) + { + return StatusCode(StatusCodes.Status403Forbidden, "Only channel owners can publish."); + } + + var sender = await dbContext.Users.SingleAsync(x => x.Id == userId, cancellationToken); + var ttlSeconds = NormalizeTtlSeconds(targetChat.DefaultMessageTtlSeconds, allowNull: true); + var sentAt = DateTimeOffset.UtcNow; + var forwardedMessage = new Message + { + ChatId = targetChat.Id, + Chat = targetChat, + SenderId = userId, + Sender = sender, + PostedAsChannel = ShouldPostAsChannel(targetChat), + AuthorSignature = ResolveChannelAuthorSignature(targetChat, sender), + Text = sourceMessage.Text, + ForwardedFromDisplayName = ResolveForwardedFromDisplayName(sourceMessage), + MediaAlbumId = sourceMessage.MediaAlbumId is null ? null : Guid.NewGuid(), + HasProtectedContent = targetChat.HasProtectedContent, + TtlSeconds = ttlSeconds, + ExpiresAt = ttlSeconds is null ? null : sentAt.AddSeconds(ttlSeconds.Value), + SentAt = sentAt + }; + + var clonedAttachments = new List<MessageAttachment>(); + try + { + foreach (var sourceAttachment in sourceMessage.Attachments) + { + var clonedAttachment = await attachmentStorageService.CloneAsync( + forwardedMessage.Id, + sourceAttachment, + cancellationToken); + clonedAttachments.Add(clonedAttachment); + forwardedMessage.Attachments.Add(clonedAttachment); + } + + targetChat.LastActivityAt = forwardedMessage.SentAt; + dbContext.Messages.Add(forwardedMessage); + await dbContext.SaveChangesAsync(cancellationToken); + } + catch + { + foreach (var clonedAttachment in clonedAttachments) + { + attachmentStorageService.DeleteIfExists(clonedAttachment.StoragePath); + } + + throw; + } + + var loadedForwardedMessage = await LoadMessageForMemberAsync(targetChat.Id, forwardedMessage.Id, userId, cancellationToken) + ?? throw new InvalidOperationException("The forwarded message could not be reloaded."); + + var dto = loadedForwardedMessage.ToDto(presenceTracker, userId); + await NotifyMessageCreatedAsync(loadedForwardedMessage.Chat, loadedForwardedMessage, cancellationToken); + await botUpdateService.EnqueueIncomingMessageAsync(loadedForwardedMessage.Id, cancellationToken); + await pushDispatchQueue.EnqueueAsync(targetChat.Id, forwardedMessage.Id); + return Ok(dto); + } + + [HttpPost("{chatId:guid}/messages/delivered")] + public Task<IActionResult> AcknowledgeDelivered( + Guid chatId, + UpdateMessageReceiptRequest request, + CancellationToken cancellationToken) => + AcknowledgeMessageReceiptAsync(chatId, request.MessageId, User.GetRequiredUserId(), markRead: false, cancellationToken); + + [HttpPost("{chatId:guid}/messages/read")] + public Task<IActionResult> AcknowledgeRead( + Guid chatId, + UpdateMessageReceiptRequest request, + CancellationToken cancellationToken) => + AcknowledgeMessageReceiptAsync(chatId, request.MessageId, User.GetRequiredUserId(), markRead: true, cancellationToken); + + [HttpPut("{chatId:guid}/messages/{messageId:guid}/reaction")] + public async Task<ActionResult<MessageDto>> SetReaction( + Guid chatId, + Guid messageId, + SetMessageReactionRequest request, + CancellationToken cancellationToken) + { + var userId = User.GetRequiredUserId(); + var emoji = request.Emoji?.Trim() ?? string.Empty; + if (string.IsNullOrWhiteSpace(emoji)) + { + return BadRequest("Reaction emoji is required."); + } + + if (emoji.Length > 24) + { + return BadRequest("Reaction emoji is too long."); + } + + var message = await LoadMessageForMemberAsync(chatId, messageId, userId, cancellationToken); + if (message is null) + { + return NotFound(); + } + + if (message.DeletedAt is not null) + { + return BadRequest("Deleted messages cannot be reacted to."); + } + + var shouldNotifyReaction = false; + var existingReaction = message.Reactions.FirstOrDefault(reaction => reaction.UserId == userId); + if (existingReaction is not null && string.Equals(existingReaction.Emoji, emoji, StringComparison.Ordinal)) + { + dbContext.MessageReactions.Remove(existingReaction); + } + else if (existingReaction is not null) + { + existingReaction.Emoji = emoji; + existingReaction.CreatedAt = DateTimeOffset.UtcNow; + shouldNotifyReaction = message.SenderId != userId; + } + else + { + dbContext.MessageReactions.Add(new MessageReaction + { + MessageId = message.Id, + UserId = userId, + Emoji = emoji, + CreatedAt = DateTimeOffset.UtcNow + }); + shouldNotifyReaction = message.SenderId != userId; + } + + await dbContext.SaveChangesAsync(cancellationToken); + + var updatedMessage = await LoadMessageForMemberAsync(chatId, messageId, userId, cancellationToken) + ?? throw new InvalidOperationException("The reacted message could not be reloaded."); + + var dto = updatedMessage.ToDto(presenceTracker, userId); + await NotifyMessageUpdatedAsync(updatedMessage.Chat, [updatedMessage], cancellationToken); + if (shouldNotifyReaction) + { + await pushDispatchQueue.EnqueueReactionAsync( + chatId, + messageId, + userId, + emoji, + cancellationToken); + } + + return Ok(dto); + } + + [HttpPut("{chatId:guid}/messages/{messageId:guid}/pin")] + public Task<ActionResult<MessageDto>> PinMessage(Guid chatId, Guid messageId, CancellationToken cancellationToken) => + SetMessagePinAsync(chatId, messageId, isPinned: true, cancellationToken); + + [HttpDelete("{chatId:guid}/messages/{messageId:guid}/pin")] + public Task<ActionResult<MessageDto>> UnpinMessage(Guid chatId, Guid messageId, CancellationToken cancellationToken) => + SetMessagePinAsync(chatId, messageId, isPinned: false, cancellationToken); + + [HttpPost("{chatId:guid}/attachments")] + [RequestFormLimits(MultipartBodyLengthLimit = MaxAttachmentSizeBytes)] + [RequestSizeLimit(MaxAttachmentSizeBytes)] + public async Task<ActionResult<MessageDto>> UploadAttachment( + Guid chatId, + [FromForm] UploadAttachmentRequest request, + CancellationToken cancellationToken) + { + var userId = User.GetRequiredUserId(); + if (request.File is null) + { + return BadRequest("File is required."); + } + + if (request.File.Length <= 0) + { + return BadRequest("File is empty."); + } + + if (request.File.Length > MaxAttachmentSizeBytes) + { + return BadRequest($"File exceeds {MaxAttachmentSizeBytes} bytes."); + } + + var chat = await dbContext.Chats + .Include(x => x.Members) + .FirstOrDefaultAsync(x => x.Id == chatId && x.Members.Any(m => m.UserId == userId), cancellationToken); + + if (chat is null) + { + return NotFound(); + } + + if (!CanUserPublish(chat, userId)) + { + return StatusCode(StatusCodes.Status403Forbidden, "Only channel owners can publish."); + } + + var replyToMessage = await ResolveReplyTargetAsync(chatId, request.ReplyToMessageId, userId, cancellationToken); + if (request.ReplyToMessageId is not null && replyToMessage is null) + { + return NotFound("The replied message was not found."); + } + + if (request.TopicId is not null) + { + var topic = await dbContext.ChatTopics + .SingleOrDefaultAsync(x => x.Id == request.TopicId.Value && x.ChatId == chatId, cancellationToken); + if (topic is null || topic.IsClosed) + { + return NotFound("The topic was not found."); + } + topic.LastActivityAt = DateTimeOffset.UtcNow; + } + + var sender = await dbContext.Users.SingleAsync(x => x.Id == userId, cancellationToken); + var text = request.Text?.Trim() ?? string.Empty; + var ttlSeconds = NormalizeTtlSeconds(request.TtlSeconds ?? chat.DefaultMessageTtlSeconds, allowNull: true); + var sentAt = DateTimeOffset.UtcNow; + var message = new Message + { + ChatId = chatId, + Chat = chat, + SenderId = userId, + Sender = sender, + PostedAsChannel = ShouldPostAsChannel(chat), + AuthorSignature = ResolveChannelAuthorSignature(chat, sender), + Text = text, + ReplyToMessageId = replyToMessage?.Id, + ReplyToMessage = replyToMessage, + TopicId = request.TopicId, + HasProtectedContent = request.HasProtectedContent ?? chat.HasProtectedContent, + TtlSeconds = ttlSeconds, + ExpiresAt = ttlSeconds is null ? null : sentAt.AddSeconds(ttlSeconds.Value), + SentAt = sentAt + }; + + MessageAttachment? attachment = null; + try + { + attachment = await attachmentStorageService.SaveAsync(message.Id, request.File, cancellationToken); + message.Attachments.Add(attachment); + chat.LastActivityAt = message.SentAt; + dbContext.Messages.Add(message); + await dbContext.SaveChangesAsync(cancellationToken); + } + catch + { + if (attachment is not null) + { + attachmentStorageService.DeleteIfExists(attachment.StoragePath); + } + + throw; + } + + var loadedMessage = await LoadMessageForMemberAsync(chatId, message.Id, userId, cancellationToken) + ?? throw new InvalidOperationException("The uploaded message could not be reloaded."); + + var dto = loadedMessage.ToDto(presenceTracker, userId); + await NotifyMessageCreatedAsync(loadedMessage.Chat, loadedMessage, cancellationToken); + await botUpdateService.EnqueueIncomingMessageAsync(loadedMessage.Id, cancellationToken); + await pushDispatchQueue.EnqueueAsync(chat.Id, message.Id); + + return Ok(dto); + } + + [HttpPost("{chatId:guid}/attachments/album")] + [RequestFormLimits(MultipartBodyLengthLimit = MaxAlbumSizeBytes)] + [RequestSizeLimit(MaxAlbumSizeBytes)] + public async Task<ActionResult<MessageDto>> UploadAttachmentAlbum( + Guid chatId, + [FromForm] UploadAttachmentAlbumRequest request, + CancellationToken cancellationToken) + { + var userId = User.GetRequiredUserId(); + var files = request.Files + .Where(file => file is not null) + .ToList(); + + if (files.Count == 0) + { + return BadRequest("At least one file is required."); + } + + if (files.Count > MaxAlbumAttachments) + { + return BadRequest($"Albums can contain up to {MaxAlbumAttachments} files."); + } + + if (files.Any(file => file.Length <= 0)) + { + return BadRequest("Album contains an empty file."); + } + + if (files.Any(file => file.Length > MaxAttachmentSizeBytes) || files.Sum(file => file.Length) > MaxAlbumSizeBytes) + { + return BadRequest($"Album exceeds {MaxAlbumSizeBytes} bytes or contains a file over {MaxAttachmentSizeBytes} bytes."); + } + + var chat = await dbContext.Chats + .Include(x => x.Members) + .FirstOrDefaultAsync(x => x.Id == chatId && x.Members.Any(m => m.UserId == userId), cancellationToken); + + if (chat is null) + { + return NotFound(); + } + + if (!CanUserPublish(chat, userId)) + { + return StatusCode(StatusCodes.Status403Forbidden, "You cannot publish in this chat."); + } + + var replyToMessage = await ResolveReplyTargetAsync(chatId, request.ReplyToMessageId, userId, cancellationToken); + if (request.ReplyToMessageId is not null && replyToMessage is null) + { + return NotFound("The replied message was not found."); + } + + if (request.TopicId is not null) + { + var topic = await dbContext.ChatTopics + .SingleOrDefaultAsync(x => x.Id == request.TopicId.Value && x.ChatId == chatId, cancellationToken); + if (topic is null || topic.IsClosed) + { + return NotFound("The topic was not found."); + } + topic.LastActivityAt = DateTimeOffset.UtcNow; + } + + var sender = await dbContext.Users.SingleAsync(x => x.Id == userId, cancellationToken); + var ttlSeconds = NormalizeTtlSeconds(request.TtlSeconds ?? chat.DefaultMessageTtlSeconds, allowNull: true); + var sentAt = DateTimeOffset.UtcNow; + var message = new Message + { + ChatId = chatId, + Chat = chat, + SenderId = userId, + Sender = sender, + PostedAsChannel = ShouldPostAsChannel(chat), + AuthorSignature = ResolveChannelAuthorSignature(chat, sender), + Text = request.Text?.Trim() ?? string.Empty, + ReplyToMessageId = replyToMessage?.Id, + ReplyToMessage = replyToMessage, + TopicId = request.TopicId, + MediaAlbumId = Guid.NewGuid(), + HasProtectedContent = request.HasProtectedContent ?? chat.HasProtectedContent, + TtlSeconds = ttlSeconds, + ExpiresAt = ttlSeconds is null ? null : sentAt.AddSeconds(ttlSeconds.Value), + SentAt = sentAt + }; + + var savedAttachments = new List<MessageAttachment>(); + try + { + for (var index = 0; index < files.Count; index++) + { + var attachment = await attachmentStorageService.SaveAsync(message.Id, files[index], cancellationToken, sortOrder: index); + savedAttachments.Add(attachment); + message.Attachments.Add(attachment); + } + + chat.LastActivityAt = message.SentAt; + dbContext.Messages.Add(message); + await dbContext.SaveChangesAsync(cancellationToken); + } + catch + { + foreach (var attachment in savedAttachments) + { + attachmentStorageService.DeleteIfExists(attachment.StoragePath); + } + + throw; + } + + var loadedMessage = await LoadMessageForMemberAsync(chatId, message.Id, userId, cancellationToken) + ?? throw new InvalidOperationException("The uploaded album could not be reloaded."); + + var dto = loadedMessage.ToDto(presenceTracker, userId); + await NotifyMessageCreatedAsync(loadedMessage.Chat, loadedMessage, cancellationToken); + await botUpdateService.EnqueueIncomingMessageAsync(loadedMessage.Id, cancellationToken); + await pushDispatchQueue.EnqueueAsync(chat.Id, message.Id); + + return Ok(dto); + } + + [HttpPut("{chatId:guid}/messages/{messageId:guid}")] + public async Task<ActionResult<MessageDto>> UpdateMessage( + Guid chatId, + Guid messageId, + UpdateMessageRequest request, + CancellationToken cancellationToken) + { + var userId = User.GetRequiredUserId(); + var message = await LoadMessageForMemberAsync(chatId, messageId, userId, cancellationToken); + if (message is null) + { + return NotFound(); + } + + if (message.SenderId != userId) + { + return StatusCode(StatusCodes.Status403Forbidden, "Only the message author can edit it."); + } + + if (message.DeletedAt is not null) + { + return BadRequest("Deleted messages cannot be edited."); + } + + var text = request.Text?.Trim() ?? string.Empty; + if (string.IsNullOrWhiteSpace(text) && message.Attachments.Count == 0) + { + return BadRequest("Message text is required."); + } + + message.Text = text; + message.EditedAt = DateTimeOffset.UtcNow; + await dbContext.SaveChangesAsync(cancellationToken); + + var updatedMessage = await LoadMessageForMemberAsync(chatId, messageId, userId, cancellationToken) + ?? throw new InvalidOperationException("The updated message could not be reloaded."); + + var dto = updatedMessage.ToDto(presenceTracker, userId); + await NotifyMessageUpdatedAsync(updatedMessage.Chat, [updatedMessage], cancellationToken); + return Ok(dto); + } + + [HttpDelete("{chatId:guid}/messages/{messageId:guid}")] + public async Task<ActionResult<MessageDto>> DeleteMessage(Guid chatId, Guid messageId, CancellationToken cancellationToken) + { + var userId = User.GetRequiredUserId(); + var message = await LoadMessageForMemberAsync(chatId, messageId, userId, cancellationToken); + if (message is null) + { + return NotFound(); + } + + if (message.DeletedAt is not null) + { + return Ok(message.ToDto(presenceTracker, userId)); + } + + if (message.SenderId != userId && !ResolvePermissions(message.Chat, userId).CanDeleteMessages) + { + return StatusCode(StatusCodes.Status403Forbidden, "You cannot delete this message."); + } + + var attachments = message.Attachments.ToList(); + foreach (var attachment in attachments) + { + attachmentStorageService.DeleteIfExists(attachment.StoragePath); + } + + if (message.Reactions.Count > 0) + { + dbContext.MessageReactions.RemoveRange(message.Reactions); + message.Reactions.Clear(); + } + + dbContext.MessageAttachments.RemoveRange(attachments); + message.Attachments.Clear(); + message.Text = string.Empty; + message.EditedAt = null; + message.DeletedAt = DateTimeOffset.UtcNow; + message.PinnedAt = null; + message.PinnedByUserId = null; + message.PinnedByUser = null; + await AddModerationLogAsync(userId, chatId, ModerationLogTargetType.Message, messageId, "message.deleted", null, cancellationToken); + await dbContext.SaveChangesAsync(cancellationToken); + + var updatedMessage = await LoadMessageForMemberAsync(chatId, messageId, userId, cancellationToken) + ?? throw new InvalidOperationException("The deleted message could not be reloaded."); + + var dto = updatedMessage.ToDto(presenceTracker, userId); + await NotifyMessageUpdatedAsync(updatedMessage.Chat, [updatedMessage], cancellationToken); + return Ok(dto); + } + + [HttpGet("{chatId:guid}/attachments/{attachmentId:guid}/content")] + public async Task<IActionResult> DownloadAttachment(Guid chatId, Guid attachmentId, CancellationToken cancellationToken) + { + var userId = User.GetRequiredUserId(); + var attachment = await dbContext.MessageAttachments + .Include(x => x.Message) + .ThenInclude(x => x.Chat) + .ThenInclude(x => x.Members) + .SingleOrDefaultAsync( + x => x.Id == attachmentId && + x.Message.ChatId == chatId && + x.Message.Chat.Members.Any(m => m.UserId == userId), + cancellationToken); + + if (attachment is null || !System.IO.File.Exists(attachment.StoragePath)) + { + return NotFound(); + } + + var stream = System.IO.File.OpenRead(attachment.StoragePath); + return File(stream, string.IsNullOrWhiteSpace(attachment.ContentType) ? MediaTypeNames.Application.Octet : attachment.ContentType, attachment.OriginalFileName); + } + + [HttpPost("messages/cleanup-expired")] + public async Task<ActionResult<ExpiredMessagesCleanupDto>> CleanupExpiredMessages(CancellationToken cancellationToken) + { + var userId = User.GetRequiredUserId(); + var now = DateTimeOffset.UtcNow; + var messages = await dbContext.Messages + .Include(x => x.Chat) + .ThenInclude(x => x.Members) + .Include(x => x.Attachments) + .Include(x => x.Reactions) + .Include(x => x.Views) + .Where(x => + x.ExpiresAt != null && + x.ExpiresAt <= now && + x.DeletedAt == null && + x.Chat.Members.Any(member => member.UserId == userId)) + .Take(250) + .ToListAsync(cancellationToken); + + var affectedChats = messages + .Select(x => x.Chat) + .DistinctBy(x => x.Id) + .ToList(); + + foreach (var message in messages) + { + DeleteFiles(message.Attachments.Select(x => x.StoragePath)); + dbContext.MessageAttachments.RemoveRange(message.Attachments); + dbContext.MessageReactions.RemoveRange(message.Reactions); + message.Attachments.Clear(); + message.Reactions.Clear(); + message.Text = string.Empty; + message.EditedAt = null; + message.DeletedAt = now; + message.PinnedAt = null; + message.PinnedByUserId = null; + } + + await dbContext.SaveChangesAsync(cancellationToken); + + foreach (var chat in affectedChats) + { + await NotifyMessageUpdatedAsync(chat, messages.Where(x => x.ChatId == chat.Id).ToList(), cancellationToken); + } + + return Ok(new ExpiredMessagesCleanupDto(messages.Count, now)); + } + + [HttpGet("{chatId:guid}/moderation-log")] + public async Task<ActionResult<IReadOnlyList<ModerationLogDto>>> GetModerationLog( + Guid chatId, + [FromQuery] int limit = 100, + CancellationToken cancellationToken = default) + { + var userId = User.GetRequiredUserId(); + var chat = await LoadChatMetadata(chatId, userId, cancellationToken); + if (chat is null) + { + return NotFound(); + } + + if (!CanManageMembers(chat, userId)) + { + return StatusCode(StatusCodes.Status403Forbidden, "Only admins can view moderation logs."); + } + + var take = Math.Clamp(limit, 1, 250); + var entries = await dbContext.ModerationLogEntries + .AsNoTracking() + .Include(x => x.ActorUser) + .ThenInclude(x => x.Sessions) + .Where(x => x.ChatId == chatId) + .OrderByDescending(x => x.CreatedAt) + .Take(take) + .ToListAsync(cancellationToken); + + return Ok(entries.Select(x => x.ToDto(presenceTracker)).ToList()); + } + + private async Task<ActionResult<MessageDto>> SetMessagePinAsync( + Guid chatId, + Guid messageId, + bool isPinned, + CancellationToken cancellationToken) + { + var userId = User.GetRequiredUserId(); + var message = await LoadMessageForMemberAsync(chatId, messageId, userId, cancellationToken); + if (message is null) + { + return NotFound(); + } + + if (message.DeletedAt is not null) + { + return BadRequest("Deleted messages cannot be pinned."); + } + + if (!ResolvePermissions(message.Chat, userId).CanPinMessages) + { + return StatusCode(StatusCodes.Status403Forbidden, "You cannot pin messages in this chat."); + } + + if (isPinned) + { + message.PinnedAt = DateTimeOffset.UtcNow; + message.PinnedByUserId = userId; + } + else + { + message.PinnedAt = null; + message.PinnedByUserId = null; + message.PinnedByUser = null; + } + + await AddModerationLogAsync( + userId, + chatId, + ModerationLogTargetType.Message, + messageId, + isPinned ? "message.pinned" : "message.unpinned", + null, + cancellationToken); + await dbContext.SaveChangesAsync(cancellationToken); + + var updatedMessage = await LoadMessageForMemberAsync(chatId, messageId, userId, cancellationToken) + ?? throw new InvalidOperationException("The pinned message could not be reloaded."); + + var dto = updatedMessage.ToDto(presenceTracker, userId); + await NotifyMessageUpdatedAsync(updatedMessage.Chat, [updatedMessage], cancellationToken); + return Ok(dto); + } + + private async Task<IActionResult> AcknowledgeMessageReceiptAsync( + Guid chatId, + Guid messageId, + Guid userId, + bool markRead, + CancellationToken cancellationToken) + { + var targetMessage = await dbContext.Messages + .Include(x => x.Chat) + .ThenInclude(x => x.Members) + .Include(x => x.Sender) + .Include(x => x.PinnedByUser) + .Include(x => x.Attachments) + .Include(x => x.Reactions) + .Include(x => x.Views) + .Include(x => x.ReplyToMessage) + .ThenInclude(x => x!.Sender) + .Include(x => x.ReplyToMessage) + .ThenInclude(x => x!.Attachments) + .SingleOrDefaultAsync( + x => x.Id == messageId && + x.ChatId == chatId && + x.Chat.Members.Any(member => member.UserId == userId), + cancellationToken); + + if (targetMessage is null) + { + return NotFound(); + } + + if (targetMessage.SenderId == userId) + { + return Ok(); + } + + var membership = targetMessage.Chat.Members.First(member => member.UserId == userId); + var previousDeliveredAt = membership.LastDeliveredAt; + var previousReadAt = membership.LastReadAt; + + var changed = false; + if (membership.LastDeliveredAt is null || membership.LastDeliveredAt.Value < targetMessage.SentAt) + { + membership.LastDeliveredAt = targetMessage.SentAt; + changed = true; + } + + if (markRead && (membership.LastReadAt is null || membership.LastReadAt.Value < targetMessage.SentAt)) + { + membership.LastReadAt = targetMessage.SentAt; + changed = true; + } + + if (!changed) + { + return Ok(); + } + + await dbContext.SaveChangesAsync(cancellationToken); + + var changedAfter = markRead ? previousReadAt : previousDeliveredAt; + var changedMessages = await LoadReceiptAffectedMessagesAsync( + chatId, + userId, + changedAfter, + targetMessage.SentAt, + cancellationToken); + + if (changedMessages.Count > 0) + { + await NotifyMessageUpdatedAsync(targetMessage.Chat, changedMessages, cancellationToken); + } + + await NotifyChatsChangedAsync([userId], cancellationToken); + + return Ok(); + } + + private async Task UpdateReadReceiptForOpenedChatAsync(Chat chat, Guid userId, CancellationToken cancellationToken) + { + var latestIncomingAt = await dbContext.Messages + .Where(message => message.ChatId == chat.Id && message.SenderId != userId) + .Select(message => (DateTimeOffset?)message.SentAt) + .MaxAsync(cancellationToken); + + if (latestIncomingAt is null) + { + return; + } + + var membership = chat.Members.First(member => member.UserId == userId); + var previousReadAt = membership.LastReadAt; + var previousDeliveredAt = membership.LastDeliveredAt; + + var changed = false; + if (membership.LastDeliveredAt is null || membership.LastDeliveredAt.Value < latestIncomingAt.Value) + { + membership.LastDeliveredAt = latestIncomingAt.Value; + changed = true; + } + + if (membership.LastReadAt is null || membership.LastReadAt.Value < latestIncomingAt.Value) + { + membership.LastReadAt = latestIncomingAt.Value; + changed = true; + } + + if (!changed) + { + return; + } + + await dbContext.SaveChangesAsync(cancellationToken); + + var changedAfter = previousReadAt ?? previousDeliveredAt; + var changedMessages = await LoadReceiptAffectedMessagesAsync( + chat.Id, + userId, + changedAfter, + latestIncomingAt.Value, + cancellationToken); + + if (changedMessages.Count > 0) + { + await NotifyMessageUpdatedAsync(chat, changedMessages, cancellationToken); + } + + await NotifyChatsChangedAsync([userId], cancellationToken); + } + + private async Task MarkChannelMessagesViewedAsync( + Chat chat, + Guid userId, + IReadOnlyCollection<Message> messages, + CancellationToken cancellationToken) + { + if (chat.Type != ChatType.Channel || messages.Count == 0) + { + return; + } + + var messageIds = messages + .Where(message => message.PostedAsChannel && message.DeletedAt is null) + .Select(message => message.Id) + .Distinct() + .ToList(); + if (messageIds.Count == 0) + { + return; + } + + var existingViewedMessageIds = await dbContext.MessageViews + .AsNoTracking() + .Where(view => view.ViewerUserId == userId && messageIds.Contains(view.MessageId)) + .Select(view => view.MessageId) + .ToListAsync(cancellationToken); + var existingSet = existingViewedMessageIds.ToHashSet(); + var viewedAt = DateTimeOffset.UtcNow; + var changed = false; + + foreach (var message in messages.Where(message => messageIds.Contains(message.Id))) + { + if (!existingSet.Add(message.Id)) + { + continue; + } + + var view = new MessageView + { + MessageId = message.Id, + ViewerUserId = userId, + ViewedAt = viewedAt + }; + dbContext.MessageViews.Add(view); + message.Views.Add(view); + changed = true; + } + + if (changed) + { + await dbContext.SaveChangesAsync(cancellationToken); + } + } + + private async Task<List<Message>> LoadReceiptAffectedMessagesAsync( + Guid chatId, + Guid recipientUserId, + DateTimeOffset? changedAfter, + DateTimeOffset changedBeforeOrAt, + CancellationToken cancellationToken) + { + var messages = await dbContext.Messages + .Include(x => x.Chat) + .ThenInclude(x => x.Members) + .Include(x => x.Sender) + .Include(x => x.PinnedByUser) + .Include(x => x.Attachments) + .Include(x => x.Reactions) + .Include(x => x.Views) + .Include(x => x.ReplyToMessage) + .ThenInclude(x => x!.Sender) + .Include(x => x.ReplyToMessage) + .ThenInclude(x => x!.Attachments) + .Where(x => + x.ChatId == chatId && + x.SenderId != recipientUserId) + .ToListAsync(cancellationToken); + + return messages + .Where(x => + x.SentAt <= changedBeforeOrAt && + (changedAfter is null || x.SentAt > changedAfter.Value)) + .OrderBy(x => x.SentAt) + .ToList(); + } + + private async Task<IReadOnlyDictionary<Guid, Message>> LoadLatestMessagesByChatIdAsync( + IReadOnlyCollection<Guid> chatIds, + CancellationToken cancellationToken) + { + if (chatIds.Count == 0) + { + return new Dictionary<Guid, Message>(); + } + + var latestSentAtByChatQuery = dbContext.Messages + .Where(message => chatIds.Contains(message.ChatId)) + .GroupBy(message => message.ChatId) + .Select(group => new + { + ChatId = group.Key, + SentAt = group.Max(message => message.SentAt) + }); + + var latestMessages = await dbContext.Messages + .Join( + latestSentAtByChatQuery, + message => new { message.ChatId, message.SentAt }, + latest => new { latest.ChatId, latest.SentAt }, + (message, _) => message) + .Include(message => message.Sender) + .Include(message => message.PinnedByUser) + .Include(message => message.Attachments) + .AsNoTracking() + .ToListAsync(cancellationToken); + + return latestMessages + .GroupBy(message => message.ChatId) + .ToDictionary( + group => group.Key, + group => group.OrderByDescending(message => message.SentAt).First()); + } + + private async Task<IReadOnlyDictionary<Guid, int>> LoadUnreadCountsByChatIdAsync( + Guid userId, + IReadOnlyCollection<Guid> chatIds, + CancellationToken cancellationToken) + { + if (chatIds.Count == 0) + { + return new Dictionary<Guid, int>(); + } + + var unreadCounts = await dbContext.Messages + .Where(message => + chatIds.Contains(message.ChatId) && + message.SenderId != userId && + message.DeletedAt == null) + .Join( + dbContext.ChatMembers.Where(member => member.UserId == userId), + message => message.ChatId, + member => member.ChatId, + (message, member) => new + { + message.ChatId, + message.SentAt, + member.LastReadAt + }) + .Where(x => x.LastReadAt == null || x.SentAt > x.LastReadAt.Value) + .GroupBy(x => x.ChatId) + .Select(group => new + { + ChatId = group.Key, + Count = group.Count() + }) + .ToListAsync(cancellationToken); + + return unreadCounts.ToDictionary(x => x.ChatId, x => x.Count); + } + + private async Task<IReadOnlyList<Message>> LoadPinnedMessagesAsync(Chat chat, CancellationToken cancellationToken) + { + var messages = await dbContext.Messages + .Where(message => + message.ChatId == chat.Id && + message.PinnedAt != null && + message.DeletedAt == null) + .OrderByDescending(message => message.PinnedAt) + .Take(5) + .Include(message => message.Sender) + .Include(message => message.PinnedByUser) + .Include(message => message.Attachments) + .Include(message => message.Reactions) + .Include(message => message.Views) + .Include(message => message.ReplyToMessage) + .ThenInclude(message => message!.Sender) + .Include(message => message.ReplyToMessage) + .ThenInclude(message => message!.Attachments) + .AsNoTracking() + .ToListAsync(cancellationToken); + + foreach (var message in messages) + { + message.Chat = chat; + } + + return messages; + } + + private sealed record MessagesPage(IReadOnlyList<Message> Messages, bool HasMoreMessages); + + private async Task<MessagesPage> LoadMessagesPageAsync( + Chat chat, + Guid? beforeMessageId, + int requestedLimit, + CancellationToken cancellationToken) + { + var limit = Math.Clamp(requestedLimit, 1, MaxMessagePageSize); + var query = dbContext.Messages.Where(message => message.ChatId == chat.Id); + + if (beforeMessageId is not null) + { + var boundary = await dbContext.Messages + .AsNoTracking() + .Where(message => message.ChatId == chat.Id && message.Id == beforeMessageId.Value) + .Select(message => new { message.SentAt }) + .SingleOrDefaultAsync(cancellationToken); + + if (boundary is null) + { + return new MessagesPage([], HasMoreMessages: false); + } + + query = query.Where(message => message.SentAt < boundary.SentAt); + } + + var messages = await query + .OrderByDescending(message => message.SentAt) + .Take(limit + 1) + .Include(message => message.Sender) + .Include(message => message.PinnedByUser) + .Include(message => message.Attachments) + .Include(message => message.Reactions) + .Include(message => message.Views) + .Include(message => message.ReplyToMessage) + .ThenInclude(message => message!.Sender) + .Include(message => message.ReplyToMessage) + .ThenInclude(message => message!.Attachments) + .AsNoTracking() + .ToListAsync(cancellationToken); + + var hasMoreMessages = messages.Count > limit; + var pageMessages = messages + .Take(limit) + .OrderBy(message => message.SentAt) + .ToList(); + + foreach (var message in pageMessages) + { + message.Chat = chat; + } + + return new MessagesPage(pageMessages, hasMoreMessages); + } + + private async Task<Chat?> LoadChatMetadata( + Guid chatId, + Guid userId, + CancellationToken cancellationToken, + bool asNoTracking = true, + bool allowPublicChannelPreview = false) + { + var query = dbContext.Chats + .Include(x => x.Members) + .ThenInclude(x => x.User) + .AsSplitQuery(); + + if (asNoTracking) + { + query = query.AsNoTracking(); + } + + return await query.SingleOrDefaultAsync( + x => x.Id == chatId && + (x.Members.Any(m => m.UserId == userId) || + (allowPublicChannelPreview && + x.Type == ChatType.Channel && + x.PublicUsername != null && + x.PublicUsername != string.Empty)), + cancellationToken); + } + + private async Task<Chat?> LoadChatWithMessages(Guid chatId, Guid userId, CancellationToken cancellationToken, bool asNoTracking = true) + { + var query = dbContext.Chats + .Include(x => x.Members) + .ThenInclude(x => x.User) + .Include(x => x.Messages) + .ThenInclude(x => x.Sender) + .Include(x => x.Messages) + .ThenInclude(x => x.PinnedByUser) + .Include(x => x.Messages) + .ThenInclude(x => x.Attachments) + .Include(x => x.Messages) + .ThenInclude(x => x.Reactions) + .Include(x => x.Messages) + .ThenInclude(x => x.Views) + .Include(x => x.Messages) + .ThenInclude(x => x.ReplyToMessage) + .ThenInclude(x => x!.Sender) + .Include(x => x.Messages) + .ThenInclude(x => x.ReplyToMessage) + .ThenInclude(x => x!.Attachments) + .AsSplitQuery(); + + if (asNoTracking) + { + query = query.AsNoTracking(); + } + + return await query.SingleOrDefaultAsync(x => x.Id == chatId && x.Members.Any(m => m.UserId == userId), cancellationToken); + } + + private async Task<Message?> LoadMessageForMemberAsync(Guid chatId, Guid messageId, Guid userId, CancellationToken cancellationToken) + { + return await dbContext.Messages + .Include(x => x.Chat) + .ThenInclude(x => x.Members) + .Include(x => x.Sender) + .Include(x => x.PinnedByUser) + .Include(x => x.Attachments) + .Include(x => x.Reactions) + .Include(x => x.Views) + .Include(x => x.ReplyToMessage) + .ThenInclude(x => x!.Sender) + .Include(x => x.ReplyToMessage) + .ThenInclude(x => x!.Attachments) + .SingleOrDefaultAsync( + x => x.Id == messageId && + x.ChatId == chatId && + x.Chat.Members.Any(m => m.UserId == userId), + cancellationToken); + } + + private Task<Message?> ResolveReplyTargetAsync( + Guid chatId, + Guid? replyToMessageId, + Guid userId, + CancellationToken cancellationToken) + { + if (replyToMessageId is null) + { + return Task.FromResult<Message?>(null); + } + + return dbContext.Messages + .Include(x => x.Sender) + .Include(x => x.Attachments) + .SingleOrDefaultAsync( + x => x.Id == replyToMessageId.Value && + x.ChatId == chatId && + x.Chat.Members.Any(member => member.UserId == userId), + cancellationToken); + } + + private async Task<List<Chat>> LoadChatSummariesForUserAsync(Guid userId, CancellationToken cancellationToken) => + await dbContext.Chats + .Where(x => x.Members.Any(member => member.UserId == userId)) + .Include(x => x.Members) + .ThenInclude(x => x.User) + .AsNoTracking() + .AsSplitQuery() + .ToListAsync(cancellationToken); + + private async Task<ChatSearchPageDto> SearchChatsPageAsync( + Guid userId, + string? rawQuery, + SearchFilters filters, + int requestedPage, + int requestedLimit, + CancellationToken cancellationToken) + { + var query = rawQuery?.Trim() ?? string.Empty; + var page = NormalizeSearchPage(requestedPage); + var take = NormalizeSearchLimit(requestedLimit); + if (query.Length < 2 && !filters.HasMessageFilter) + { + return new ChatSearchPageDto([], page, take, HasMore: false); + } + + var skip = (page - 1) * take; + var chats = await LoadChatSummariesForUserAsync(userId, cancellationToken); + var chatIds = chats.Select(x => x.Id).ToList(); + var latestMessagesByChatId = await LoadLatestMessagesByChatIdAsync(chatIds, cancellationToken); + var unreadCountsByChatId = await LoadUnreadCountsByChatIdAsync(userId, chatIds, cancellationToken); + var summariesByChatId = chats.ToDictionary( + x => x.Id, + x => x.ToSummaryDto( + userId, + presenceTracker, + latestMessagesByChatId.GetValueOrDefault(x.Id), + unreadCountsByChatId.GetValueOrDefault(x.Id))); + + var chatMatches = query.Length >= 2 && !filters.HasMessageFilter + ? chats + .Concat(await LoadPublicChannelSearchResultsAsync(query, cancellationToken)) + .GroupBy(chat => chat.Id) + .Select(group => group.First()) + .Where(chat => MatchesChatSearch(chat, query)) + .OrderByDescending(chat => chat.LastActivityAt ?? chat.CreatedAt) + .Select(chat => + { + var summary = summariesByChatId.TryGetValue(chat.Id, out var memberSummary) + ? memberSummary + : chat.ToSummaryDto(userId, presenceTracker); + return new ChatSearchResultDto( + summary, + null, + summary.Title, + summary.LastActivityAt, + summary.Id); + }) + .ToList() + : []; + + var selectedChatMatches = chatMatches + .Skip(skip) + .Take(take) + .ToList(); + var messageSkip = Math.Max(0, skip - chatMatches.Count); + var messageTake = take - selectedChatMatches.Count; + var results = new List<ChatSearchResultDto>(selectedChatMatches); + var messageHasMore = false; + + if (messageTake > 0) + { + var messageMatches = await LoadSearchMessagesAsync( + chatIds, + query, + filters, + messageSkip, + messageTake + 1, + cancellationToken); + messageHasMore = messageMatches.Count > messageTake; + + foreach (var message in messageMatches.Take(messageTake)) + { + if (!summariesByChatId.TryGetValue(message.ChatId, out var summary)) + { + continue; + } + + results.Add(ToSearchResult(summary, message, userId)); + } + } + + var hasMore = skip + take < chatMatches.Count || messageHasMore; + return new ChatSearchPageDto(results, page, take, hasMore); + } + + private async Task<List<Chat>> LoadPublicChannelSearchResultsAsync( + string query, + CancellationToken cancellationToken) + { + var pattern = BuildLikePattern(query); + var usernameQuery = NormalizePublicSearchUsername(query); + var usernamePattern = usernameQuery is null ? null : BuildLikePattern(usernameQuery); + return await dbContext.Chats + .Where(chat => + chat.Type == ChatType.Channel && + chat.PublicUsername != null && + chat.PublicUsername != string.Empty && + ((chat.Title != null && EF.Functions.Like(chat.Title, pattern, "\\")) || + EF.Functions.Like(chat.PublicUsername, pattern, "\\") || + (usernamePattern != null && EF.Functions.Like(chat.PublicUsername, usernamePattern, "\\")) || + (chat.Description != null && EF.Functions.Like(chat.Description, pattern, "\\")))) + .Include(chat => chat.Members) + .ThenInclude(member => member.User) + .AsNoTracking() + .AsSplitQuery() + .ToListAsync(cancellationToken); + } + + private async Task<MessageSearchPageDto> SearchMessagesPageAsync( + Chat chat, + Guid userId, + string? rawQuery, + SearchFilters filters, + int requestedPage, + int requestedLimit, + CancellationToken cancellationToken) + { + var query = rawQuery?.Trim() ?? string.Empty; + var page = NormalizeSearchPage(requestedPage); + var take = NormalizeSearchLimit(requestedLimit); + if (query.Length < 2 && !filters.HasMessageFilter) + { + return new MessageSearchPageDto([], page, take, HasMore: false); + } + + var messages = await LoadSearchMessagesAsync( + [chat.Id], + query, + filters, + (page - 1) * take, + take + 1, + cancellationToken); + var hasMore = messages.Count > take; + var dtos = messages + .Take(take) + .Select(message => + { + message.Chat = chat; + return message.ToDto(presenceTracker, userId); + }) + .ToList(); + + return new MessageSearchPageDto(dtos, page, take, hasMore); + } + + private ChatSearchResultDto ToSearchResult(ChatSummaryDto summary, Message message, Guid userId) + { + var messageDto = message.ToDto(presenceTracker, userId); + return new ChatSearchResultDto( + summary, + messageDto, + BuildSearchMatchText(message), + message.SentAt, + summary.Id, + message.Id, + message.SenderId, + message.SentAt); + } + + private async Task<List<Message>> LoadSearchMessagesAsync( + IReadOnlyCollection<Guid> chatIds, + string query, + SearchFilters filters, + int skip, + int limit, + CancellationToken cancellationToken) + { + if (chatIds.Count == 0) + { + return []; + } + + var messagesQuery = dbContext.Messages + .Where(message => chatIds.Contains(message.ChatId) && message.DeletedAt == null); + + if (!string.IsNullOrWhiteSpace(query)) + { + var queryPattern = BuildLikePattern(query); + messagesQuery = messagesQuery.Where(message => + EF.Functions.Like(message.Text, queryPattern, "\\") || + message.Attachments.Any(attachment => EF.Functions.Like(attachment.OriginalFileName, queryPattern, "\\"))); + } + + if (filters.DateFrom is not null) + { + messagesQuery = messagesQuery.Where(message => message.SentAt >= filters.DateFrom.Value); + } + + if (filters.DateTo is not null) + { + messagesQuery = messagesQuery.Where(message => message.SentAt <= filters.DateTo.Value); + } + + if (filters.AuthorId is not null) + { + messagesQuery = messagesQuery.Where(message => message.SenderId == filters.AuthorId.Value); + } + + if (!string.IsNullOrWhiteSpace(filters.AuthorQuery)) + { + var authorPattern = BuildLikePattern(filters.AuthorQuery); + messagesQuery = messagesQuery.Where(message => + EF.Functions.Like(message.Sender.DisplayName, authorPattern, "\\") || + EF.Functions.Like(message.Sender.Username, authorPattern, "\\") || + (message.Sender.PhoneNumber != null && EF.Functions.Like(message.Sender.PhoneNumber, authorPattern, "\\"))); + } + + messagesQuery = filters.Type switch + { + "text" => messagesQuery.Where(message => message.Text != ""), + "attachments" => messagesQuery.Where(message => message.Attachments.Any()), + "media" => messagesQuery.Where(message => message.Attachments.Any(attachment => attachment.ContentType.StartsWith("image/") || attachment.ContentType.StartsWith("video/"))), + "files" => messagesQuery.Where(message => message.Attachments.Any(attachment => + !attachment.ContentType.StartsWith("image/") && + !attachment.ContentType.StartsWith("video/") && + !attachment.ContentType.StartsWith("audio/"))), + "links" => messagesQuery.Where(message => message.Text.Contains("http://") || message.Text.Contains("https://")), + "voice" => messagesQuery.Where(message => message.Attachments.Any(attachment => attachment.ContentType.StartsWith("audio/"))), + _ => messagesQuery + }; + + return await messagesQuery + .OrderByDescending(message => message.SentAt) + .Skip(skip) + .Take(limit) + .Include(message => message.Chat) + .ThenInclude(chat => chat.Members) + .ThenInclude(member => member.User) + .Include(message => message.Sender) + .Include(message => message.PinnedByUser) + .Include(message => message.Attachments) + .Include(message => message.Reactions) + .Include(message => message.Views) + .Include(message => message.ReplyToMessage) + .ThenInclude(message => message!.Sender) + .Include(message => message.ReplyToMessage) + .ThenInclude(message => message!.Attachments) + .AsNoTracking() + .ToListAsync(cancellationToken); + } + + private static bool MatchesChatSearch(Chat chat, string query) + { + if (!string.IsNullOrWhiteSpace(chat.Title) && chat.Title.Contains(query, StringComparison.OrdinalIgnoreCase)) + { + return true; + } + + if (!string.IsNullOrWhiteSpace(chat.PublicUsername) && + chat.PublicUsername.Contains(query, StringComparison.OrdinalIgnoreCase)) + { + return true; + } + + var usernameQuery = NormalizePublicSearchUsername(query); + if (!string.IsNullOrWhiteSpace(usernameQuery) && + !string.IsNullOrWhiteSpace(chat.PublicUsername) && + chat.PublicUsername.Contains(usernameQuery, StringComparison.OrdinalIgnoreCase)) + { + return true; + } + + if (!string.IsNullOrWhiteSpace(chat.Description) && + chat.Description.Contains(query, StringComparison.OrdinalIgnoreCase)) + { + return true; + } + + return chat.Members.Any(member => + member.User.DisplayName.Contains(query, StringComparison.OrdinalIgnoreCase) || + member.User.Username.Contains(query, StringComparison.OrdinalIgnoreCase) || + (member.User.PhoneNumber?.Contains(query, StringComparison.OrdinalIgnoreCase) ?? false)); + } + + private static string BuildSearchMatchText(Message message) + { + if (!string.IsNullOrWhiteSpace(message.Text)) + { + return message.Text.Length <= 160 ? message.Text : message.Text[..160]; + } + + var attachment = message.Attachments + .OrderBy(x => x.SortOrder) + .ThenBy(x => x.OriginalFileName) + .FirstOrDefault(); + + return attachment is null ? "Message" : attachment.OriginalFileName; + } + + private static SearchFilters BuildSearchFilters( + string? legacyFilter, + string? type, + DateTimeOffset? date, + DateTimeOffset? dateFrom, + DateTimeOffset? dateTo, + Guid? authorId, + string? author) + { + var normalizedType = NormalizeSearchType(type) ?? NormalizeSearchType(legacyFilter); + var effectiveDateFrom = dateFrom; + var effectiveDateTo = dateTo; + if (date is not null) + { + var dateStart = new DateTimeOffset(date.Value.Date, date.Value.Offset); + effectiveDateFrom ??= dateStart; + effectiveDateTo ??= dateStart.AddDays(1).AddTicks(-1); + } + + return new SearchFilters( + normalizedType, + effectiveDateFrom, + effectiveDateTo, + authorId, + string.IsNullOrWhiteSpace(author) ? null : author.Trim()); + } + + private static string? NormalizeSearchType(string? value) + { + var normalized = value?.Trim().ToLowerInvariant(); + return normalized switch + { + "attachment" or "attachments" => "attachments", + "file" or "files" or "document" or "documents" => "files", + "image" or "images" or "video" or "videos" or "media" => "media", + "link" or "links" or "url" or "urls" => "links", + "audio" or "voice" or "voice-note" or "voice_note" or "voice-notes" or "voice_notes" => "voice", + "message" or "messages" or "text" => "text", + _ => null + }; + } + + private static int NormalizeSearchPage(int page) => Math.Clamp(page, 1, 10_000); + + private static int NormalizeSearchLimit(int limit) => Math.Clamp(limit, 1, 100); + + private static string BuildLikePattern(string value) + { + var escaped = value + .Replace("\\", "\\\\", StringComparison.Ordinal) + .Replace("%", "\\%", StringComparison.Ordinal) + .Replace("_", "\\_", StringComparison.Ordinal); + return $"%{escaped}%"; + } + + private static string? NormalizePublicSearchUsername(string value) + { + var normalized = value.Trim().TrimStart('@'); + return string.IsNullOrWhiteSpace(normalized) ? null : normalized; + } + + private void WriteSearchPageHeaders(int page, int limit, bool hasMore) + { + Response.Headers["X-Search-Page"] = page.ToString(System.Globalization.CultureInfo.InvariantCulture); + Response.Headers["X-Search-Limit"] = limit.ToString(System.Globalization.CultureInfo.InvariantCulture); + Response.Headers["X-Search-Has-More"] = hasMore ? "true" : "false"; + } + + private sealed record SearchFilters( + string? Type, + DateTimeOffset? DateFrom, + DateTimeOffset? DateTo, + Guid? AuthorId, + string? AuthorQuery) + { + public bool HasMessageFilter => + Type is not null || + DateFrom is not null || + DateTo is not null || + AuthorId is not null || + !string.IsNullOrWhiteSpace(AuthorQuery); + } + + private static string? NormalizeFolderKey(string? value) + { + var normalized = value?.Trim().ToLowerInvariant(); + if (string.IsNullOrWhiteSpace(normalized)) + { + return null; + } + + return new string(normalized + .Where(ch => char.IsLetterOrDigit(ch) || ch is '-' or '_') + .Take(48) + .ToArray()); + } + + private static string? NormalizePublicUsername(string? value) + { + var trimmed = value?.Trim().TrimStart('@'); + if (string.IsNullOrWhiteSpace(trimmed)) + { + return null; + } + + var normalized = new string(trimmed + .Where(ch => ch is >= 'a' and <= 'z' || ch is >= 'A' and <= 'Z' || char.IsDigit(ch) || ch == '_') + .Take(32) + .ToArray()) + .ToLowerInvariant(); + + if (normalized.Length < 5) + { + throw new InvalidOperationException("Public username must contain at least 5 characters."); + } + + return normalized; + } + + private ChatInviteLinkDto ToInviteLinkDto(ChatInviteLink link) => + new( + link.Id, + link.ChatId, + link.Token, + $"{Request.Scheme}://{Request.Host}/join/{Uri.EscapeDataString(link.Token)}", + link.Title, + link.CreatesJoinRequest, + link.IsRevoked, + link.CreatedAt, + link.RevokedAt); + + private ChatJoinRequestDto ToJoinRequestDto(ChatJoinRequest request) => + new( + request.Id, + request.ChatId, + request.InviteLinkId, + request.User.ToDto(presenceTracker), + request.Status, + request.RequestedAt, + request.ResolvedAt, + request.ResolvedByUser?.ToDto(presenceTracker)); + + private async Task AddModerationLogAsync( + Guid actorUserId, + Guid? chatId, + ModerationLogTargetType targetType, + Guid? targetId, + string action, + string? reason, + CancellationToken cancellationToken) + { + var actorExists = await dbContext.Users.AnyAsync(x => x.Id == actorUserId, cancellationToken); + if (!actorExists) + { + return; + } + + dbContext.ModerationLogEntries.Add(new ModerationLogEntry + { + ActorUserId = actorUserId, + ChatId = chatId, + TargetType = targetType, + TargetId = targetId, + Action = action, + Reason = TrimToNull(reason, 256), + CreatedAt = DateTimeOffset.UtcNow + }); + } + + private static int? NormalizeTtlSeconds(int? ttlSeconds, bool allowNull) + { + if (ttlSeconds is null || ttlSeconds <= 0) + { + return allowNull ? null : 86400; + } + + return Math.Clamp(ttlSeconds.Value, 5, 31 * 24 * 60 * 60); + } + + private async Task<bool> IsBlockedByPrivacyAsync(Guid ownerUserId, Guid candidateUserId, CancellationToken cancellationToken) + { + var rawBlocked = await dbContext.UserPrivacySettings + .AsNoTracking() + .Where(x => x.UserId == ownerUserId) + .Select(x => x.BlockedUserIds) + .SingleOrDefaultAsync(cancellationToken); + + return ContainsSerializedUserId(rawBlocked, candidateUserId); + } + + private static bool ContainsSerializedUserId(string? value, Guid userId) => + !string.IsNullOrWhiteSpace(value) && + value + .Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries) + .Any(x => Guid.TryParse(x, out var parsed) && parsed == userId); + + private async Task<string> GenerateInviteTokenAsync(CancellationToken cancellationToken) + { + while (true) + { + var token = Convert.ToBase64String(RandomNumberGenerator.GetBytes(18)) + .TrimEnd('=') + .Replace('+', '-') + .Replace('/', '_'); + var exists = await dbContext.ChatInviteLinks + .AnyAsync(x => x.Token == token, cancellationToken); + if (!exists) + { + return token; + } + } + } + + private static string? TrimToNull(string? value, int maxLength) + { + var trimmed = value?.Trim(); + if (string.IsNullOrWhiteSpace(trimmed)) + { + return null; + } + + return trimmed.Length <= maxLength ? trimmed : trimmed[..maxLength]; + } + + private async Task<List<ChatTopicDto>> LoadChatTopicDtosAsync(Guid chatId, CancellationToken cancellationToken) + { + var messageCounts = await dbContext.Messages + .AsNoTracking() + .Where(x => x.ChatId == chatId && x.TopicId != null && x.DeletedAt == null) + .GroupBy(x => x.TopicId!.Value) + .Select(group => new { TopicId = group.Key, Count = group.Count() }) + .ToDictionaryAsync(x => x.TopicId, x => x.Count, cancellationToken); + + var topics = await dbContext.ChatTopics + .AsNoTracking() + .Where(x => x.ChatId == chatId) + .OrderByDescending(x => x.IsPinned) + .ThenByDescending(x => x.LastActivityAt) + .ToListAsync(cancellationToken); + + return topics + .Select(x => new ChatTopicDto( + x.Id, + x.ChatId, + x.Title, + x.Icon, + x.IsPinned, + x.IsClosed, + x.CreatedAt, + x.LastActivityAt, + messageCounts.GetValueOrDefault(x.Id))) + .ToList(); + } + + private static ChatPermissionsDto ResolvePermissions(Chat chat, Guid userId) => + DtoMapper.BuildPermissions(chat.Members.FirstOrDefault(member => member.UserId == userId), chat.Type); + + private static bool CanManageMembers(Chat chat, Guid userId) => + ResolvePermissions(chat, userId).CanManageMembers; + + private static bool CanUserPublish(Chat chat, Guid userId) => + ResolvePermissions(chat, userId).CanPostMessages; + + private static bool ShouldPostAsChannel(Chat chat) => + chat.Type == ChatType.Channel; + + private static string? ResolveChannelAuthorSignature(Chat chat, User sender) + { + if (chat.Type != ChatType.Channel || !chat.ChannelSignaturesEnabled) + { + return null; + } + + return string.IsNullOrWhiteSpace(sender.DisplayName) ? sender.Username : sender.DisplayName; + } + + private static ChatMember CreateSubscriberMembership(Chat chat, Guid userId) + { + var isChannel = chat.Type == ChatType.Channel; + return new ChatMember + { + ChatId = chat.Id, + UserId = userId, + Role = ChatMemberRole.Member, + CanPinMessages = !isChannel, + CanDeleteMessages = false, + CanInviteUsers = !isChannel, + CanPostMessages = !isChannel, + JoinedAt = DateTimeOffset.UtcNow + }; + } + + private static string ResolveForwardedFromDisplayName(Message sourceMessage) + { + var forwardedFromDisplayName = sourceMessage.ForwardedFromDisplayName; + if (!string.IsNullOrWhiteSpace(forwardedFromDisplayName)) + { + return forwardedFromDisplayName; + } + + if (sourceMessage.Chat.Type == ChatType.Channel && sourceMessage.PostedAsChannel) + { + return string.IsNullOrWhiteSpace(sourceMessage.Chat.Title) ? "Channel" : sourceMessage.Chat.Title!; + } + + return string.IsNullOrWhiteSpace(sourceMessage.Sender.DisplayName) + ? sourceMessage.Sender.Username + : sourceMessage.Sender.DisplayName; + } + + private async Task NotifyMessageCreatedAsync(Chat chat, Message message, CancellationToken cancellationToken) + { + foreach (var member in chat.Members) + { + var dto = message.ToDto(presenceTracker, member.UserId); + await hubContext.Clients.User(member.UserId.ToString()) + .SendAsync("MessageCreated", dto, cancellationToken); + } + + await NotifyChatsChangedAsync(chat.Members.Select(member => member.UserId), cancellationToken); + } + + private async Task NotifyMessageUpdatedAsync(Chat chat, IReadOnlyCollection<Message> messages, CancellationToken cancellationToken) + { + foreach (var member in chat.Members) + { + foreach (var message in messages.OrderBy(x => x.SentAt)) + { + var dto = message.ToDto(presenceTracker, member.UserId); + await hubContext.Clients.User(member.UserId.ToString()) + .SendAsync("MessageUpdated", dto, cancellationToken); + } + } + } + + private async Task NotifyChatCreatedAsync(Chat chat, CancellationToken cancellationToken) + { + foreach (var member in chat.Members) + { + var summary = chat.ToSummaryDto(member.UserId, presenceTracker); + await hubContext.Clients.User(member.UserId.ToString()) + .SendAsync("ChatCreated", summary, cancellationToken); + } + + await hubContext.Clients.Users(chat.Members.Select(x => x.UserId.ToString())) + .SendAsync("ChatsChanged", cancellationToken); + } + + private Task NotifyChatsChangedAsync(IEnumerable<Guid> userIds, CancellationToken cancellationToken) => + hubContext.Clients.Users(userIds.Select(x => x.ToString()).Distinct()) + .SendAsync("ChatsChanged", cancellationToken); + + private void DeleteFiles(IEnumerable<string> attachmentPaths) + { + foreach (var path in attachmentPaths) + { + attachmentStorageService.DeleteIfExists(path); + } + } +} diff --git a/src/Ikar.Server/Controllers/PushController.cs b/src/Ikar.Server/Controllers/PushController.cs new file mode 100644 index 00000000..e51af448 --- /dev/null +++ b/src/Ikar.Server/Controllers/PushController.cs @@ -0,0 +1,113 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; +using Ikar.Server.Data; +using Ikar.Server.Data.Entities; +using Ikar.Server.Infrastructure; +using Ikar.Server.Infrastructure.Auth; +using Ikar.Shared; + +namespace Ikar.Server.Controllers; + +[ApiController] +[Authorize] +[Route("api/[controller]")] +public sealed class PushController(IkarDbContext dbContext) : ControllerBase +{ + [HttpGet("devices")] + public async Task<ActionResult<IReadOnlyList<PushDeviceDto>>> GetDevices(CancellationToken cancellationToken) + { + var userId = User.GetRequiredUserId(); + var devices = await dbContext.PushDevices + .AsNoTracking() + .Where(x => x.UserId == userId) + .ToListAsync(cancellationToken); + + return Ok(devices + .OrderByDescending(x => x.UpdatedAt) + .Select(x => x.ToDto()) + .ToList()); + } + + [HttpPost("devices")] + public async Task<ActionResult<PushDeviceDto>> RegisterDevice( + RegisterPushDeviceRequest request, + CancellationToken cancellationToken) + { + var userId = User.GetRequiredUserId(); + var installationId = request.InstallationId?.Trim() ?? string.Empty; + var deviceToken = request.DeviceToken?.Trim() ?? string.Empty; + if (request.Platform == PushPlatform.Unknown || + string.IsNullOrWhiteSpace(installationId) || + string.IsNullOrWhiteSpace(deviceToken)) + { + return ValidationProblem("Platform, installationId and deviceToken are required."); + } + + var clientVersion = ClientVersionRequestReader.Read(Request); + var device = await dbContext.PushDevices + .SingleOrDefaultAsync(x => x.InstallationId == installationId, cancellationToken); + + if (device is null) + { + device = new PushDevice + { + UserId = userId, + Platform = request.Platform, + InstallationId = installationId, + DeviceToken = deviceToken, + DeviceName = NormalizeDeviceName(request.DeviceName), + NotificationsEnabled = request.NotificationsEnabled, + UpdatedAt = DateTimeOffset.UtcNow + }; + ClientVersionRequestReader.Apply(device, clientVersion); + + dbContext.PushDevices.Add(device); + } + else + { + device.UserId = userId; + device.Platform = request.Platform; + device.DeviceToken = deviceToken; + device.DeviceName = NormalizeDeviceName(request.DeviceName); + device.NotificationsEnabled = request.NotificationsEnabled; + device.UpdatedAt = DateTimeOffset.UtcNow; + ClientVersionRequestReader.Apply(device, clientVersion); + } + + await dbContext.SaveChangesAsync(cancellationToken); + return Ok(device.ToDto()); + } + + [HttpDelete("devices/{installationId}")] + public async Task<IActionResult> UnregisterDevice(string installationId, CancellationToken cancellationToken) + { + var userId = User.GetRequiredUserId(); + var normalizedInstallationId = installationId?.Trim() ?? string.Empty; + if (string.IsNullOrWhiteSpace(normalizedInstallationId)) + { + return NotFound(); + } + + var device = await dbContext.PushDevices + .SingleOrDefaultAsync( + x => x.InstallationId == normalizedInstallationId && + x.UserId == userId, + cancellationToken); + + if (device is null) + { + return NotFound(); + } + + dbContext.PushDevices.Remove(device); + await dbContext.SaveChangesAsync(cancellationToken); + return NoContent(); + } + + private static string? NormalizeDeviceName(string? deviceName) + { + var normalized = deviceName?.Trim(); + return string.IsNullOrWhiteSpace(normalized) ? null : normalized; + } +} diff --git a/src/Ikar.Server/Controllers/StoriesController.cs b/src/Ikar.Server/Controllers/StoriesController.cs new file mode 100644 index 00000000..895bf7a8 --- /dev/null +++ b/src/Ikar.Server/Controllers/StoriesController.cs @@ -0,0 +1,335 @@ +using System.Net.Mime; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; +using Ikar.Server.Data; +using Ikar.Server.Data.Entities; +using Ikar.Server.Infrastructure; +using Ikar.Server.Infrastructure.Storage; +using Ikar.Shared; + +namespace Ikar.Server.Controllers; + +[ApiController] +[Authorize] +[Route("api/[controller]")] +public sealed class StoriesController( + IkarDbContext dbContext, + PresenceTracker presenceTracker, + AttachmentStorageService attachmentStorageService) : ControllerBase +{ + private const int MaxStoryAttachmentCount = 10; + private const long MaxStoryUploadSizeBytes = 100L * 1024L * 1024L; + + [HttpGet] + public async Task<ActionResult<IReadOnlyList<StoryDto>>> GetStories(CancellationToken cancellationToken) + { + var userId = User.GetRequiredUserId(); + var peerAuthorIds = await LoadStoryPeerAuthorIdsAsync(userId, cancellationToken); + var now = DateTimeOffset.UtcNow; + + var stories = await dbContext.Stories + .AsNoTracking() + .Include(x => x.AuthorUser) + .ThenInclude(x => x.Sessions) + .Include(x => x.Attachments) + .Include(x => x.Views) + .Where(x => + x.DeletedAt == null && + x.ExpiresAt > now) + .WhereVisibleTo(userId, peerAuthorIds) + .OrderByDescending(x => x.CreatedAt) + .Take(100) + .ToListAsync(cancellationToken); + + return Ok(stories.Select(x => x.ToDto(presenceTracker, userId)).ToList()); + } + + [HttpGet("{storyId:guid}")] + public async Task<ActionResult<StoryDto>> GetStory(Guid storyId, CancellationToken cancellationToken) + { + var userId = User.GetRequiredUserId(); + var peerAuthorIds = await LoadStoryPeerAuthorIdsAsync(userId, cancellationToken); + var now = DateTimeOffset.UtcNow; + + var story = await dbContext.Stories + .Include(x => x.AuthorUser) + .ThenInclude(x => x.Sessions) + .Include(x => x.Attachments) + .Include(x => x.Views) + .Where(x => + x.Id == storyId && + x.DeletedAt == null && + x.ExpiresAt > now) + .WhereVisibleTo(userId, peerAuthorIds) + .SingleOrDefaultAsync(cancellationToken); + if (story is null) + { + return NotFound(); + } + + if (story.AuthorUserId != userId && story.Views.All(x => x.ViewerUserId != userId)) + { + story.Views.Add(new StoryView + { + StoryId = story.Id, + ViewerUserId = userId, + ViewedAt = DateTimeOffset.UtcNow + }); + await dbContext.SaveChangesAsync(cancellationToken); + } + + return Ok(story.ToDto(presenceTracker, userId)); + } + + [HttpPost] + public async Task<ActionResult<StoryDto>> CreateStory(CreateStoryRequest request, CancellationToken cancellationToken) + { + var userId = User.GetRequiredUserId(); + var text = request.Text?.Trim() ?? string.Empty; + if (string.IsNullOrWhiteSpace(text)) + { + return BadRequest("Story text is required for MVP stories."); + } + + var now = DateTimeOffset.UtcNow; + var ttlSeconds = Math.Clamp(request.TtlSeconds, 60, 7 * 24 * 60 * 60); + var story = new Story + { + AuthorUserId = userId, + Text = text.Length <= 4096 ? text : text[..4096], + Visibility = request.Visibility, + HasProtectedContent = request.HasProtectedContent, + CreatedAt = now, + ExpiresAt = now.AddSeconds(ttlSeconds) + }; + + dbContext.Stories.Add(story); + await AddModerationLogAsync(userId, ModerationLogTargetType.Story, story.Id, "story.created", cancellationToken); + await dbContext.SaveChangesAsync(cancellationToken); + + var loaded = await LoadStoryForAuthorAsync(story.Id, userId, cancellationToken) + ?? throw new InvalidOperationException("The created story could not be reloaded."); + return Ok(loaded.ToDto(presenceTracker, userId)); + } + + [HttpPost("media")] + [RequestFormLimits(MultipartBodyLengthLimit = MaxStoryUploadSizeBytes)] + [RequestSizeLimit(MaxStoryUploadSizeBytes)] + public async Task<ActionResult<StoryDto>> CreateMediaStory( + [FromForm] UploadStoryRequest request, + CancellationToken cancellationToken) + { + var userId = User.GetRequiredUserId(); + var files = request.Files + .Where(file => file.Length > 0) + .ToList(); + var text = request.Text?.Trim() ?? string.Empty; + + if (files.Count == 0 && string.IsNullOrWhiteSpace(text)) + { + return BadRequest("Story text or media is required."); + } + + if (files.Count > MaxStoryAttachmentCount) + { + return BadRequest($"A story can contain at most {MaxStoryAttachmentCount} files."); + } + + var totalBytes = files.Sum(x => x.Length); + if (totalBytes > MaxStoryUploadSizeBytes) + { + return BadRequest($"Story upload is limited to {MaxStoryUploadSizeBytes} bytes."); + } + + var now = DateTimeOffset.UtcNow; + var ttlSeconds = Math.Clamp(request.TtlSeconds, 60, 7 * 24 * 60 * 60); + var story = new Story + { + AuthorUserId = userId, + Text = text.Length <= 4096 ? text : text[..4096], + Visibility = request.Visibility, + HasProtectedContent = request.HasProtectedContent, + CreatedAt = now, + ExpiresAt = now.AddSeconds(ttlSeconds) + }; + + dbContext.Stories.Add(story); + var savedAttachments = new List<StoryAttachment>(); + try + { + for (var index = 0; index < files.Count; index++) + { + var attachment = await attachmentStorageService.SaveStoryAsync(story.Id, files[index], cancellationToken, index); + savedAttachments.Add(attachment); + story.Attachments.Add(attachment); + } + + await AddModerationLogAsync(userId, ModerationLogTargetType.Story, story.Id, "story.media.created", cancellationToken); + await dbContext.SaveChangesAsync(cancellationToken); + } + catch (Exception ex) when (ex is IOException or InvalidOperationException) + { + foreach (var attachment in savedAttachments) + { + attachmentStorageService.DeleteIfExists(attachment.StoragePath); + } + + return BadRequest(ex.Message); + } + + var loaded = await LoadStoryForAuthorAsync(story.Id, userId, cancellationToken) + ?? throw new InvalidOperationException("The created story could not be reloaded."); + return Ok(loaded.ToDto(presenceTracker, userId)); + } + + [HttpDelete("{storyId:guid}")] + public async Task<IActionResult> DeleteStory(Guid storyId, CancellationToken cancellationToken) + { + var userId = User.GetRequiredUserId(); + var story = await dbContext.Stories + .Include(x => x.Attachments) + .SingleOrDefaultAsync(x => x.Id == storyId && x.AuthorUserId == userId, cancellationToken); + if (story is null) + { + return NotFound(); + } + + if (story.DeletedAt is null) + { + foreach (var attachment in story.Attachments) + { + attachmentStorageService.DeleteIfExists(attachment.StoragePath); + } + + dbContext.StoryAttachments.RemoveRange(story.Attachments); + story.Attachments.Clear(); + story.Text = string.Empty; + story.DeletedAt = DateTimeOffset.UtcNow; + await AddModerationLogAsync(userId, ModerationLogTargetType.Story, story.Id, "story.deleted", cancellationToken); + await dbContext.SaveChangesAsync(cancellationToken); + } + + return NoContent(); + } + + [HttpGet("{storyId:guid}/views")] + public async Task<ActionResult<IReadOnlyList<StoryViewDto>>> GetStoryViews(Guid storyId, CancellationToken cancellationToken) + { + var userId = User.GetRequiredUserId(); + var storyExists = await dbContext.Stories + .AsNoTracking() + .AnyAsync(x => x.Id == storyId && x.AuthorUserId == userId, cancellationToken); + if (!storyExists) + { + return NotFound(); + } + + var views = await dbContext.StoryViews + .AsNoTracking() + .Include(x => x.ViewerUser) + .ThenInclude(x => x.Sessions) + .Where(x => x.StoryId == storyId) + .OrderByDescending(x => x.ViewedAt) + .Take(250) + .ToListAsync(cancellationToken); + + return Ok(views + .Select(x => new StoryViewDto(x.StoryId, x.ViewerUser.ToDto(presenceTracker), x.ViewedAt)) + .ToList()); + } + + [HttpGet("{storyId:guid}/attachments/{attachmentId:guid}/content")] + public async Task<IActionResult> DownloadAttachment(Guid storyId, Guid attachmentId, CancellationToken cancellationToken) + { + var userId = User.GetRequiredUserId(); + var peerAuthorIds = await LoadStoryPeerAuthorIdsAsync(userId, cancellationToken); + var now = DateTimeOffset.UtcNow; + var attachment = await dbContext.StoryAttachments + .Include(x => x.Story) + .Where( + x => x.Id == attachmentId && + x.StoryId == storyId && + x.Story.DeletedAt == null && + x.Story.ExpiresAt > now) + .WhereStoryVisibleTo(userId, peerAuthorIds) + .SingleOrDefaultAsync(cancellationToken); + if (attachment is null || !System.IO.File.Exists(attachment.StoragePath)) + { + return NotFound(); + } + + var stream = System.IO.File.OpenRead(attachment.StoragePath); + return File(stream, string.IsNullOrWhiteSpace(attachment.ContentType) ? MediaTypeNames.Application.Octet : attachment.ContentType, attachment.OriginalFileName); + } + + private async Task<List<Guid>> LoadStoryPeerAuthorIdsAsync(Guid userId, CancellationToken cancellationToken) + { + var peerIds = await dbContext.ChatMembers + .AsNoTracking() + .Where(x => x.UserId == userId) + .Join( + dbContext.ChatMembers.AsNoTracking(), + mine => mine.ChatId, + other => other.ChatId, + (_, other) => other.UserId) + .Distinct() + .ToListAsync(cancellationToken); + + return peerIds + .Where(id => id != userId) + .Distinct() + .ToList(); + } + + private async Task<Story?> LoadStoryForAuthorAsync(Guid storyId, Guid userId, CancellationToken cancellationToken) => + await dbContext.Stories + .Include(x => x.AuthorUser) + .ThenInclude(x => x.Sessions) + .Include(x => x.Attachments) + .Include(x => x.Views) + .SingleOrDefaultAsync(x => x.Id == storyId && x.AuthorUserId == userId, cancellationToken); + + private async Task AddModerationLogAsync( + Guid actorUserId, + ModerationLogTargetType targetType, + Guid targetId, + string action, + CancellationToken cancellationToken) + { + dbContext.ModerationLogEntries.Add(new ModerationLogEntry + { + ActorUserId = actorUserId, + TargetType = targetType, + TargetId = targetId, + Action = action, + CreatedAt = DateTimeOffset.UtcNow + }); + + await Task.CompletedTask; + } +} + +internal static class StoryVisibilityQueryExtensions +{ + public static IQueryable<Story> WhereVisibleTo( + this IQueryable<Story> query, + Guid userId, + IReadOnlyCollection<Guid> peerAuthorIds) => + query.Where(story => + story.AuthorUserId == userId || + story.Visibility == StoryVisibility.Everyone || + ((story.Visibility == StoryVisibility.Contacts || story.Visibility == StoryVisibility.CloseFriends) && + peerAuthorIds.Contains(story.AuthorUserId))); + + public static IQueryable<StoryAttachment> WhereStoryVisibleTo( + this IQueryable<StoryAttachment> query, + Guid userId, + IReadOnlyCollection<Guid> peerAuthorIds) => + query.Where(attachment => + attachment.Story.AuthorUserId == userId || + attachment.Story.Visibility == StoryVisibility.Everyone || + ((attachment.Story.Visibility == StoryVisibility.Contacts || + attachment.Story.Visibility == StoryVisibility.CloseFriends) && + peerAuthorIds.Contains(attachment.Story.AuthorUserId))); +} diff --git a/src/Ikar.Server/Controllers/UploadAttachmentRequest.cs b/src/Ikar.Server/Controllers/UploadAttachmentRequest.cs new file mode 100644 index 00000000..1539734f --- /dev/null +++ b/src/Ikar.Server/Controllers/UploadAttachmentRequest.cs @@ -0,0 +1,46 @@ +using Ikar.Shared; + +namespace Ikar.Server.Controllers; + +public sealed class UploadAttachmentRequest +{ + public string? Text { get; set; } + + public Guid? ReplyToMessageId { get; set; } + + public Guid? TopicId { get; set; } + + public bool? HasProtectedContent { get; set; } + + public int? TtlSeconds { get; set; } + + public IFormFile? File { get; set; } +} + +public sealed class UploadAttachmentAlbumRequest +{ + public string? Text { get; set; } + + public Guid? ReplyToMessageId { get; set; } + + public Guid? TopicId { get; set; } + + public bool? HasProtectedContent { get; set; } + + public int? TtlSeconds { get; set; } + + public List<IFormFile> Files { get; set; } = []; +} + +public sealed class UploadStoryRequest +{ + public string? Text { get; set; } + + public StoryVisibility Visibility { get; set; } = StoryVisibility.Everyone; + + public bool HasProtectedContent { get; set; } + + public int TtlSeconds { get; set; } = 86400; + + public List<IFormFile> Files { get; set; } = []; +} diff --git a/src/Ikar.Server/Controllers/UsersController.cs b/src/Ikar.Server/Controllers/UsersController.cs new file mode 100644 index 00000000..3c051bf8 --- /dev/null +++ b/src/Ikar.Server/Controllers/UsersController.cs @@ -0,0 +1,544 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; +using System.Security.Claims; +using Ikar.Server.Data; +using Ikar.Server.Data.Entities; +using Ikar.Server.Infrastructure; +using Ikar.Server.Infrastructure.Storage; +using Ikar.Shared; + +namespace Ikar.Server.Controllers; + +[ApiController] +[Authorize] +[Route("api/[controller]")] +public sealed class UsersController( + IkarDbContext dbContext, + PresenceTracker presenceTracker, + AvatarStorageService avatarStorageService) : ControllerBase +{ + private const long MaxAvatarSizeBytes = 5 * 1024 * 1024; + private const int ResolveContactsBatchSize = 500; + private static readonly HashSet<string> AllowedAvatarContentTypes = + [ + "image/gif", + "image/heic", + "image/heif", + "image/jpeg", + "image/png", + "image/webp" + ]; + + private static readonly HashSet<string> AllowedAvatarExtensions = + [ + ".gif", + ".heic", + ".heif", + ".jpeg", + ".jpg", + ".png", + ".webp" + ]; + + [HttpGet("me")] + public async Task<ActionResult<UserSummaryDto>> GetMe(CancellationToken cancellationToken) + { + var userId = User.GetRequiredUserId(); + var user = await dbContext.Users + .Include(x => x.Sessions) + .AsNoTracking() + .SingleAsync(x => x.Id == userId, cancellationToken); + return Ok(user.ToDto(presenceTracker)); + } + + [HttpGet("{userId:guid}")] + public async Task<ActionResult<UserSummaryDto>> GetUser(Guid userId, CancellationToken cancellationToken) + { + var currentUserId = User.GetRequiredUserId(); + var user = await dbContext.Users + .Include(x => x.Sessions) + .AsNoTracking() + .SingleOrDefaultAsync(x => x.Id == userId && !x.IsBlocked, cancellationToken); + + if (user is null) + { + return NotFound(); + } + + if (user.Id != currentUserId && !user.IsBot) + { + var hasSharedChat = await dbContext.ChatMembers + .AsNoTracking() + .Where(x => x.UserId == currentUserId) + .Join( + dbContext.ChatMembers.AsNoTracking().Where(x => x.UserId == userId), + left => left.ChatId, + right => right.ChatId, + (left, _) => left.ChatId) + .AnyAsync(cancellationToken); + + if (!hasSharedChat) + { + return NotFound(); + } + } + + return Ok(user.ToDto(presenceTracker)); + } + + [HttpGet("{userId:guid}/bot-commands")] + public async Task<ActionResult<IReadOnlyList<BotCommandDto>>> GetBotCommands( + Guid userId, + CancellationToken cancellationToken) + { + var botUser = await dbContext.Users + .AsNoTracking() + .Include(x => x.BotProfile) + .ThenInclude(x => x!.Commands) + .SingleOrDefaultAsync(x => x.Id == userId && x.IsBot && !x.IsBlocked, cancellationToken); + + if (botUser?.BotProfile is null || !botUser.BotProfile.IsEnabled) + { + return NotFound(); + } + + return Ok(botUser.BotProfile.Commands + .OrderBy(x => x.SortOrder) + .Select(x => new BotCommandDto(x.Command, x.Description)) + .ToList()); + } + + [HttpPut("me")] + public async Task<ActionResult<UserSummaryDto>> UpdateMe( + UpdateMyProfileRequest request, + CancellationToken cancellationToken) + { + var userId = User.GetRequiredUserId(); + var displayName = request.DisplayName?.Trim() ?? string.Empty; + var about = string.IsNullOrWhiteSpace(request.About) + ? null + : request.About.Trim(); + + if (string.IsNullOrWhiteSpace(displayName)) + { + return ValidationProblem("Display name is required."); + } + + if (displayName.Length > 120) + { + return ValidationProblem("Display name must be 120 characters or fewer."); + } + + if (about?.Length > 70) + { + return ValidationProblem("About must be 70 characters or fewer."); + } + + var user = await dbContext.Users + .Include(x => x.Sessions) + .SingleAsync(x => x.Id == userId, cancellationToken); + + user.DisplayName = displayName; + user.About = about; + await dbContext.SaveChangesAsync(cancellationToken); + + return Ok(user.ToDto(presenceTracker)); + } + + [HttpPost("me/avatar")] + public async Task<ActionResult<UserSummaryDto>> UploadMyAvatar( + [FromForm] IFormFile? file, + CancellationToken cancellationToken) + { + if (file is null) + { + return ValidationProblem("Avatar file is required."); + } + + if (file.Length <= 0) + { + return ValidationProblem("Avatar file is empty."); + } + + if (file.Length > MaxAvatarSizeBytes) + { + return ValidationProblem("Avatar file must be 5 MB or smaller."); + } + + if (!IsSupportedAvatar(file)) + { + return ValidationProblem("Avatar must be PNG, JPG, HEIC, HEIF, WEBP or GIF."); + } + + var userId = User.GetRequiredUserId(); + var user = await dbContext.Users + .Include(x => x.Sessions) + .SingleAsync(x => x.Id == userId, cancellationToken); + + var previousAvatarPath = user.AvatarStoragePath; + var storedAvatar = await avatarStorageService.SaveAsync(userId, file, cancellationToken); + + user.AvatarStoragePath = storedAvatar.PhysicalPath; + user.AvatarContentType = storedAvatar.ContentType; + await dbContext.SaveChangesAsync(cancellationToken); + + avatarStorageService.DeleteIfExists(previousAvatarPath); + return Ok(user.ToDto(presenceTracker)); + } + + [HttpDelete("me/avatar")] + public async Task<ActionResult<UserSummaryDto>> DeleteMyAvatar(CancellationToken cancellationToken) + { + var userId = User.GetRequiredUserId(); + var user = await dbContext.Users + .Include(x => x.Sessions) + .SingleAsync(x => x.Id == userId, cancellationToken); + + var previousAvatarPath = user.AvatarStoragePath; + user.AvatarStoragePath = null; + user.AvatarContentType = null; + await dbContext.SaveChangesAsync(cancellationToken); + + avatarStorageService.DeleteIfExists(previousAvatarPath); + return Ok(user.ToDto(presenceTracker)); + } + + [HttpGet("me/privacy")] + public async Task<ActionResult<PrivacySettingsDto>> GetMyPrivacySettings(CancellationToken cancellationToken) + { + var settings = await GetOrCreatePrivacySettingsAsync(User.GetRequiredUserId(), cancellationToken); + return Ok(ToPrivacyDto(settings)); + } + + [HttpPut("me/privacy")] + public async Task<ActionResult<PrivacySettingsDto>> UpdateMyPrivacySettings( + UpdatePrivacySettingsRequest request, + CancellationToken cancellationToken) + { + var settings = await GetOrCreatePrivacySettingsAsync(User.GetRequiredUserId(), cancellationToken); + settings.PhoneNumberVisibility = NormalizePrivacyVisibility(request.PhoneNumberVisibility, fallback: "contacts"); + settings.LastSeenVisibility = NormalizePrivacyVisibility(request.LastSeenVisibility, fallback: "contacts"); + settings.ProfilePhotoVisibility = NormalizePrivacyVisibility(request.ProfilePhotoVisibility, fallback: "everyone"); + if (request.BlockedUserIds is not null) + { + settings.BlockedUserIds = SerializeUserIdList(request.BlockedUserIds, userId: User.GetRequiredUserId()); + } + + if (request.AlwaysAllowUserIds is not null) + { + settings.AlwaysAllowUserIds = SerializeUserIdList(request.AlwaysAllowUserIds, userId: User.GetRequiredUserId()); + } + + if (request.NeverAllowUserIds is not null) + { + settings.NeverAllowUserIds = SerializeUserIdList(request.NeverAllowUserIds, userId: User.GetRequiredUserId()); + } + + settings.PasscodeLockEnabled = request.PasscodeLockEnabled; + settings.ShowMessagePreview = request.ShowMessagePreview; + settings.UpdatedAt = DateTimeOffset.UtcNow; + await dbContext.SaveChangesAsync(cancellationToken); + return Ok(ToPrivacyDto(settings)); + } + + [HttpGet("me/sessions")] + public async Task<ActionResult<IReadOnlyList<UserSessionDto>>> GetMySessions(CancellationToken cancellationToken) + { + var userId = User.GetRequiredUserId(); + var currentSessionId = User.GetRequiredSessionId(); + var sessions = await dbContext.UserSessions + .AsNoTracking() + .Where(x => x.UserId == userId) + .OrderByDescending(x => x.LastSeenAt) + .Select(x => new UserSessionDto( + x.Id, + x.CreatedAt, + x.LastSeenAt, + x.Id == currentSessionId, + x.Id == currentSessionId ? "This device" : "Ikar session")) + .ToListAsync(cancellationToken); + return Ok(sessions); + } + + [HttpDelete("me/sessions/{sessionId:guid}")] + public async Task<IActionResult> RevokeMySession(Guid sessionId, CancellationToken cancellationToken) + { + var userId = User.GetRequiredUserId(); + var session = await dbContext.UserSessions + .SingleOrDefaultAsync(x => x.Id == sessionId && x.UserId == userId, cancellationToken); + if (session is null) + { + return NotFound(); + } + + dbContext.UserSessions.Remove(session); + await dbContext.SaveChangesAsync(cancellationToken); + return NoContent(); + } + + [AllowAnonymous] + [HttpGet("{userId:guid}/avatar/{avatarFileName}")] + public async Task<IActionResult> GetAvatar( + Guid userId, + string avatarFileName, + CancellationToken cancellationToken) + { + var avatar = await dbContext.Users + .AsNoTracking() + .Where(x => x.Id == userId) + .Select(x => new + { + x.AvatarStoragePath, + x.AvatarContentType, + ProfilePhotoVisibility = x.PrivacySettings == null ? "everyone" : x.PrivacySettings.ProfilePhotoVisibility, + AlwaysAllowUserIds = x.PrivacySettings == null ? string.Empty : x.PrivacySettings.AlwaysAllowUserIds, + NeverAllowUserIds = x.PrivacySettings == null ? string.Empty : x.PrivacySettings.NeverAllowUserIds + }) + .SingleOrDefaultAsync(cancellationToken); + + if (avatar is null || string.IsNullOrWhiteSpace(avatar.AvatarStoragePath)) + { + return NotFound(); + } + + var storedFileName = Path.GetFileName(avatar.AvatarStoragePath); + if (!string.Equals(storedFileName, avatarFileName, StringComparison.OrdinalIgnoreCase) || + !System.IO.File.Exists(avatar.AvatarStoragePath)) + { + return NotFound(); + } + + var viewerUserId = TryGetAuthenticatedUserId(); + if (!await CanViewAvatarAsync( + ownerUserId: userId, + viewerUserId, + avatar.ProfilePhotoVisibility, + avatar.AlwaysAllowUserIds, + avatar.NeverAllowUserIds, + cancellationToken)) + { + return NotFound(); + } + + return PhysicalFile( + avatar.AvatarStoragePath, + string.IsNullOrWhiteSpace(avatar.AvatarContentType) ? "application/octet-stream" : avatar.AvatarContentType); + } + + [HttpGet("search")] + public async Task<ActionResult<IReadOnlyList<UserSummaryDto>>> Search([FromQuery] string? q, CancellationToken cancellationToken) + { + var userId = User.GetRequiredUserId(); + var query = q?.Trim(); + var normalizedPhone = PhoneNumberNormalizer.Normalize(query); + + var usersQuery = dbContext.Users + .AsNoTracking() + .Where(x => x.Id != userId && !x.IsBlocked); + if (!string.IsNullOrWhiteSpace(query)) + { + var normalized = query.ToUpperInvariant(); + usersQuery = usersQuery.Where(x => + x.NormalizedUsername.Contains(normalized) || + EF.Functions.Like(x.DisplayName, $"%{query}%") || + (normalizedPhone != null && x.NormalizedPhoneNumber == normalizedPhone)); + } + + var users = await usersQuery + .Include(x => x.Sessions) + .OrderBy(x => x.DisplayName) + .Take(25) + .ToListAsync(cancellationToken); + + return Ok(users.Select(x => x.ToDto(presenceTracker)).ToList()); + } + + [HttpPost("contacts/resolve")] + public async Task<ActionResult<IReadOnlyList<ContactMatchDto>>> ResolveContacts( + ResolveContactsRequest request, + CancellationToken cancellationToken) + { + var userId = User.GetRequiredUserId(); + var normalizedPhones = request.PhoneNumbers + .Select(PhoneNumberNormalizer.Normalize) + .Where(x => !string.IsNullOrWhiteSpace(x)) + .Distinct(StringComparer.Ordinal) + .ToList(); + + if (normalizedPhones.Count == 0) + { + return Ok(Array.Empty<ContactMatchDto>()); + } + + var phoneOrder = normalizedPhones + .Select((phone, index) => new { phone, index }) + .ToDictionary(x => x.phone!, x => x.index, StringComparer.Ordinal); + + var users = new List<Data.Entities.User>(normalizedPhones.Count); + foreach (var batch in normalizedPhones.Chunk(ResolveContactsBatchSize)) + { + var batchPhones = batch.ToList(); + var batchUsers = await dbContext.Users + .Include(x => x.Sessions) + .AsNoTracking() + .Where(x => + x.Id != userId && + !x.IsBlocked && + x.NormalizedPhoneNumber != null && + batchPhones.Contains(x.NormalizedPhoneNumber)) + .ToListAsync(cancellationToken); + + users.AddRange(batchUsers); + } + + var matches = users + .Where(x => x.NormalizedPhoneNumber is not null) + .OrderBy(x => phoneOrder[x.NormalizedPhoneNumber!]) + .Select(x => new ContactMatchDto( + x.NormalizedPhoneNumber!, + x.ToDto(presenceTracker))) + .ToList(); + + return Ok(matches); + } + + private async Task<UserPrivacySettings> GetOrCreatePrivacySettingsAsync(Guid userId, CancellationToken cancellationToken) + { + var settings = await dbContext.UserPrivacySettings + .SingleOrDefaultAsync(x => x.UserId == userId, cancellationToken); + if (settings is not null) + { + return settings; + } + + settings = new UserPrivacySettings + { + UserId = userId, + PhoneNumberVisibility = "contacts", + LastSeenVisibility = "contacts", + ProfilePhotoVisibility = "everyone", + BlockedUserIds = string.Empty, + AlwaysAllowUserIds = string.Empty, + NeverAllowUserIds = string.Empty, + ShowMessagePreview = true, + UpdatedAt = DateTimeOffset.UtcNow + }; + dbContext.UserPrivacySettings.Add(settings); + await dbContext.SaveChangesAsync(cancellationToken); + return settings; + } + + private static PrivacySettingsDto ToPrivacyDto(UserPrivacySettings settings) => + new( + settings.PhoneNumberVisibility, + settings.LastSeenVisibility, + settings.ProfilePhotoVisibility, + DeserializeUserIdList(settings.BlockedUserIds), + DeserializeUserIdList(settings.AlwaysAllowUserIds), + DeserializeUserIdList(settings.NeverAllowUserIds), + settings.PasscodeLockEnabled, + settings.ShowMessagePreview, + settings.UpdatedAt); + + private static string NormalizePrivacyVisibility(string? value, string fallback) + { + var normalized = value?.Trim().ToLowerInvariant(); + return normalized is "everyone" or "contacts" or "nobody" ? normalized : fallback; + } + + private static string SerializeUserIdList(IEnumerable<Guid> userIds, Guid userId) => + string.Join( + ',', + userIds + .Where(x => x != Guid.Empty && x != userId) + .Distinct() + .Take(500) + .Select(x => x.ToString("D"))); + + private Guid? TryGetAuthenticatedUserId() + { + var value = User.FindFirstValue(ClaimTypes.NameIdentifier); + return Guid.TryParse(value, out var userId) ? userId : null; + } + + private async Task<bool> CanViewAvatarAsync( + Guid ownerUserId, + Guid? viewerUserId, + string? profilePhotoVisibility, + string? alwaysAllowUserIds, + string? neverAllowUserIds, + CancellationToken cancellationToken) + { + if (viewerUserId == ownerUserId) + { + return true; + } + + var neverAllow = DeserializeUserIdList(neverAllowUserIds).ToHashSet(); + if (viewerUserId is not null && neverAllow.Contains(viewerUserId.Value)) + { + return false; + } + + var visibility = NormalizePrivacyVisibility(profilePhotoVisibility, fallback: "everyone"); + if (viewerUserId is null) + { + return visibility == "everyone" && neverAllow.Count == 0; + } + + var alwaysAllow = DeserializeUserIdList(alwaysAllowUserIds).ToHashSet(); + if (alwaysAllow.Contains(viewerUserId.Value)) + { + return true; + } + + return visibility switch + { + "everyone" => true, + "contacts" => await HasSharedChatAsync(ownerUserId, viewerUserId.Value, cancellationToken), + _ => false + }; + } + + private async Task<bool> HasSharedChatAsync( + Guid firstUserId, + Guid secondUserId, + CancellationToken cancellationToken) => + await dbContext.ChatMembers + .AsNoTracking() + .Where(x => x.UserId == firstUserId) + .Join( + dbContext.ChatMembers.AsNoTracking().Where(x => x.UserId == secondUserId), + left => left.ChatId, + right => right.ChatId, + (left, _) => left.ChatId) + .AnyAsync(cancellationToken); + + private static IReadOnlyList<Guid> DeserializeUserIdList(string? value) + { + if (string.IsNullOrWhiteSpace(value)) + { + return []; + } + + return value + .Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries) + .Select(x => Guid.TryParse(x, out var parsed) ? parsed : Guid.Empty) + .Where(x => x != Guid.Empty) + .Distinct() + .ToList(); + } + + private static bool IsSupportedAvatar(IFormFile file) + { + var extension = Path.GetExtension(file.FileName ?? string.Empty).ToLowerInvariant(); + if (!string.IsNullOrWhiteSpace(extension) && AllowedAvatarExtensions.Contains(extension)) + { + return true; + } + + return !string.IsNullOrWhiteSpace(file.ContentType) && + AllowedAvatarContentTypes.Contains(file.ContentType.Trim().ToLowerInvariant()); + } +} diff --git a/src/Ikar.Server/Data/Entities/Entities.cs b/src/Ikar.Server/Data/Entities/Entities.cs new file mode 100644 index 00000000..38faddcc --- /dev/null +++ b/src/Ikar.Server/Data/Entities/Entities.cs @@ -0,0 +1,338 @@ +using Ikar.Shared; + +namespace Ikar.Server.Data.Entities; + +public sealed class User +{ + public Guid Id { get; set; } = Guid.NewGuid(); + public string Username { get; set; } = string.Empty; + public string NormalizedUsername { get; set; } = string.Empty; + public string DisplayName { get; set; } = string.Empty; + public string PasswordHash { get; set; } = string.Empty; + public DateTimeOffset CreatedAt { get; set; } = DateTimeOffset.UtcNow; + public bool IsBlocked { get; set; } + public DateTimeOffset? BlockedAt { get; set; } + public string? PhoneNumber { get; set; } + public string? NormalizedPhoneNumber { get; set; } + public string? About { get; set; } + public string? AvatarStoragePath { get; set; } + public string? AvatarContentType { get; set; } + public bool IsBot { get; set; } + + public ICollection<UserSession> Sessions { get; set; } = new List<UserSession>(); + public UserPrivacySettings? PrivacySettings { get; set; } + public ICollection<ChatMember> ChatMemberships { get; set; } = new List<ChatMember>(); + public ICollection<Chat> CreatedChats { get; set; } = new List<Chat>(); + public ICollection<Message> Messages { get; set; } = new List<Message>(); + public ICollection<MessageReaction> MessageReactions { get; set; } = new List<MessageReaction>(); + public ICollection<PushDevice> PushDevices { get; set; } = new List<PushDevice>(); + public ICollection<Bot> OwnedBots { get; set; } = new List<Bot>(); + public Bot? BotProfile { get; set; } +} + +public sealed class UserPrivacySettings +{ + public Guid UserId { get; set; } + public User User { get; set; } = null!; + public string PhoneNumberVisibility { get; set; } = "contacts"; + public string LastSeenVisibility { get; set; } = "contacts"; + public string ProfilePhotoVisibility { get; set; } = "everyone"; + public string BlockedUserIds { get; set; } = string.Empty; + public string AlwaysAllowUserIds { get; set; } = string.Empty; + public string NeverAllowUserIds { get; set; } = string.Empty; + public bool PasscodeLockEnabled { get; set; } + public bool ShowMessagePreview { get; set; } = true; + public DateTimeOffset UpdatedAt { get; set; } = DateTimeOffset.UtcNow; +} + +public sealed class UserSession +{ + public Guid Id { get; set; } = Guid.NewGuid(); + public Guid UserId { get; set; } + public User User { get; set; } = null!; + public string TokenHash { get; set; } = string.Empty; + public string? ClientPlatform { get; set; } + public int? ClientVersionCode { get; set; } + public string? ClientVersionName { get; set; } + public DateTimeOffset CreatedAt { get; set; } = DateTimeOffset.UtcNow; + public DateTimeOffset LastSeenAt { get; set; } = DateTimeOffset.UtcNow; +} + +public sealed class Chat +{ + public Guid Id { get; set; } = Guid.NewGuid(); + public ChatType Type { get; set; } + public string? Title { get; set; } + public string? Description { get; set; } + public string? PublicUsername { get; set; } + public Guid? LinkedDiscussionChatId { get; set; } + public Chat? LinkedDiscussionChat { get; set; } + public bool ChannelSignaturesEnabled { get; set; } + public bool TopicsEnabled { get; set; } + public bool HasProtectedContent { get; set; } + public int? DefaultMessageTtlSeconds { get; set; } + public Guid CreatedById { get; set; } + public User CreatedBy { get; set; } = null!; + public DateTimeOffset CreatedAt { get; set; } = DateTimeOffset.UtcNow; + public DateTimeOffset? LastActivityAt { get; set; } + + public ICollection<ChatMember> Members { get; set; } = new List<ChatMember>(); + public ICollection<Message> Messages { get; set; } = new List<Message>(); + public ICollection<ChatInviteLink> InviteLinks { get; set; } = new List<ChatInviteLink>(); + public ICollection<ChatJoinRequest> JoinRequests { get; set; } = new List<ChatJoinRequest>(); + public ICollection<ChatTopic> Topics { get; set; } = new List<ChatTopic>(); +} + +public sealed class ChatInviteLink +{ + public Guid Id { get; set; } = Guid.NewGuid(); + public Guid ChatId { get; set; } + public Chat Chat { get; set; } = null!; + public Guid CreatedById { get; set; } + public User CreatedBy { get; set; } = null!; + public string Token { get; set; } = string.Empty; + public string? Title { get; set; } + public bool CreatesJoinRequest { get; set; } + public bool IsRevoked { get; set; } + public DateTimeOffset CreatedAt { get; set; } = DateTimeOffset.UtcNow; + public DateTimeOffset? RevokedAt { get; set; } +} + +public sealed class ChatTopic +{ + public Guid Id { get; set; } = Guid.NewGuid(); + public Guid ChatId { get; set; } + public Chat Chat { get; set; } = null!; + public Guid CreatedById { get; set; } + public User CreatedBy { get; set; } = null!; + public string Title { get; set; } = string.Empty; + public string Icon { get; set; } = "💬"; + public bool IsPinned { get; set; } + public bool IsClosed { get; set; } + public DateTimeOffset CreatedAt { get; set; } = DateTimeOffset.UtcNow; + public DateTimeOffset LastActivityAt { get; set; } = DateTimeOffset.UtcNow; +} + +public sealed class ChatJoinRequest +{ + public Guid Id { get; set; } = Guid.NewGuid(); + public Guid ChatId { get; set; } + public Chat Chat { get; set; } = null!; + public Guid InviteLinkId { get; set; } + public ChatInviteLink InviteLink { get; set; } = null!; + public Guid UserId { get; set; } + public User User { get; set; } = null!; + public ChatJoinRequestStatus Status { get; set; } = ChatJoinRequestStatus.Pending; + public DateTimeOffset RequestedAt { get; set; } = DateTimeOffset.UtcNow; + public DateTimeOffset? ResolvedAt { get; set; } + public Guid? ResolvedByUserId { get; set; } + public User? ResolvedByUser { get; set; } +} + +public sealed class ChatMember +{ + public Guid ChatId { get; set; } + public Chat Chat { get; set; } = null!; + public Guid UserId { get; set; } + public User User { get; set; } = null!; + public bool IsOwner { get; set; } + public ChatMemberRole Role { get; set; } = ChatMemberRole.Member; + public bool CanPinMessages { get; set; } = true; + public bool CanDeleteMessages { get; set; } + public bool CanInviteUsers { get; set; } = true; + public bool CanPostMessages { get; set; } = true; + public bool IsArchived { get; set; } + public bool IsPinned { get; set; } + public DateTimeOffset? MutedUntil { get; set; } + public string? FolderKey { get; set; } + public DateTimeOffset JoinedAt { get; set; } = DateTimeOffset.UtcNow; + public DateTimeOffset? LastDeliveredAt { get; set; } + public DateTimeOffset? LastReadAt { get; set; } +} + +public sealed class Message +{ + public Guid Id { get; set; } = Guid.NewGuid(); + public Guid ChatId { get; set; } + public Chat Chat { get; set; } = null!; + public Guid SenderId { get; set; } + public User Sender { get; set; } = null!; + public string Text { get; set; } = string.Empty; + public DateTimeOffset SentAt { get; set; } = DateTimeOffset.UtcNow; + public DateTimeOffset? EditedAt { get; set; } + public DateTimeOffset? DeletedAt { get; set; } + public string? ForwardedFromDisplayName { get; set; } + public Guid? ReplyToMessageId { get; set; } + public Message? ReplyToMessage { get; set; } + public DateTimeOffset? PinnedAt { get; set; } + public Guid? PinnedByUserId { get; set; } + public User? PinnedByUser { get; set; } + public Guid? MediaAlbumId { get; set; } + public Guid? TopicId { get; set; } + public ChatTopic? Topic { get; set; } + public bool HasProtectedContent { get; set; } + public DateTimeOffset? ExpiresAt { get; set; } + public int? TtlSeconds { get; set; } + public bool PostedAsChannel { get; set; } + public string? AuthorSignature { get; set; } + + public ICollection<Message> Replies { get; set; } = new List<Message>(); + public ICollection<MessageAttachment> Attachments { get; set; } = new List<MessageAttachment>(); + public ICollection<MessageReaction> Reactions { get; set; } = new List<MessageReaction>(); + public ICollection<MessageView> Views { get; set; } = new List<MessageView>(); + public ICollection<BotUpdate> BotUpdates { get; set; } = new List<BotUpdate>(); +} + +public sealed class MessageAttachment +{ + public Guid Id { get; set; } = Guid.NewGuid(); + public Guid MessageId { get; set; } + public Message Message { get; set; } = null!; + public string OriginalFileName { get; set; } = string.Empty; + public string ContentType { get; set; } = "application/octet-stream"; + public long FileSizeBytes { get; set; } + public string StoragePath { get; set; } = string.Empty; + public int SortOrder { get; set; } + public DateTimeOffset UploadedAt { get; set; } = DateTimeOffset.UtcNow; +} + +public sealed class MessageReaction +{ + public Guid Id { get; set; } = Guid.NewGuid(); + public Guid MessageId { get; set; } + public Message Message { get; set; } = null!; + public Guid UserId { get; set; } + public User User { get; set; } = null!; + public string Emoji { get; set; } = string.Empty; + public DateTimeOffset CreatedAt { get; set; } = DateTimeOffset.UtcNow; +} + +public sealed class MessageView +{ + public Guid MessageId { get; set; } + public Message Message { get; set; } = null!; + public Guid ViewerUserId { get; set; } + public User ViewerUser { get; set; } = null!; + public DateTimeOffset ViewedAt { get; set; } = DateTimeOffset.UtcNow; +} + +public sealed class PushDevice +{ + public Guid Id { get; set; } = Guid.NewGuid(); + public Guid UserId { get; set; } + public User User { get; set; } = null!; + public PushPlatform Platform { get; set; } + public string InstallationId { get; set; } = string.Empty; + public string DeviceToken { get; set; } = string.Empty; + public string? DeviceName { get; set; } + public string? ClientPlatform { get; set; } + public int? ClientVersionCode { get; set; } + public string? ClientVersionName { get; set; } + public bool NotificationsEnabled { get; set; } + public DateTimeOffset CreatedAt { get; set; } = DateTimeOffset.UtcNow; + public DateTimeOffset UpdatedAt { get; set; } = DateTimeOffset.UtcNow; +} + +public sealed class Bot +{ + public Guid Id { get; set; } = Guid.NewGuid(); + public Guid UserId { get; set; } + public User User { get; set; } = null!; + public Guid OwnerUserId { get; set; } + public User OwnerUser { get; set; } = null!; + public string TokenHash { get; set; } = string.Empty; + public bool IsEnabled { get; set; } = true; + public DateTimeOffset CreatedAt { get; set; } = DateTimeOffset.UtcNow; + public DateTimeOffset UpdatedAt { get; set; } = DateTimeOffset.UtcNow; + + public ICollection<BotCommand> Commands { get; set; } = new List<BotCommand>(); + public ICollection<BotUpdate> Updates { get; set; } = new List<BotUpdate>(); +} + +public sealed class BotCommand +{ + public Guid Id { get; set; } = Guid.NewGuid(); + public Guid BotId { get; set; } + public Bot Bot { get; set; } = null!; + public string Command { get; set; } = string.Empty; + public string Description { get; set; } = string.Empty; + public int SortOrder { get; set; } +} + +public sealed class BotUpdate +{ + public long Id { get; set; } + public Guid BotId { get; set; } + public Bot Bot { get; set; } = null!; + public Guid ChatId { get; set; } + public Chat Chat { get; set; } = null!; + public Guid MessageId { get; set; } + public Message Message { get; set; } = null!; + public DateTimeOffset CreatedAt { get; set; } = DateTimeOffset.UtcNow; +} + +public sealed class ModerationLogEntry +{ + public long Id { get; set; } + public Guid? ChatId { get; set; } + public Chat? Chat { get; set; } + public Guid ActorUserId { get; set; } + public User ActorUser { get; set; } = null!; + public ModerationLogTargetType TargetType { get; set; } + public Guid? TargetId { get; set; } + public string Action { get; set; } = string.Empty; + public string? Reason { get; set; } + public DateTimeOffset CreatedAt { get; set; } = DateTimeOffset.UtcNow; +} + +public sealed class Story +{ + public Guid Id { get; set; } = Guid.NewGuid(); + public Guid AuthorUserId { get; set; } + public User AuthorUser { get; set; } = null!; + public string Text { get; set; } = string.Empty; + public StoryVisibility Visibility { get; set; } = StoryVisibility.Everyone; + public bool HasProtectedContent { get; set; } + public DateTimeOffset CreatedAt { get; set; } = DateTimeOffset.UtcNow; + public DateTimeOffset ExpiresAt { get; set; } = DateTimeOffset.UtcNow.AddHours(24); + public DateTimeOffset? DeletedAt { get; set; } + + public ICollection<StoryAttachment> Attachments { get; set; } = new List<StoryAttachment>(); + public ICollection<StoryView> Views { get; set; } = new List<StoryView>(); +} + +public sealed class StoryAttachment +{ + public Guid Id { get; set; } = Guid.NewGuid(); + public Guid StoryId { get; set; } + public Story Story { get; set; } = null!; + public string OriginalFileName { get; set; } = string.Empty; + public string ContentType { get; set; } = "application/octet-stream"; + public long FileSizeBytes { get; set; } + public string StoragePath { get; set; } = string.Empty; + public int SortOrder { get; set; } + public DateTimeOffset UploadedAt { get; set; } = DateTimeOffset.UtcNow; +} + +public sealed class StoryView +{ + public Guid StoryId { get; set; } + public Story Story { get; set; } = null!; + public Guid ViewerUserId { get; set; } + public User ViewerUser { get; set; } = null!; + public DateTimeOffset ViewedAt { get; set; } = DateTimeOffset.UtcNow; +} + +public sealed class AndroidUpdateCompatibilityHit +{ + public long Id { get; set; } + public DateTimeOffset HitAt { get; set; } = DateTimeOffset.UtcNow; + public string Route { get; set; } = string.Empty; + public string RequestPath { get; set; } = string.Empty; + public string? RequestedFileName { get; set; } + public string? ClientPlatform { get; set; } + public int? ClientVersionCode { get; set; } + public string? ClientVersionName { get; set; } + public string? UserAgent { get; set; } + public string? RemoteIp { get; set; } +} diff --git a/src/Ikar.Server/Data/IkarDbContext.cs b/src/Ikar.Server/Data/IkarDbContext.cs new file mode 100644 index 00000000..8a755627 --- /dev/null +++ b/src/Ikar.Server/Data/IkarDbContext.cs @@ -0,0 +1,495 @@ +using Ikar.Server.Data.Entities; +using System.Globalization; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +namespace Ikar.Server.Data; + +public sealed class IkarDbContext(DbContextOptions<IkarDbContext> options) : DbContext(options) +{ + private static readonly ValueConverter<DateTimeOffset, string> DateTimeOffsetToStringConverter = new( + value => value.ToUniversalTime().ToString("O", CultureInfo.InvariantCulture), + value => DateTimeOffset.Parse(value, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind)); + + private static readonly ValueConverter<DateTimeOffset?, string?> NullableDateTimeOffsetToStringConverter = new( + value => value.HasValue ? value.Value.ToUniversalTime().ToString("O", CultureInfo.InvariantCulture) : null, + value => value == null ? null : DateTimeOffset.Parse(value, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind)); + + public DbSet<User> Users => Set<User>(); + public DbSet<UserSession> UserSessions => Set<UserSession>(); + public DbSet<UserPrivacySettings> UserPrivacySettings => Set<UserPrivacySettings>(); + public DbSet<Chat> Chats => Set<Chat>(); + public DbSet<ChatMember> ChatMembers => Set<ChatMember>(); + public DbSet<ChatInviteLink> ChatInviteLinks => Set<ChatInviteLink>(); + public DbSet<ChatJoinRequest> ChatJoinRequests => Set<ChatJoinRequest>(); + public DbSet<ChatTopic> ChatTopics => Set<ChatTopic>(); + public DbSet<Message> Messages => Set<Message>(); + public DbSet<MessageAttachment> MessageAttachments => Set<MessageAttachment>(); + public DbSet<MessageReaction> MessageReactions => Set<MessageReaction>(); + public DbSet<MessageView> MessageViews => Set<MessageView>(); + public DbSet<PushDevice> PushDevices => Set<PushDevice>(); + public DbSet<Bot> Bots => Set<Bot>(); + public DbSet<BotCommand> BotCommands => Set<BotCommand>(); + public DbSet<BotUpdate> BotUpdates => Set<BotUpdate>(); + public DbSet<ModerationLogEntry> ModerationLogEntries => Set<ModerationLogEntry>(); + public DbSet<Story> Stories => Set<Story>(); + public DbSet<StoryAttachment> StoryAttachments => Set<StoryAttachment>(); + public DbSet<StoryView> StoryViews => Set<StoryView>(); + public DbSet<AndroidUpdateCompatibilityHit> AndroidUpdateCompatibilityHits => Set<AndroidUpdateCompatibilityHit>(); + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + ConfigureUsers(modelBuilder); + ConfigureChats(modelBuilder); + ConfigureMessages(modelBuilder); + ConfigurePushDevices(modelBuilder); + ConfigureBots(modelBuilder); + ConfigureModeration(modelBuilder); + ConfigureStories(modelBuilder); + ConfigureAndroidUpdateCompatibility(modelBuilder); + ConfigureDateTimeOffsetConverters(modelBuilder); + } + + private static void ConfigureDateTimeOffsetConverters(ModelBuilder modelBuilder) + { + foreach (var property in modelBuilder.Model.GetEntityTypes().SelectMany(entityType => entityType.GetProperties())) + { + if (property.ClrType == typeof(DateTimeOffset)) + { + property.SetValueConverter(DateTimeOffsetToStringConverter); + } + else if (property.ClrType == typeof(DateTimeOffset?)) + { + property.SetValueConverter(NullableDateTimeOffsetToStringConverter); + } + } + } + + private static void ConfigureUsers(ModelBuilder modelBuilder) + { + modelBuilder.Entity<User>(entity => + { + entity.ToTable("Users"); + entity.HasKey(x => x.Id); + entity.HasIndex(x => x.NormalizedUsername).IsUnique(); + entity.HasIndex(x => x.NormalizedPhoneNumber) + .IsUnique() + .HasFilter("\"NormalizedPhoneNumber\" IS NOT NULL"); + + entity.Property(x => x.Username).IsRequired(); + entity.Property(x => x.NormalizedUsername).IsRequired(); + entity.Property(x => x.DisplayName).IsRequired(); + entity.Property(x => x.PasswordHash).IsRequired(); + + entity.HasMany(x => x.Sessions) + .WithOne(x => x.User) + .HasForeignKey(x => x.UserId) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(x => x.PrivacySettings) + .WithOne(x => x.User) + .HasForeignKey<UserPrivacySettings>(x => x.UserId) + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity<UserPrivacySettings>(entity => + { + entity.ToTable("UserPrivacySettings"); + entity.HasKey(x => x.UserId); + entity.Property(x => x.PhoneNumberVisibility).IsRequired(); + entity.Property(x => x.LastSeenVisibility).IsRequired(); + entity.Property(x => x.ProfilePhotoVisibility).IsRequired(); + entity.Property(x => x.BlockedUserIds).IsRequired(); + entity.Property(x => x.AlwaysAllowUserIds).IsRequired(); + entity.Property(x => x.NeverAllowUserIds).IsRequired(); + }); + + modelBuilder.Entity<UserSession>(entity => + { + entity.ToTable("UserSessions"); + entity.HasKey(x => x.Id); + entity.HasIndex(x => x.TokenHash).IsUnique(); + entity.HasIndex(x => x.UserId); + entity.Property(x => x.TokenHash).IsRequired(); + entity.Property(x => x.ClientPlatform).HasMaxLength(32); + entity.Property(x => x.ClientVersionName).HasMaxLength(64); + }); + } + + private static void ConfigureChats(ModelBuilder modelBuilder) + { + modelBuilder.Entity<Chat>(entity => + { + entity.ToTable("Chats"); + entity.HasKey(x => x.Id); + entity.HasIndex(x => x.CreatedById); + entity.HasIndex(x => x.LastActivityAt); + entity.HasIndex(x => x.LinkedDiscussionChatId); + entity.HasIndex(x => x.PublicUsername) + .IsUnique() + .HasFilter("\"PublicUsername\" IS NOT NULL"); + + entity.HasOne(x => x.CreatedBy) + .WithMany(x => x.CreatedChats) + .HasForeignKey(x => x.CreatedById) + .OnDelete(DeleteBehavior.Restrict); + + entity.HasMany(x => x.Members) + .WithOne(x => x.Chat) + .HasForeignKey(x => x.ChatId) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasMany(x => x.Messages) + .WithOne(x => x.Chat) + .HasForeignKey(x => x.ChatId) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasMany(x => x.InviteLinks) + .WithOne(x => x.Chat) + .HasForeignKey(x => x.ChatId) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasMany(x => x.JoinRequests) + .WithOne(x => x.Chat) + .HasForeignKey(x => x.ChatId) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasMany(x => x.Topics) + .WithOne(x => x.Chat) + .HasForeignKey(x => x.ChatId) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(x => x.LinkedDiscussionChat) + .WithMany() + .HasForeignKey(x => x.LinkedDiscussionChatId) + .OnDelete(DeleteBehavior.SetNull); + }); + + modelBuilder.Entity<ChatInviteLink>(entity => + { + entity.ToTable("ChatInviteLinks"); + entity.HasKey(x => x.Id); + entity.HasIndex(x => x.ChatId); + entity.HasIndex(x => x.Token).IsUnique(); + entity.Property(x => x.Token).IsRequired(); + + entity.HasOne(x => x.CreatedBy) + .WithMany() + .HasForeignKey(x => x.CreatedById) + .OnDelete(DeleteBehavior.Restrict); + }); + + modelBuilder.Entity<ChatJoinRequest>(entity => + { + entity.ToTable("ChatJoinRequests"); + entity.HasKey(x => x.Id); + entity.HasIndex(x => new { x.ChatId, x.Status }); + entity.HasIndex(x => new { x.InviteLinkId, x.UserId }).IsUnique(); + entity.HasIndex(x => x.UserId); + + entity.HasOne(x => x.InviteLink) + .WithMany() + .HasForeignKey(x => x.InviteLinkId) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(x => x.User) + .WithMany() + .HasForeignKey(x => x.UserId) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(x => x.ResolvedByUser) + .WithMany() + .HasForeignKey(x => x.ResolvedByUserId) + .OnDelete(DeleteBehavior.SetNull); + }); + + modelBuilder.Entity<ChatTopic>(entity => + { + entity.ToTable("ChatTopics"); + entity.HasKey(x => x.Id); + entity.HasIndex(x => new { x.ChatId, x.IsPinned }); + entity.HasIndex(x => new { x.ChatId, x.LastActivityAt }); + entity.Property(x => x.Title).IsRequired(); + entity.Property(x => x.Icon).IsRequired(); + + entity.HasOne(x => x.CreatedBy) + .WithMany() + .HasForeignKey(x => x.CreatedById) + .OnDelete(DeleteBehavior.Restrict); + }); + + modelBuilder.Entity<ChatMember>(entity => + { + entity.ToTable("ChatMembers"); + entity.HasKey(x => new { x.ChatId, x.UserId }); + entity.HasIndex(x => x.UserId); + entity.HasIndex(x => new { x.UserId, x.IsPinned }); + entity.HasIndex(x => new { x.UserId, x.IsArchived }); + entity.HasIndex(x => new { x.UserId, x.FolderKey }); + + entity.HasOne(x => x.User) + .WithMany(x => x.ChatMemberships) + .HasForeignKey(x => x.UserId) + .OnDelete(DeleteBehavior.Cascade); + }); + } + + private static void ConfigureMessages(ModelBuilder modelBuilder) + { + modelBuilder.Entity<Message>(entity => + { + entity.ToTable("Messages"); + entity.HasKey(x => x.Id); + entity.HasIndex(x => new { x.ChatId, x.SentAt }); + entity.HasIndex(x => new { x.ChatId, x.SenderId, x.SentAt }); + entity.HasIndex(x => x.SenderId); + entity.HasIndex(x => x.ReplyToMessageId); + entity.HasIndex(x => x.TopicId); + entity.HasIndex(x => new { x.ChatId, x.PinnedAt }); + entity.HasIndex(x => x.MediaAlbumId); + entity.HasIndex(x => x.ExpiresAt); + + entity.Property(x => x.Text).IsRequired(); + + entity.HasOne(x => x.Sender) + .WithMany(x => x.Messages) + .HasForeignKey(x => x.SenderId) + .OnDelete(DeleteBehavior.Restrict); + + entity.HasOne(x => x.ReplyToMessage) + .WithMany(x => x.Replies) + .HasForeignKey(x => x.ReplyToMessageId) + .OnDelete(DeleteBehavior.SetNull); + + entity.HasOne(x => x.PinnedByUser) + .WithMany() + .HasForeignKey(x => x.PinnedByUserId) + .OnDelete(DeleteBehavior.SetNull); + + entity.HasOne(x => x.Topic) + .WithMany() + .HasForeignKey(x => x.TopicId) + .OnDelete(DeleteBehavior.SetNull); + + entity.HasMany(x => x.Attachments) + .WithOne(x => x.Message) + .HasForeignKey(x => x.MessageId) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasMany(x => x.Reactions) + .WithOne(x => x.Message) + .HasForeignKey(x => x.MessageId) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasMany(x => x.Views) + .WithOne(x => x.Message) + .HasForeignKey(x => x.MessageId) + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity<MessageAttachment>(entity => + { + entity.ToTable("MessageAttachments"); + entity.HasKey(x => x.Id); + entity.HasIndex(x => x.MessageId); + entity.HasIndex(x => new { x.MessageId, x.SortOrder }); + entity.Property(x => x.OriginalFileName).IsRequired(); + entity.Property(x => x.ContentType).IsRequired(); + entity.Property(x => x.StoragePath).IsRequired(); + }); + + modelBuilder.Entity<MessageReaction>(entity => + { + entity.ToTable("MessageReactions"); + entity.HasKey(x => x.Id); + entity.HasIndex(x => x.MessageId); + entity.HasIndex(x => new { x.MessageId, x.UserId }).IsUnique(); + entity.Property(x => x.Emoji).IsRequired(); + + entity.HasOne(x => x.User) + .WithMany(x => x.MessageReactions) + .HasForeignKey(x => x.UserId) + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity<MessageView>(entity => + { + entity.ToTable("MessageViews"); + entity.HasKey(x => new { x.MessageId, x.ViewerUserId }); + entity.HasIndex(x => x.ViewerUserId); + + entity.HasOne(x => x.ViewerUser) + .WithMany() + .HasForeignKey(x => x.ViewerUserId) + .OnDelete(DeleteBehavior.Cascade); + }); + } + + private static void ConfigureModeration(ModelBuilder modelBuilder) + { + modelBuilder.Entity<ModerationLogEntry>(entity => + { + entity.ToTable("ModerationLogEntries"); + entity.HasKey(x => x.Id); + entity.Property(x => x.Id).ValueGeneratedOnAdd(); + entity.Property(x => x.Action).IsRequired(); + entity.HasIndex(x => new { x.ChatId, x.CreatedAt }); + entity.HasIndex(x => new { x.TargetType, x.TargetId }); + + entity.HasOne(x => x.Chat) + .WithMany() + .HasForeignKey(x => x.ChatId) + .OnDelete(DeleteBehavior.SetNull); + + entity.HasOne(x => x.ActorUser) + .WithMany() + .HasForeignKey(x => x.ActorUserId) + .OnDelete(DeleteBehavior.Restrict); + }); + } + + private static void ConfigureStories(ModelBuilder modelBuilder) + { + modelBuilder.Entity<Story>(entity => + { + entity.ToTable("Stories"); + entity.HasKey(x => x.Id); + entity.HasIndex(x => new { x.AuthorUserId, x.CreatedAt }); + entity.HasIndex(x => x.ExpiresAt); + entity.Property(x => x.Text).IsRequired(); + + entity.HasOne(x => x.AuthorUser) + .WithMany() + .HasForeignKey(x => x.AuthorUserId) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasMany(x => x.Attachments) + .WithOne(x => x.Story) + .HasForeignKey(x => x.StoryId) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasMany(x => x.Views) + .WithOne(x => x.Story) + .HasForeignKey(x => x.StoryId) + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity<StoryAttachment>(entity => + { + entity.ToTable("StoryAttachments"); + entity.HasKey(x => x.Id); + entity.HasIndex(x => new { x.StoryId, x.SortOrder }); + entity.Property(x => x.OriginalFileName).IsRequired(); + entity.Property(x => x.ContentType).IsRequired(); + entity.Property(x => x.StoragePath).IsRequired(); + }); + + modelBuilder.Entity<StoryView>(entity => + { + entity.ToTable("StoryViews"); + entity.HasKey(x => new { x.StoryId, x.ViewerUserId }); + entity.HasIndex(x => x.ViewerUserId); + + entity.HasOne(x => x.ViewerUser) + .WithMany() + .HasForeignKey(x => x.ViewerUserId) + .OnDelete(DeleteBehavior.Cascade); + }); + } + + private static void ConfigurePushDevices(ModelBuilder modelBuilder) + { + modelBuilder.Entity<PushDevice>(entity => + { + entity.ToTable("PushDevices"); + entity.HasKey(x => x.Id); + entity.HasIndex(x => x.InstallationId).IsUnique(); + entity.HasIndex(x => x.UserId); + entity.Property(x => x.InstallationId).IsRequired(); + entity.Property(x => x.DeviceToken).IsRequired(); + entity.Property(x => x.ClientPlatform).HasMaxLength(32); + entity.Property(x => x.ClientVersionName).HasMaxLength(64); + + entity.HasOne(x => x.User) + .WithMany(x => x.PushDevices) + .HasForeignKey(x => x.UserId) + .OnDelete(DeleteBehavior.Cascade); + }); + } + + private static void ConfigureBots(ModelBuilder modelBuilder) + { + modelBuilder.Entity<Bot>(entity => + { + entity.ToTable("Bots"); + entity.HasKey(x => x.Id); + entity.HasIndex(x => x.UserId).IsUnique(); + entity.HasIndex(x => x.OwnerUserId); + entity.HasIndex(x => x.TokenHash).IsUnique(); + entity.Property(x => x.TokenHash).IsRequired(); + + entity.HasOne(x => x.User) + .WithOne(x => x.BotProfile) + .HasForeignKey<Bot>(x => x.UserId) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(x => x.OwnerUser) + .WithMany(x => x.OwnedBots) + .HasForeignKey(x => x.OwnerUserId) + .OnDelete(DeleteBehavior.Restrict); + }); + + modelBuilder.Entity<BotCommand>(entity => + { + entity.ToTable("BotCommands"); + entity.HasKey(x => x.Id); + entity.HasIndex(x => new { x.BotId, x.Command }).IsUnique(); + entity.Property(x => x.Command).IsRequired(); + entity.Property(x => x.Description).IsRequired(); + + entity.HasOne(x => x.Bot) + .WithMany(x => x.Commands) + .HasForeignKey(x => x.BotId) + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity<BotUpdate>(entity => + { + entity.ToTable("BotUpdates"); + entity.HasKey(x => x.Id); + entity.Property(x => x.Id).ValueGeneratedOnAdd(); + entity.HasIndex(x => new { x.BotId, x.Id }); + entity.HasIndex(x => new { x.BotId, x.MessageId }).IsUnique(); + + entity.HasOne(x => x.Bot) + .WithMany(x => x.Updates) + .HasForeignKey(x => x.BotId) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(x => x.Chat) + .WithMany() + .HasForeignKey(x => x.ChatId) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(x => x.Message) + .WithMany(x => x.BotUpdates) + .HasForeignKey(x => x.MessageId) + .OnDelete(DeleteBehavior.Cascade); + }); + } + + private static void ConfigureAndroidUpdateCompatibility(ModelBuilder modelBuilder) + { + modelBuilder.Entity<AndroidUpdateCompatibilityHit>(entity => + { + entity.ToTable("AndroidUpdateCompatibilityHits"); + entity.HasKey(x => x.Id); + entity.Property(x => x.Id).ValueGeneratedOnAdd(); + entity.HasIndex(x => x.HitAt); + entity.HasIndex(x => new { x.Route, x.HitAt }); + entity.HasIndex(x => new { x.ClientPlatform, x.ClientVersionCode, x.HitAt }); + entity.Property(x => x.Route).IsRequired(); + entity.Property(x => x.RequestPath).IsRequired(); + }); + } +} diff --git a/src/Ikar.Server/Ikar.Server.csproj b/src/Ikar.Server/Ikar.Server.csproj new file mode 100644 index 00000000..ce2e83bc --- /dev/null +++ b/src/Ikar.Server/Ikar.Server.csproj @@ -0,0 +1,19 @@ +<Project Sdk="Microsoft.NET.Sdk.Web"> + + <PropertyGroup> + <TargetFramework>net10.0</TargetFramework> + <Nullable>enable</Nullable> + <ImplicitUsings>enable</ImplicitUsings> + </PropertyGroup> + + <ItemGroup> + <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="10.0.4" /> + <PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="10.0.4" /> + <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="10.0.4" /> + </ItemGroup> + + <ItemGroup> + <ProjectReference Include="..\Ikar.Shared\Ikar.Shared.csproj" /> + </ItemGroup> + +</Project> diff --git a/src/Ikar.Server/Ikar.Server.http b/src/Ikar.Server/Ikar.Server.http new file mode 100644 index 00000000..36fbba3b --- /dev/null +++ b/src/Ikar.Server/Ikar.Server.http @@ -0,0 +1,6 @@ +@Ikar.Server_HostAddress = http://localhost:5289 + +GET {{Ikar.Server_HostAddress}}/weatherforecast/ +Accept: application/json + +### diff --git a/src/Ikar.Server/Infrastructure/Admin/AdminAuthConstants.cs b/src/Ikar.Server/Infrastructure/Admin/AdminAuthConstants.cs new file mode 100644 index 00000000..5c9a4ba8 --- /dev/null +++ b/src/Ikar.Server/Infrastructure/Admin/AdminAuthConstants.cs @@ -0,0 +1,7 @@ +namespace Ikar.Server.Infrastructure.Admin; + +public static class AdminAuthConstants +{ + public const string Scheme = "AdminCookie"; + public const string Policy = "AdminOnly"; +} diff --git a/src/Ikar.Server/Infrastructure/Admin/AdminDtos.cs b/src/Ikar.Server/Infrastructure/Admin/AdminDtos.cs new file mode 100644 index 00000000..a7c200b6 --- /dev/null +++ b/src/Ikar.Server/Infrastructure/Admin/AdminDtos.cs @@ -0,0 +1,247 @@ +using Ikar.Shared; + +namespace Ikar.Server.Infrastructure.Admin; + +public sealed record AdminSessionStateDto( + bool Configured, + bool Authenticated, + string? Username); + +public sealed record AdminStatusDto( + string Environment, + string ServerVersion, + DateTimeOffset StartedAtUtc, + DateTimeOffset CurrentTimeUtc, + bool DatabaseReachable, + string? DatabaseConnection, + int TotalUsers, + int BlockedUsers, + int BotUsers, + int TotalBots, + int EnabledBots, + int TotalChats, + int DirectChats, + int GroupChats, + int ChannelChats, + int ProtectedChats, + int TotalMessages, + int ProtectedMessages, + int ExpiringMessages, + int PinnedMessages, + int TotalAttachments, + long AttachmentBytes, + int TotalStories, + int ActiveStories, + int ProtectedStories, + int ActiveSessions, + int RegisteredPushDevices, + int PendingJoinRequests, + int ActiveInviteLinks, + int Topics, + int ModerationEvents, + int ProcessId); + +public sealed record AdminUserDto( + Guid Id, + string Username, + string DisplayName, + bool IsBlocked, + bool IsBot, + DateTimeOffset CreatedAt, + DateTimeOffset? BlockedAt, + DateTimeOffset? LastSeenAt, + string? PhoneNumber, + string? About, + string? ClientPlatform, + int? ClientVersionCode, + string? ClientVersionName, + IReadOnlyList<AdminUserClientVersionDto> ClientVersions, + int ActiveSessions, + int PushDevices, + int ChatMemberships, + int MessagesSent, + int Reactions, + bool PasscodeLockEnabled, + bool ShowMessagePreview); + +public sealed record AdminUserClientVersionDto( + string? ClientPlatform, + int? ClientVersionCode, + string? ClientVersionName, + DateTimeOffset LastSeenAt, + int Sessions, + int PushDevices); + +public sealed record AdminChatDto( + Guid Id, + string Type, + string Title, + string CreatedBy, + DateTimeOffset CreatedAt, + DateTimeOffset? LastActivityAt, + int Members, + int Messages, + int Attachments, + int PinnedMessages, + int ProtectedMessages, + int InviteLinks, + int PendingJoinRequests, + int Topics, + string? PublicUsername, + bool TopicsEnabled, + bool HasProtectedContent, + int? DefaultMessageTtlSeconds); + +public sealed record AdminAttachmentDto( + Guid Id, + Guid ChatId, + Guid MessageId, + string ChatTitle, + string UploadedBy, + string FileName, + string ContentType, + long FileSizeBytes, + int SortOrder, + Guid? MediaAlbumId, + DateTimeOffset UploadedAt, + bool Exists, + bool IsProtected, + string DownloadPath); + +public sealed record AdminChatDetailsDto( + AdminChatDto Chat, + IReadOnlyList<AdminChatMemberDto> Members, + IReadOnlyList<AdminChatInviteLinkDto> InviteLinks, + IReadOnlyList<AdminChatJoinRequestDto> JoinRequests, + IReadOnlyList<AdminChatTopicDto> Topics, + IReadOnlyList<AdminMessagePreviewDto> RecentMessages, + IReadOnlyList<AdminModerationLogItemDto> ModerationLog); + +public sealed record AdminChatMemberDto( + Guid UserId, + string Username, + string DisplayName, + bool IsBot, + ChatMemberRole Role, + bool IsOwner, + bool CanPinMessages, + bool CanDeleteMessages, + bool CanInviteUsers, + bool CanPostMessages, + bool IsArchived, + bool IsPinned, + DateTimeOffset? MutedUntil, + string? FolderKey, + DateTimeOffset JoinedAt, + DateTimeOffset? LastReadAt); + +public sealed record AdminChatInviteLinkDto( + Guid Id, + string Token, + string Link, + string? Title, + bool CreatesJoinRequest, + bool IsRevoked, + DateTimeOffset CreatedAt, + DateTimeOffset? RevokedAt); + +public sealed record AdminChatJoinRequestDto( + Guid Id, + Guid InviteLinkId, + string Username, + string DisplayName, + ChatJoinRequestStatus Status, + DateTimeOffset RequestedAt, + DateTimeOffset? ResolvedAt, + string? ResolvedBy); + +public sealed record AdminChatTopicDto( + Guid Id, + string Title, + string Icon, + bool IsPinned, + bool IsClosed, + DateTimeOffset CreatedAt, + DateTimeOffset LastActivityAt, + int MessageCount); + +public sealed record AdminMessagePreviewDto( + Guid Id, + string Sender, + string Text, + DateTimeOffset SentAt, + DateTimeOffset? EditedAt, + DateTimeOffset? DeletedAt, + bool HasProtectedContent, + Guid? MediaAlbumId, + int Attachments, + int Reactions); + +public sealed record AdminModerationLogItemDto( + long Id, + Guid? ChatId, + string ActorDisplayName, + ModerationLogTargetType TargetType, + Guid? TargetId, + string Action, + string? Reason, + DateTimeOffset CreatedAt); + +public sealed record AdminChatSettingsRequest( + string? PublicUsername, + bool TopicsEnabled, + bool HasProtectedContent, + int? DefaultMessageTtlSeconds); + +public sealed record AdminChatMemberPermissionsRequest( + ChatMemberRole Role, + bool CanPinMessages, + bool CanDeleteMessages, + bool CanInviteUsers, + bool CanPostMessages); + +public sealed record AdminCreateInviteLinkRequest( + string? Title, + bool CreatesJoinRequest); + +public sealed record AdminResolveJoinRequestRequest(bool Approve); + +public sealed record AdminExpiredMessagesCleanupDto( + int DeletedMessages, + int DeletedAttachments); + +public sealed record AdminAndroidUpdateCompatibilityReportDto( + DateTimeOffset CurrentTimeUtc, + int TotalHitsLast24Hours, + int TotalHitsLast7Days, + int HitsWithoutVersionLast24Hours, + int HitsWithoutVersionLast7Days, + DateTimeOffset? LatestHitAt, + IReadOnlyList<AdminAndroidUpdateCompatibilityRouteDto> RoutesLast7Days, + IReadOnlyList<AdminAndroidUpdateCompatibilityVersionDto> VersionsLast7Days, + IReadOnlyList<AdminAndroidUpdateCompatibilityHitDto> RecentHits); + +public sealed record AdminAndroidUpdateCompatibilityRouteDto( + string Route, + int HitsLast24Hours, + int HitsLast7Days, + DateTimeOffset? LatestHitAt); + +public sealed record AdminAndroidUpdateCompatibilityVersionDto( + string ClientPlatform, + int? ClientVersionCode, + string? ClientVersionName, + int HitsLast24Hours, + int HitsLast7Days, + DateTimeOffset? LatestHitAt); + +public sealed record AdminAndroidUpdateCompatibilityHitDto( + DateTimeOffset HitAt, + string Route, + string RequestPath, + string? RequestedFileName, + string? ClientPlatform, + int? ClientVersionCode, + string? ClientVersionName, + string? RemoteIp, + string? UserAgent); diff --git a/src/Ikar.Server/Infrastructure/Admin/AdminOptions.cs b/src/Ikar.Server/Infrastructure/Admin/AdminOptions.cs new file mode 100644 index 00000000..a6a431e9 --- /dev/null +++ b/src/Ikar.Server/Infrastructure/Admin/AdminOptions.cs @@ -0,0 +1,14 @@ +namespace Ikar.Server.Infrastructure.Admin; + +public sealed class AdminOptions +{ + public const string SectionName = "Admin"; + + public string Username { get; set; } = string.Empty; + + public string Password { get; set; } = string.Empty; + + public bool IsConfigured => + !string.IsNullOrWhiteSpace(Username) && + !string.IsNullOrWhiteSpace(Password); +} diff --git a/src/Ikar.Server/Infrastructure/Admin/AdminService.cs b/src/Ikar.Server/Infrastructure/Admin/AdminService.cs new file mode 100644 index 00000000..032e9dcc --- /dev/null +++ b/src/Ikar.Server/Infrastructure/Admin/AdminService.cs @@ -0,0 +1,1090 @@ +using System.Security.Cryptography; +using Microsoft.AspNetCore.SignalR; +using Microsoft.EntityFrameworkCore; +using Ikar.Server.Data; +using Ikar.Server.Data.Entities; +using Ikar.Server.Infrastructure.Hubs; +using Ikar.Server.Infrastructure.Storage; +using Ikar.Shared; + +namespace Ikar.Server.Infrastructure.Admin; + +public sealed class AdminService( + IkarDbContext dbContext, + IWebHostEnvironment environment, + ServerRuntimeState runtimeState, + AttachmentStorageService attachmentStorageService, + IHubContext<MessengerHub> hubContext) +{ + public async Task<AdminStatusDto> GetStatusAsync(CancellationToken cancellationToken) + { + var now = DateTimeOffset.UtcNow; + var databaseReachable = await dbContext.Database.CanConnectAsync(cancellationToken); + var serverVersion = typeof(Program).Assembly.GetName().Version?.ToString() ?? "unknown"; + var attachmentBytes = await dbContext.MessageAttachments.SumAsync(x => (long?)x.FileSizeBytes, cancellationToken) ?? 0; + + return new AdminStatusDto( + environment.EnvironmentName, + serverVersion, + runtimeState.StartedAtUtc, + now, + databaseReachable, + dbContext.Database.GetConnectionString(), + await dbContext.Users.CountAsync(cancellationToken), + await dbContext.Users.CountAsync(x => x.IsBlocked, cancellationToken), + await dbContext.Users.CountAsync(x => x.IsBot, cancellationToken), + await dbContext.Bots.CountAsync(cancellationToken), + await dbContext.Bots.CountAsync(x => x.IsEnabled, cancellationToken), + await dbContext.Chats.CountAsync(cancellationToken), + await dbContext.Chats.CountAsync(x => x.Type == ChatType.Direct, cancellationToken), + await dbContext.Chats.CountAsync(x => x.Type == ChatType.Group, cancellationToken), + await dbContext.Chats.CountAsync(x => x.Type == ChatType.Channel, cancellationToken), + await dbContext.Chats.CountAsync(x => x.HasProtectedContent, cancellationToken), + await dbContext.Messages.CountAsync(cancellationToken), + await dbContext.Messages.CountAsync(x => x.HasProtectedContent, cancellationToken), + await dbContext.Messages.CountAsync(x => x.ExpiresAt != null && x.ExpiresAt > now && x.DeletedAt == null, cancellationToken), + await dbContext.Messages.CountAsync(x => x.PinnedAt != null && x.DeletedAt == null, cancellationToken), + await dbContext.MessageAttachments.CountAsync(cancellationToken), + attachmentBytes, + await dbContext.Stories.CountAsync(cancellationToken), + await dbContext.Stories.CountAsync(x => x.DeletedAt == null && x.ExpiresAt > now, cancellationToken), + await dbContext.Stories.CountAsync(x => x.HasProtectedContent && x.DeletedAt == null, cancellationToken), + await dbContext.UserSessions.CountAsync(cancellationToken), + await dbContext.PushDevices.CountAsync(cancellationToken), + await dbContext.ChatJoinRequests.CountAsync(x => x.Status == ChatJoinRequestStatus.Pending, cancellationToken), + await dbContext.ChatInviteLinks.CountAsync(x => !x.IsRevoked, cancellationToken), + await dbContext.ChatTopics.CountAsync(cancellationToken), + await dbContext.ModerationLogEntries.CountAsync(cancellationToken), + Environment.ProcessId); + } + + public async Task<AdminAndroidUpdateCompatibilityReportDto> GetAndroidUpdateCompatibilityReportAsync(CancellationToken cancellationToken) + { + var now = DateTimeOffset.UtcNow; + var since24Hours = now.AddHours(-24); + var since7Days = now.AddDays(-7); + + var allHits = await dbContext.AndroidUpdateCompatibilityHits + .AsNoTracking() + .ToListAsync(cancellationToken); + + var hitsLast7Days = allHits + .Where(x => x.HitAt >= since7Days) + .ToList(); + + var totalHitsLast24Hours = hitsLast7Days.Count(x => x.HitAt >= since24Hours); + var totalHitsLast7Days = hitsLast7Days.Count; + var hitsWithoutVersionLast24Hours = hitsLast7Days.Count(x => x.HitAt >= since24Hours && x.ClientVersionCode == null); + var hitsWithoutVersionLast7Days = hitsLast7Days.Count(x => x.ClientVersionCode == null); + var latestHitAt = hitsLast7Days + .Select(x => (DateTimeOffset?)x.HitAt) + .DefaultIfEmpty(null) + .Max(); + + var routeBuckets = hitsLast7Days + .GroupBy(x => x.Route) + .Select(group => new AdminAndroidUpdateCompatibilityRouteDto( + group.Key, + group.Count(x => x.HitAt >= since24Hours), + group.Count(), + group.Max(x => (DateTimeOffset?)x.HitAt))) + .OrderByDescending(x => x.HitsLast7Days) + .ThenByDescending(x => x.LatestHitAt) + .ToList(); + + var versionBuckets = hitsLast7Days + .GroupBy(x => new { x.ClientPlatform, x.ClientVersionCode, x.ClientVersionName }) + .Select(group => new AdminAndroidUpdateCompatibilityVersionDto( + group.Key.ClientPlatform ?? "unknown", + group.Key.ClientVersionCode, + group.Key.ClientVersionName, + group.Count(x => x.HitAt >= since24Hours), + group.Count(), + group.Max(x => (DateTimeOffset?)x.HitAt))) + .OrderByDescending(x => x.HitsLast7Days) + .ThenByDescending(x => x.LatestHitAt) + .ToList(); + + var recentHits = hitsLast7Days + .OrderByDescending(x => x.HitAt) + .Take(50) + .Select(x => new AdminAndroidUpdateCompatibilityHitDto( + x.HitAt, + x.Route, + x.RequestPath, + x.RequestedFileName, + x.ClientPlatform, + x.ClientVersionCode, + x.ClientVersionName, + x.RemoteIp, + x.UserAgent)) + .ToList(); + + return new AdminAndroidUpdateCompatibilityReportDto( + now, + totalHitsLast24Hours, + totalHitsLast7Days, + hitsWithoutVersionLast24Hours, + hitsWithoutVersionLast7Days, + latestHitAt, + routeBuckets, + versionBuckets, + recentHits); + } + + public async Task<IReadOnlyList<AdminUserDto>> GetUsersAsync(string? query, CancellationToken cancellationToken) + { + var usersQuery = dbContext.Users.AsNoTracking(); + if (!string.IsNullOrWhiteSpace(query)) + { + var normalized = query.Trim().ToUpperInvariant(); + var like = $"%{query.Trim()}%"; + usersQuery = usersQuery.Where(x => + x.NormalizedUsername.Contains(normalized) || + EF.Functions.Like(x.DisplayName, like) || + (x.PhoneNumber != null && EF.Functions.Like(x.PhoneNumber, like))); + } + + var users = await usersQuery + .OrderByDescending(x => x.CreatedAt) + .Take(250) + .Select(x => new + { + x.Id, + x.Username, + x.DisplayName, + x.IsBlocked, + x.IsBot, + x.CreatedAt, + x.BlockedAt, + LastSeenAt = x.Sessions + .OrderByDescending(session => session.LastSeenAt) + .Select(session => (DateTimeOffset?)session.LastSeenAt) + .FirstOrDefault(), + x.PhoneNumber, + x.About, + ActiveSessions = x.Sessions.Count, + PushDevices = x.PushDevices.Count, + ChatMemberships = x.ChatMemberships.Count, + MessagesSent = x.Messages.Count, + Reactions = x.MessageReactions.Count, + PasscodeLockEnabled = x.PrivacySettings != null && x.PrivacySettings.PasscodeLockEnabled, + ShowMessagePreview = x.PrivacySettings == null || x.PrivacySettings.ShowMessagePreview + }) + .ToListAsync(cancellationToken); + + var userIds = users.Select(x => x.Id).ToList(); + var sessionVersions = userIds.Count == 0 + ? new List<AdminUserClientVersionProjection>() + : await dbContext.UserSessions + .AsNoTracking() + .Where(x => userIds.Contains(x.UserId)) + .Select(x => new AdminUserClientVersionProjection( + x.UserId, + x.ClientPlatform, + x.ClientVersionCode, + x.ClientVersionName, + x.LastSeenAt, + false)) + .ToListAsync(cancellationToken); + + var pushDeviceVersions = userIds.Count == 0 + ? new List<AdminUserClientVersionProjection>() + : await dbContext.PushDevices + .AsNoTracking() + .Where(x => userIds.Contains(x.UserId)) + .Select(x => new AdminUserClientVersionProjection( + x.UserId, + x.ClientPlatform, + x.ClientVersionCode, + x.ClientVersionName, + x.UpdatedAt, + true)) + .ToListAsync(cancellationToken); + + var versionsByUser = sessionVersions + .Concat(pushDeviceVersions) + .GroupBy(x => x.UserId) + .ToDictionary(x => x.Key, x => x.ToList()); + + return users + .Select(user => + { + versionsByUser.TryGetValue(user.Id, out var versions); + versions ??= new List<AdminUserClientVersionProjection>(); + + var latestClientVersion = versions + .Where(HasClientVersion) + .OrderByDescending(x => x.LastSeenAt) + .FirstOrDefault(); + + return new AdminUserDto( + user.Id, + user.Username, + user.DisplayName, + user.IsBlocked, + user.IsBot, + user.CreatedAt, + user.BlockedAt, + user.LastSeenAt, + user.PhoneNumber, + user.About, + latestClientVersion?.ClientPlatform, + latestClientVersion?.ClientVersionCode, + latestClientVersion?.ClientVersionName, + BuildClientVersions(versions), + user.ActiveSessions, + user.PushDevices, + user.ChatMemberships, + user.MessagesSent, + user.Reactions, + user.PasscodeLockEnabled, + user.ShowMessagePreview); + }) + .ToList(); + } + + public async Task<IReadOnlyList<AdminChatDto>> GetChatsAsync(string? query, CancellationToken cancellationToken) + { + var chatsQuery = BuildChatsQuery(query); + var projections = await ProjectChats(chatsQuery.OrderByDescending(x => x.LastActivityAt ?? x.CreatedAt)) + .Take(250) + .ToListAsync(cancellationToken); + + var directTitles = await LoadDirectTitlesAsync(projections, cancellationToken); + return projections + .Select(x => ToAdminChatDto(x, directTitles)) + .ToList(); + } + + public async Task<AdminChatDetailsDto?> GetChatDetailsAsync(Guid chatId, CancellationToken cancellationToken) + { + var projection = await ProjectChats(dbContext.Chats.AsNoTracking().Where(x => x.Id == chatId)) + .SingleOrDefaultAsync(cancellationToken); + if (projection is null) + { + return null; + } + + var directTitles = await LoadDirectTitlesAsync([projection], cancellationToken); + var chatDto = ToAdminChatDto(projection, directTitles); + + var members = await dbContext.ChatMembers + .AsNoTracking() + .Where(x => x.ChatId == chatId) + .Include(x => x.User) + .OrderByDescending(x => x.IsOwner) + .ThenByDescending(x => x.Role) + .ThenBy(x => x.User.DisplayName) + .Select(x => new AdminChatMemberDto( + x.UserId, + x.User.Username, + x.User.DisplayName, + x.User.IsBot, + x.Role, + x.IsOwner, + x.CanPinMessages, + x.CanDeleteMessages, + x.CanInviteUsers, + x.CanPostMessages, + x.IsArchived, + x.IsPinned, + x.MutedUntil, + x.FolderKey, + x.JoinedAt, + x.LastReadAt)) + .ToListAsync(cancellationToken); + + var inviteLinks = await dbContext.ChatInviteLinks + .AsNoTracking() + .Where(x => x.ChatId == chatId) + .OrderByDescending(x => x.CreatedAt) + .Select(x => new AdminChatInviteLinkDto( + x.Id, + x.Token, + $"/join/{x.Token}", + x.Title, + x.CreatesJoinRequest, + x.IsRevoked, + x.CreatedAt, + x.RevokedAt)) + .ToListAsync(cancellationToken); + + var joinRequests = await dbContext.ChatJoinRequests + .AsNoTracking() + .Where(x => x.ChatId == chatId) + .Include(x => x.User) + .Include(x => x.ResolvedByUser) + .OrderByDescending(x => x.Status == ChatJoinRequestStatus.Pending) + .ThenByDescending(x => x.RequestedAt) + .Select(x => new AdminChatJoinRequestDto( + x.Id, + x.InviteLinkId, + x.User.Username, + x.User.DisplayName, + x.Status, + x.RequestedAt, + x.ResolvedAt, + x.ResolvedByUser == null ? null : x.ResolvedByUser.DisplayName)) + .ToListAsync(cancellationToken); + + var topics = await dbContext.ChatTopics + .AsNoTracking() + .Where(x => x.ChatId == chatId) + .OrderByDescending(x => x.IsPinned) + .ThenByDescending(x => x.LastActivityAt) + .Select(x => new AdminChatTopicDto( + x.Id, + x.Title, + x.Icon, + x.IsPinned, + x.IsClosed, + x.CreatedAt, + x.LastActivityAt, + dbContext.Messages.Count(message => message.TopicId == x.Id && message.DeletedAt == null))) + .ToListAsync(cancellationToken); + + var recentMessages = await dbContext.Messages + .AsNoTracking() + .Where(x => x.ChatId == chatId) + .Include(x => x.Sender) + .OrderByDescending(x => x.SentAt) + .Take(30) + .Select(x => new AdminMessagePreviewDto( + x.Id, + x.Sender.DisplayName, + x.DeletedAt == null ? x.Text : string.Empty, + x.SentAt, + x.EditedAt, + x.DeletedAt, + x.HasProtectedContent, + x.MediaAlbumId, + x.Attachments.Count, + x.Reactions.Count)) + .ToListAsync(cancellationToken); + + var moderationLog = await GetModerationLogItemsAsync(chatId, 80, cancellationToken); + + return new AdminChatDetailsDto( + chatDto, + members, + inviteLinks, + joinRequests, + topics, + recentMessages, + moderationLog); + } + + public async Task<AdminChatDetailsDto?> UpdateChatSettingsAsync(Guid chatId, AdminChatSettingsRequest request, CancellationToken cancellationToken) + { + var chat = await dbContext.Chats + .Include(x => x.Members) + .SingleOrDefaultAsync(x => x.Id == chatId, cancellationToken); + if (chat is null) + { + return null; + } + + var publicUsername = NormalizePublicUsername(request.PublicUsername); + if (publicUsername is not null) + { + var duplicate = await dbContext.Chats + .AnyAsync(x => x.Id != chatId && x.PublicUsername == publicUsername, cancellationToken); + if (duplicate) + { + throw new InvalidOperationException("Публичное имя уже занято другим чатом."); + } + } + + chat.PublicUsername = publicUsername; + chat.TopicsEnabled = request.TopicsEnabled; + chat.HasProtectedContent = request.HasProtectedContent; + chat.DefaultMessageTtlSeconds = NormalizeTtlSeconds(request.DefaultMessageTtlSeconds); + chat.LastActivityAt ??= DateTimeOffset.UtcNow; + + await dbContext.SaveChangesAsync(cancellationToken); + await NotifyChatsChangedAsync(chat.Members.Select(x => x.UserId), cancellationToken); + return await GetChatDetailsAsync(chatId, cancellationToken); + } + + public async Task<AdminChatDetailsDto?> UpdateMemberPermissionsAsync( + Guid chatId, + Guid memberUserId, + AdminChatMemberPermissionsRequest request, + CancellationToken cancellationToken) + { + var chat = await dbContext.Chats + .Include(x => x.Members) + .SingleOrDefaultAsync(x => x.Id == chatId, cancellationToken); + if (chat is null) + { + return null; + } + + var member = chat.Members.FirstOrDefault(x => x.UserId == memberUserId); + if (member is null) + { + return null; + } + + member.Role = request.Role; + member.IsOwner = request.Role == ChatMemberRole.Owner; + member.CanPinMessages = request.CanPinMessages || member.IsOwner; + member.CanDeleteMessages = request.CanDeleteMessages || member.IsOwner; + member.CanInviteUsers = request.CanInviteUsers || member.IsOwner; + member.CanPostMessages = request.CanPostMessages || member.IsOwner; + + await dbContext.SaveChangesAsync(cancellationToken); + await NotifyChatsChangedAsync(chat.Members.Select(x => x.UserId), cancellationToken); + return await GetChatDetailsAsync(chatId, cancellationToken); + } + + public async Task<AdminChatDetailsDto?> CreateInviteLinkAsync(Guid chatId, AdminCreateInviteLinkRequest request, CancellationToken cancellationToken) + { + var chat = await dbContext.Chats + .Include(x => x.Members) + .SingleOrDefaultAsync(x => x.Id == chatId, cancellationToken); + if (chat is null) + { + return null; + } + + if (chat.Type == ChatType.Direct) + { + throw new InvalidOperationException("Личные чаты не поддерживают ссылки-приглашения."); + } + + var link = new ChatInviteLink + { + ChatId = chatId, + CreatedById = chat.CreatedById, + Token = await GenerateInviteTokenAsync(cancellationToken), + Title = TrimToNull(request.Title, 64), + CreatesJoinRequest = request.CreatesJoinRequest, + CreatedAt = DateTimeOffset.UtcNow + }; + + dbContext.ChatInviteLinks.Add(link); + await dbContext.SaveChangesAsync(cancellationToken); + await NotifyChatsChangedAsync(chat.Members.Select(x => x.UserId), cancellationToken); + return await GetChatDetailsAsync(chatId, cancellationToken); + } + + public async Task<AdminChatDetailsDto?> RevokeInviteLinkAsync(Guid chatId, Guid inviteLinkId, CancellationToken cancellationToken) + { + var chat = await dbContext.Chats + .Include(x => x.Members) + .SingleOrDefaultAsync(x => x.Id == chatId, cancellationToken); + if (chat is null) + { + return null; + } + + var link = await dbContext.ChatInviteLinks + .SingleOrDefaultAsync(x => x.Id == inviteLinkId && x.ChatId == chatId, cancellationToken); + if (link is null) + { + return null; + } + + link.IsRevoked = true; + link.RevokedAt = DateTimeOffset.UtcNow; + + await dbContext.SaveChangesAsync(cancellationToken); + await NotifyChatsChangedAsync(chat.Members.Select(x => x.UserId), cancellationToken); + return await GetChatDetailsAsync(chatId, cancellationToken); + } + + public async Task<AdminChatDetailsDto?> ResolveJoinRequestAsync( + Guid chatId, + Guid joinRequestId, + bool approve, + CancellationToken cancellationToken) + { + var chat = await dbContext.Chats + .Include(x => x.Members) + .SingleOrDefaultAsync(x => x.Id == chatId, cancellationToken); + if (chat is null) + { + return null; + } + + var joinRequest = await dbContext.ChatJoinRequests + .Include(x => x.User) + .SingleOrDefaultAsync(x => x.Id == joinRequestId && x.ChatId == chatId, cancellationToken); + if (joinRequest is null) + { + return null; + } + + if (joinRequest.Status == ChatJoinRequestStatus.Pending) + { + joinRequest.Status = approve ? ChatJoinRequestStatus.Approved : ChatJoinRequestStatus.Declined; + joinRequest.ResolvedAt = DateTimeOffset.UtcNow; + joinRequest.ResolvedByUserId = null; + + if (approve && chat.Members.All(x => x.UserId != joinRequest.UserId)) + { + chat.Members.Add(new ChatMember + { + ChatId = chatId, + UserId = joinRequest.UserId, + Role = ChatMemberRole.Member, + JoinedAt = DateTimeOffset.UtcNow + }); + chat.LastActivityAt = DateTimeOffset.UtcNow; + } + + await dbContext.SaveChangesAsync(cancellationToken); + await NotifyChatsChangedAsync(chat.Members.Select(x => x.UserId).Append(joinRequest.UserId), cancellationToken); + } + + return await GetChatDetailsAsync(chatId, cancellationToken); + } + + public async Task<IReadOnlyList<AdminAttachmentDto>> GetAttachmentsAsync(string? query, CancellationToken cancellationToken) + { + var attachmentsQuery = dbContext.MessageAttachments + .AsNoTracking() + .Include(x => x.Message) + .ThenInclude(x => x.Chat) + .Include(x => x.Message) + .ThenInclude(x => x.Sender) + .AsQueryable(); + + if (!string.IsNullOrWhiteSpace(query)) + { + var like = $"%{query.Trim()}%"; + attachmentsQuery = attachmentsQuery.Where(x => + EF.Functions.Like(x.OriginalFileName, like) || + EF.Functions.Like(x.ContentType, like) || + EF.Functions.Like(x.Message.Sender.DisplayName, like) || + (x.Message.Chat.Title != null && EF.Functions.Like(x.Message.Chat.Title, like))); + } + + var attachments = await attachmentsQuery.ToListAsync(cancellationToken); + + return attachments + .OrderByDescending(x => x.UploadedAt) + .Take(250) + .Select(x => new AdminAttachmentDto( + x.Id, + x.Message.ChatId, + x.MessageId, + string.IsNullOrWhiteSpace(x.Message.Chat.Title) ? x.Message.Chat.Type.ToString() : x.Message.Chat.Title!, + x.Message.Sender.DisplayName, + x.OriginalFileName, + x.ContentType, + x.FileSizeBytes, + x.SortOrder, + x.Message.MediaAlbumId, + x.UploadedAt, + File.Exists(x.StoragePath), + x.Message.HasProtectedContent || x.Message.Chat.HasProtectedContent, + $"/admin/api/attachments/{x.Id}/content")) + .ToList(); + } + + public async Task<bool> DeleteAttachmentAsync(Guid attachmentId, CancellationToken cancellationToken) + { + var attachment = await dbContext.MessageAttachments + .Include(x => x.Message) + .ThenInclude(x => x.Chat) + .ThenInclude(x => x.Members) + .SingleOrDefaultAsync(x => x.Id == attachmentId, cancellationToken); + if (attachment is null) + { + return false; + } + + var affectedUserIds = attachment.Message.Chat.Members.Select(x => x.UserId).ToList(); + var path = attachment.StoragePath; + dbContext.MessageAttachments.Remove(attachment); + await dbContext.SaveChangesAsync(cancellationToken); + + if (!string.IsNullOrWhiteSpace(path)) + { + attachmentStorageService.DeleteIfExists(path); + } + + await NotifyChatsChangedAsync(affectedUserIds, cancellationToken); + return true; + } + + public async Task<IReadOnlyList<AdminModerationLogItemDto>> GetModerationLogAsync(Guid? chatId, int limit, CancellationToken cancellationToken) => + await GetModerationLogItemsAsync(chatId, Math.Clamp(limit, 1, 250), cancellationToken); + + public async Task<AdminExpiredMessagesCleanupDto> CleanupExpiredMessagesAsync(CancellationToken cancellationToken) + { + var now = DateTimeOffset.UtcNow; + var messages = await dbContext.Messages + .Include(x => x.Chat) + .ThenInclude(x => x.Members) + .Include(x => x.Attachments) + .Include(x => x.Reactions) + .Where(x => x.ExpiresAt != null && x.ExpiresAt <= now && x.DeletedAt == null) + .Take(500) + .ToListAsync(cancellationToken); + + var deletedAttachments = 0; + var affectedUserIds = messages + .SelectMany(x => x.Chat.Members.Select(member => member.UserId)) + .Distinct() + .ToList(); + + foreach (var message in messages) + { + DeleteFiles(message.Attachments.Select(x => x.StoragePath)); + deletedAttachments += message.Attachments.Count; + dbContext.MessageAttachments.RemoveRange(message.Attachments); + dbContext.MessageReactions.RemoveRange(message.Reactions); + message.Attachments.Clear(); + message.Reactions.Clear(); + message.Text = string.Empty; + message.EditedAt = null; + message.DeletedAt = now; + message.PinnedAt = null; + message.PinnedByUserId = null; + } + + await dbContext.SaveChangesAsync(cancellationToken); + await NotifyChatsChangedAsync(affectedUserIds, cancellationToken); + return new AdminExpiredMessagesCleanupDto(messages.Count, deletedAttachments); + } + + public async Task<bool> SetUserBlockedAsync(Guid userId, bool isBlocked, CancellationToken cancellationToken) + { + var user = await dbContext.Users + .Include(x => x.Sessions) + .SingleOrDefaultAsync(x => x.Id == userId, cancellationToken); + + if (user is null) + { + return false; + } + + user.IsBlocked = isBlocked; + user.BlockedAt = isBlocked ? DateTimeOffset.UtcNow : null; + + if (isBlocked && user.Sessions.Count > 0) + { + dbContext.UserSessions.RemoveRange(user.Sessions); + } + + await dbContext.SaveChangesAsync(cancellationToken); + return true; + } + + public async Task<bool> DeleteChatAsync(Guid chatId, CancellationToken cancellationToken) + { + var chat = await dbContext.Chats + .Include(x => x.Members) + .Include(x => x.Messages) + .ThenInclude(x => x.Attachments) + .SingleOrDefaultAsync(x => x.Id == chatId, cancellationToken); + + if (chat is null) + { + return false; + } + + var affectedUserIds = chat.Members.Select(x => x.UserId).Distinct().ToList(); + var attachmentPaths = chat.Messages + .SelectMany(x => x.Attachments) + .Select(x => x.StoragePath) + .Where(x => !string.IsNullOrWhiteSpace(x)) + .Distinct() + .ToList(); + + dbContext.Chats.Remove(chat); + await dbContext.SaveChangesAsync(cancellationToken); + + DeleteFiles(attachmentPaths); + await NotifyChatsChangedAsync(affectedUserIds, cancellationToken); + + return true; + } + + public async Task<bool> DeleteUserAsync(Guid userId, CancellationToken cancellationToken) + { + var user = await dbContext.Users + .Include(x => x.Sessions) + .Include(x => x.PushDevices) + .SingleOrDefaultAsync(x => x.Id == userId, cancellationToken); + + if (user is null) + { + return false; + } + + var chats = await dbContext.Chats + .Include(x => x.Members) + .Include(x => x.Messages) + .ThenInclude(x => x.Attachments) + .Where(x => x.CreatedById == userId || x.Members.Any(member => member.UserId == userId)) + .ToListAsync(cancellationToken); + + var affectedUserIds = new HashSet<Guid>(); + var attachmentPathsToDelete = new HashSet<string>(StringComparer.OrdinalIgnoreCase); + var chatsToDelete = new List<Chat>(); + + foreach (var chat in chats) + { + foreach (var memberId in chat.Members.Select(x => x.UserId)) + { + if (memberId != userId) + { + affectedUserIds.Add(memberId); + } + } + + if (chat.Type == ChatType.Direct && chat.Members.Any(x => x.UserId == userId)) + { + CollectAttachmentPaths(chat.Messages.SelectMany(x => x.Attachments), attachmentPathsToDelete); + chatsToDelete.Add(chat); + continue; + } + + var messagesToDelete = chat.Messages + .Where(x => x.SenderId == userId) + .ToList(); + + CollectAttachmentPaths(messagesToDelete.SelectMany(x => x.Attachments), attachmentPathsToDelete); + + if (messagesToDelete.Count > 0) + { + dbContext.Messages.RemoveRange(messagesToDelete); + } + + var membership = chat.Members.FirstOrDefault(x => x.UserId == userId); + if (membership is not null) + { + dbContext.ChatMembers.Remove(membership); + } + + var remainingMembers = chat.Members + .Where(x => x.UserId != userId) + .OrderByDescending(x => x.IsOwner) + .ThenBy(x => x.JoinedAt) + .ToList(); + + if (remainingMembers.Count == 0) + { + chatsToDelete.Add(chat); + continue; + } + + if (chat.CreatedById == userId) + { + var replacementOwner = remainingMembers.First(); + replacementOwner.IsOwner = true; + replacementOwner.Role = ChatMemberRole.Owner; + chat.CreatedById = replacementOwner.UserId; + } + + if (chat.Type == ChatType.Channel && remainingMembers.All(x => !x.IsOwner)) + { + remainingMembers[0].IsOwner = true; + remainingMembers[0].Role = ChatMemberRole.Owner; + } + + var latestMessageSentAt = chat.Messages + .Where(x => x.SenderId != userId) + .OrderByDescending(x => x.SentAt) + .Select(x => (DateTimeOffset?)x.SentAt) + .FirstOrDefault(); + chat.LastActivityAt = latestMessageSentAt ?? chat.CreatedAt; + } + + foreach (var chat in chatsToDelete.DistinctBy(x => x.Id)) + { + CollectAttachmentPaths(chat.Messages.SelectMany(x => x.Attachments), attachmentPathsToDelete); + dbContext.Chats.Remove(chat); + } + + if (user.Sessions.Count > 0) + { + dbContext.UserSessions.RemoveRange(user.Sessions); + } + + if (user.PushDevices.Count > 0) + { + dbContext.PushDevices.RemoveRange(user.PushDevices); + } + + dbContext.Users.Remove(user); + await dbContext.SaveChangesAsync(cancellationToken); + + DeleteFiles(attachmentPathsToDelete); + await NotifyChatsChangedAsync(affectedUserIds, cancellationToken); + + return true; + } + + private IQueryable<Chat> BuildChatsQuery(string? query) + { + var chatsQuery = dbContext.Chats.AsNoTracking(); + if (string.IsNullOrWhiteSpace(query)) + { + return chatsQuery; + } + + var like = $"%{query.Trim()}%"; + return chatsQuery.Where(x => + (x.Title != null && EF.Functions.Like(x.Title, like)) || + (x.PublicUsername != null && EF.Functions.Like(x.PublicUsername, like)) || + EF.Functions.Like(x.CreatedBy.DisplayName, like) || + x.Members.Any(member => + EF.Functions.Like(member.User.DisplayName, like) || + EF.Functions.Like(member.User.Username, like))); + } + + private IQueryable<AdminChatProjection> ProjectChats(IQueryable<Chat> chatsQuery) => + chatsQuery.Select(x => new AdminChatProjection( + x.Id, + x.Type, + x.Title, + x.PublicUsername, + x.TopicsEnabled, + x.HasProtectedContent, + x.DefaultMessageTtlSeconds, + x.CreatedBy.DisplayName, + x.CreatedAt, + x.LastActivityAt, + x.Members.Count, + x.Messages.Count, + x.Messages.SelectMany(m => m.Attachments).Count(), + x.Messages.Count(m => m.PinnedAt != null && m.DeletedAt == null), + x.Messages.Count(m => m.HasProtectedContent && m.DeletedAt == null), + x.InviteLinks.Count(m => !m.IsRevoked), + x.JoinRequests.Count(m => m.Status == ChatJoinRequestStatus.Pending), + x.Topics.Count)); + + private async Task<Dictionary<Guid, string>> LoadDirectTitlesAsync(IEnumerable<AdminChatProjection> chats, CancellationToken cancellationToken) + { + var directChatIds = chats + .Where(x => x.Type == ChatType.Direct) + .Select(x => x.Id) + .ToList(); + + if (directChatIds.Count == 0) + { + return []; + } + + var rows = await dbContext.ChatMembers + .AsNoTracking() + .Where(x => directChatIds.Contains(x.ChatId)) + .Select(x => new { x.ChatId, x.User.DisplayName, x.User.Username }) + .ToListAsync(cancellationToken); + + return rows + .GroupBy(x => x.ChatId) + .ToDictionary( + x => x.Key, + x => string.Join(" / ", x.Select(member => DisplayName(member.DisplayName, member.Username)))); + } + + private static AdminChatDto ToAdminChatDto(AdminChatProjection chat, IReadOnlyDictionary<Guid, string> directTitles) + { + var title = chat.Type == ChatType.Direct + ? directTitles.GetValueOrDefault(chat.Id, "Личный чат") + : string.IsNullOrWhiteSpace(chat.Title) ? "Без названия" : chat.Title!; + + return new AdminChatDto( + chat.Id, + chat.Type.ToString(), + title, + chat.CreatedBy, + chat.CreatedAt, + chat.LastActivityAt, + chat.Members, + chat.Messages, + chat.Attachments, + chat.PinnedMessages, + chat.ProtectedMessages, + chat.InviteLinks, + chat.PendingJoinRequests, + chat.Topics, + chat.PublicUsername, + chat.TopicsEnabled, + chat.HasProtectedContent, + chat.DefaultMessageTtlSeconds); + } + + private async Task<IReadOnlyList<AdminModerationLogItemDto>> GetModerationLogItemsAsync(Guid? chatId, int limit, CancellationToken cancellationToken) + { + var take = Math.Clamp(limit, 1, 250); + var query = dbContext.ModerationLogEntries + .AsNoTracking() + .Include(x => x.ActorUser) + .AsQueryable(); + + if (chatId is not null) + { + query = query.Where(x => x.ChatId == chatId.Value); + } + + return await query + .OrderByDescending(x => x.CreatedAt) + .Take(take) + .Select(x => new AdminModerationLogItemDto( + x.Id, + x.ChatId, + string.IsNullOrWhiteSpace(x.ActorUser.DisplayName) ? x.ActorUser.Username : x.ActorUser.DisplayName, + x.TargetType, + x.TargetId, + x.Action, + x.Reason, + x.CreatedAt)) + .ToListAsync(cancellationToken); + } + + private async Task<string> GenerateInviteTokenAsync(CancellationToken cancellationToken) + { + while (true) + { + var token = Convert.ToBase64String(RandomNumberGenerator.GetBytes(18)) + .TrimEnd('=') + .Replace('+', '-') + .Replace('/', '_'); + var exists = await dbContext.ChatInviteLinks + .AnyAsync(x => x.Token == token, cancellationToken); + if (!exists) + { + return token; + } + } + } + + private static string? NormalizePublicUsername(string? value) + { + var trimmed = value?.Trim().TrimStart('@'); + if (string.IsNullOrWhiteSpace(trimmed)) + { + return null; + } + + var normalized = new string(trimmed + .Where(ch => ch is >= 'a' and <= 'z' || ch is >= 'A' and <= 'Z' || char.IsDigit(ch) || ch == '_') + .Take(32) + .ToArray()) + .ToLowerInvariant(); + + if (normalized.Length < 5) + { + throw new InvalidOperationException("Публичное имя должно содержать минимум 5 символов."); + } + + return normalized; + } + + private static int? NormalizeTtlSeconds(int? ttlSeconds) + { + if (ttlSeconds is null || ttlSeconds <= 0) + { + return null; + } + + return Math.Clamp(ttlSeconds.Value, 5, 31 * 24 * 60 * 60); + } + + private static string? TrimToNull(string? value, int maxLength) + { + var trimmed = value?.Trim(); + if (string.IsNullOrWhiteSpace(trimmed)) + { + return null; + } + + return trimmed.Length <= maxLength ? trimmed : trimmed[..maxLength]; + } + + private static string DisplayName(string? displayName, string username) => + string.IsNullOrWhiteSpace(displayName) ? $"@{username}" : displayName!; + + private static IReadOnlyList<AdminUserClientVersionDto> BuildClientVersions( + IEnumerable<AdminUserClientVersionProjection> versions) + { + return versions + .Where(HasClientVersion) + .GroupBy(x => new + { + x.ClientPlatform, + x.ClientVersionCode, + x.ClientVersionName + }) + .Select(x => new AdminUserClientVersionDto( + x.Key.ClientPlatform, + x.Key.ClientVersionCode, + x.Key.ClientVersionName, + x.Max(version => version.LastSeenAt), + x.Count(version => !version.IsPushDevice), + x.Count(version => version.IsPushDevice))) + .OrderByDescending(x => x.LastSeenAt) + .ToList(); + } + + private static bool HasClientVersion(AdminUserClientVersionProjection version) => + !string.IsNullOrWhiteSpace(version.ClientPlatform) || + version.ClientVersionCode is not null || + !string.IsNullOrWhiteSpace(version.ClientVersionName); + + private static void CollectAttachmentPaths(IEnumerable<MessageAttachment> attachments, ISet<string> target) + { + foreach (var path in attachments + .Select(x => x.StoragePath) + .Where(x => !string.IsNullOrWhiteSpace(x))) + { + target.Add(path); + } + } + + private void DeleteFiles(IEnumerable<string> attachmentPaths) + { + foreach (var path in attachmentPaths) + { + attachmentStorageService.DeleteIfExists(path); + } + } + + private Task NotifyChatsChangedAsync(IEnumerable<Guid> userIds, CancellationToken cancellationToken) + { + var affectedUsers = userIds + .Distinct() + .Select(x => x.ToString()) + .ToList(); + + return affectedUsers.Count == 0 + ? Task.CompletedTask + : hubContext.Clients.Users(affectedUsers).SendAsync("ChatsChanged", cancellationToken); + } + + private sealed record AdminChatProjection( + Guid Id, + ChatType Type, + string? Title, + string? PublicUsername, + bool TopicsEnabled, + bool HasProtectedContent, + int? DefaultMessageTtlSeconds, + string CreatedBy, + DateTimeOffset CreatedAt, + DateTimeOffset? LastActivityAt, + int Members, + int Messages, + int Attachments, + int PinnedMessages, + int ProtectedMessages, + int InviteLinks, + int PendingJoinRequests, + int Topics); + + private sealed record AdminUserClientVersionProjection( + Guid UserId, + string? ClientPlatform, + int? ClientVersionCode, + string? ClientVersionName, + DateTimeOffset LastSeenAt, + bool IsPushDevice); +} diff --git a/src/Ikar.Server/Infrastructure/Admin/ServerRuntimeState.cs b/src/Ikar.Server/Infrastructure/Admin/ServerRuntimeState.cs new file mode 100644 index 00000000..2e8ad1f6 --- /dev/null +++ b/src/Ikar.Server/Infrastructure/Admin/ServerRuntimeState.cs @@ -0,0 +1,3 @@ +namespace Ikar.Server.Infrastructure.Admin; + +public sealed record ServerRuntimeState(DateTimeOffset StartedAtUtc); diff --git a/src/Ikar.Server/Infrastructure/ApiRateLimitMiddleware.cs b/src/Ikar.Server/Infrastructure/ApiRateLimitMiddleware.cs new file mode 100644 index 00000000..a8ca8efe --- /dev/null +++ b/src/Ikar.Server/Infrastructure/ApiRateLimitMiddleware.cs @@ -0,0 +1,103 @@ +using System.Collections.Concurrent; +using System.Security.Claims; + +namespace Ikar.Server.Infrastructure; + +public sealed class ApiRateLimitMiddleware(RequestDelegate next, ILogger<ApiRateLimitMiddleware> logger) +{ + private static readonly TimeSpan Window = TimeSpan.FromMinutes(1); + private static readonly ConcurrentDictionary<string, RateLimitBucket> Buckets = new(); + private static long _lastCleanupTicks; + + public async Task InvokeAsync(HttpContext context) + { + if (!ShouldRateLimit(context.Request)) + { + await next(context); + return; + } + + var now = DateTimeOffset.UtcNow; + var key = BuildKey(context); + var limit = context.User.Identity?.IsAuthenticated == true ? 1800 : 240; + var bucket = Buckets.GetOrAdd(key, _ => new RateLimitBucket(now, 0)); + int count; + DateTimeOffset resetAt; + + lock (bucket) + { + if (now - bucket.WindowStartedAt >= Window) + { + bucket.WindowStartedAt = now; + bucket.Count = 0; + } + + bucket.Count++; + count = bucket.Count; + resetAt = bucket.WindowStartedAt.Add(Window); + } + + MaybeCleanup(now); + + if (count <= limit) + { + context.Response.Headers["X-RateLimit-Limit"] = limit.ToString(); + context.Response.Headers["X-RateLimit-Remaining"] = Math.Max(0, limit - count).ToString(); + context.Response.Headers["X-RateLimit-Reset"] = resetAt.ToUnixTimeSeconds().ToString(); + await next(context); + return; + } + + logger.LogWarning("Rate limit exceeded for {RateLimitKey} on {Path}.", key, context.Request.Path); + context.Response.StatusCode = StatusCodes.Status429TooManyRequests; + context.Response.Headers["Retry-After"] = Math.Max(1, (int)(resetAt - now).TotalSeconds).ToString(); + await context.Response.WriteAsJsonAsync(new { error = "Too many requests. Try again later." }, context.RequestAborted); + } + + private static bool ShouldRateLimit(HttpRequest request) => + request.Path.StartsWithSegments("/api", StringComparison.OrdinalIgnoreCase) || + request.Path.StartsWithSegments("/hubs/messenger", StringComparison.OrdinalIgnoreCase); + + private static string BuildKey(HttpContext context) + { + var userId = context.User.FindFirstValue(ClaimTypes.NameIdentifier); + if (!string.IsNullOrWhiteSpace(userId)) + { + return $"user:{userId}"; + } + + var forwardedFor = context.Request.Headers["X-Forwarded-For"].ToString(); + var ip = forwardedFor.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries).FirstOrDefault() + ?? context.Connection.RemoteIpAddress?.ToString() + ?? "unknown"; + return $"ip:{ip}"; + } + + private static void MaybeCleanup(DateTimeOffset now) + { + var lastCleanup = new DateTimeOffset(Interlocked.Read(ref _lastCleanupTicks), TimeSpan.Zero); + if (now - lastCleanup < Window) + { + return; + } + + if (Interlocked.Exchange(ref _lastCleanupTicks, now.UtcTicks) == now.UtcTicks) + { + return; + } + + foreach (var (key, bucket) in Buckets) + { + if (now - bucket.WindowStartedAt > Window.Add(Window)) + { + Buckets.TryRemove(key, out _); + } + } + } + + private sealed class RateLimitBucket(DateTimeOffset windowStartedAt, int count) + { + public DateTimeOffset WindowStartedAt { get; set; } = windowStartedAt; + public int Count { get; set; } = count; + } +} diff --git a/src/Ikar.Server/Infrastructure/Auth/BotTokenService.cs b/src/Ikar.Server/Infrastructure/Auth/BotTokenService.cs new file mode 100644 index 00000000..1d9ae144 --- /dev/null +++ b/src/Ikar.Server/Infrastructure/Auth/BotTokenService.cs @@ -0,0 +1,23 @@ +using System.Security.Cryptography; +using System.Text; + +namespace Ikar.Server.Infrastructure.Auth; + +public sealed class BotTokenService +{ + public string GenerateToken(Guid botId) + { + var secret = Convert.ToBase64String(RandomNumberGenerator.GetBytes(32)) + .TrimEnd('=') + .Replace('+', '-') + .Replace('/', '_'); + + return $"ikarbot_{botId:N}_{secret}"; + } + + public string HashToken(string token) + { + var hashBytes = SHA256.HashData(Encoding.UTF8.GetBytes(token)); + return Convert.ToHexString(hashBytes); + } +} diff --git a/src/Ikar.Server/Infrastructure/Auth/ClientVersionRequestReader.cs b/src/Ikar.Server/Infrastructure/Auth/ClientVersionRequestReader.cs new file mode 100644 index 00000000..1d8111d7 --- /dev/null +++ b/src/Ikar.Server/Infrastructure/Auth/ClientVersionRequestReader.cs @@ -0,0 +1,133 @@ +using Microsoft.AspNetCore.Http; +using Ikar.Server.Data.Entities; +using Ikar.Shared; + +namespace Ikar.Server.Infrastructure.Auth; + +public sealed record ClientVersionSnapshot( + string? ClientPlatform, + int? ClientVersionCode, + string? ClientVersionName); + +public static class ClientVersionRequestReader +{ + private const int MaxClientPlatformLength = 32; + private const int MaxClientVersionNameLength = 64; + + public static ClientVersionSnapshot Read(HttpRequest request) + { + var clientPlatform = TrimToNull( + ReadString(request, ClientVersionMetadata.PlatformHeaderName, ClientVersionMetadata.PlatformQueryName), + MaxClientPlatformLength); + + var clientVersionName = TrimToNull( + ReadString(request, ClientVersionMetadata.VersionNameHeaderName, ClientVersionMetadata.VersionNameQueryName), + MaxClientVersionNameLength); + + var clientVersionCode = TryGetClientVersionCode(request, out var parsedVersionCode) + ? parsedVersionCode + : (int?)null; + + return new ClientVersionSnapshot(clientPlatform, clientVersionCode, clientVersionName); + } + + public static bool Apply(UserSession session, ClientVersionSnapshot snapshot) + { + return Apply( + snapshot, + session.ClientPlatform, + session.ClientVersionCode, + session.ClientVersionName, + platform => session.ClientPlatform = platform, + versionCode => session.ClientVersionCode = versionCode, + versionName => session.ClientVersionName = versionName); + } + + public static bool Apply(PushDevice device, ClientVersionSnapshot snapshot) + { + return Apply( + snapshot, + device.ClientPlatform, + device.ClientVersionCode, + device.ClientVersionName, + platform => device.ClientPlatform = platform, + versionCode => device.ClientVersionCode = versionCode, + versionName => device.ClientVersionName = versionName); + } + + private static bool Apply( + ClientVersionSnapshot snapshot, + string? currentPlatform, + int? currentVersionCode, + string? currentVersionName, + Action<string?> setPlatform, + Action<int?> setVersionCode, + Action<string?> setVersionName) + { + var changed = false; + + if (snapshot.ClientPlatform is not null && + !string.Equals(currentPlatform, snapshot.ClientPlatform, StringComparison.Ordinal)) + { + setPlatform(snapshot.ClientPlatform); + changed = true; + } + + if (snapshot.ClientVersionCode is not null && currentVersionCode != snapshot.ClientVersionCode) + { + setVersionCode(snapshot.ClientVersionCode); + changed = true; + } + + if (snapshot.ClientVersionName is not null && + !string.Equals(currentVersionName, snapshot.ClientVersionName, StringComparison.Ordinal)) + { + setVersionName(snapshot.ClientVersionName); + changed = true; + } + + return changed; + } + + public static bool TryGetClientPlatform(HttpRequest request, out string? clientPlatform) + { + clientPlatform = TrimToNull( + ReadString(request, ClientVersionMetadata.PlatformHeaderName, ClientVersionMetadata.PlatformQueryName), + MaxClientPlatformLength); + return clientPlatform is not null; + } + + public static bool TryGetClientVersionCode(HttpRequest request, out int clientVersionCode) + { + clientVersionCode = 0; + var rawVersionCode = ReadString( + request, + ClientVersionMetadata.VersionCodeHeaderName, + ClientVersionMetadata.VersionCodeQueryName); + + return int.TryParse(rawVersionCode, out clientVersionCode) && clientVersionCode > 0; + } + + private static string? ReadString(HttpRequest request, string headerName, string queryName) + { + var value = request.Headers[headerName].ToString(); + if (!string.IsNullOrWhiteSpace(value)) + { + return value; + } + + value = request.Query[queryName].ToString(); + return string.IsNullOrWhiteSpace(value) ? null : value; + } + + private static string? TrimToNull(string? value, int maxLength) + { + if (string.IsNullOrWhiteSpace(value)) + { + return null; + } + + var trimmed = value.Trim(); + return trimmed.Length <= maxLength ? trimmed : trimmed[..maxLength]; + } +} diff --git a/src/Ikar.Server/Infrastructure/Auth/JwtOptions.cs b/src/Ikar.Server/Infrastructure/Auth/JwtOptions.cs new file mode 100644 index 00000000..9f3e230a --- /dev/null +++ b/src/Ikar.Server/Infrastructure/Auth/JwtOptions.cs @@ -0,0 +1,16 @@ +namespace Ikar.Server.Infrastructure.Auth; + +public sealed class JwtOptions +{ + public const string SectionName = "Jwt"; + + public string Issuer { get; init; } = "Ikar.Server"; + + public string Audience { get; init; } = "Ikar.Client"; + + public string SigningKey { get; init; } = "Ikar-Replace-This-Development-Key-With-A-Long-Random-Secret-CHANGE_ME_USE_SECRET_STORE_VALUE_32_CHARS_MINIMUM"; + + public int AccessTokenLifetimeMinutes { get; init; } = 15; + + public int RefreshTokenLifetimeDays { get; init; } = 30; +} diff --git a/src/Ikar.Server/Infrastructure/Auth/PhoneAuthChallengeStore.cs b/src/Ikar.Server/Infrastructure/Auth/PhoneAuthChallengeStore.cs new file mode 100644 index 00000000..7026c6ef --- /dev/null +++ b/src/Ikar.Server/Infrastructure/Auth/PhoneAuthChallengeStore.cs @@ -0,0 +1,64 @@ +using System.Collections.Concurrent; +using System.Security.Cryptography; + +namespace Ikar.Server.Infrastructure.Auth; + +public sealed class PhoneAuthChallengeStore +{ + private static readonly TimeSpan ChallengeLifetime = TimeSpan.FromMinutes(10); + private readonly ConcurrentDictionary<string, PhoneAuthChallenge> _challenges = new(StringComparer.Ordinal); + + public PhoneAuthChallenge Create(string normalizedPhoneNumber, bool isRegistered) + { + CleanupExpired(); + + var challenge = new PhoneAuthChallenge( + Guid.NewGuid().ToString("N"), + normalizedPhoneNumber, + RandomNumberGenerator.GetInt32(0, 1_000_000).ToString("D6"), + DateTimeOffset.UtcNow.Add(ChallengeLifetime), + isRegistered); + + _challenges[challenge.Id] = challenge; + return challenge; + } + + public PhoneAuthChallenge? Consume(string challengeId, string normalizedPhoneNumber, string code) + { + CleanupExpired(); + + if (!_challenges.TryGetValue(challengeId, out var challenge)) + { + return null; + } + + if (!string.Equals(challenge.NormalizedPhoneNumber, normalizedPhoneNumber, StringComparison.Ordinal) || + !string.Equals(challenge.Code, code, StringComparison.Ordinal) || + challenge.ExpiresAt <= DateTimeOffset.UtcNow) + { + return null; + } + + _challenges.TryRemove(challenge.Id, out _); + return challenge; + } + + private void CleanupExpired() + { + var now = DateTimeOffset.UtcNow; + foreach (var pair in _challenges) + { + if (pair.Value.ExpiresAt <= now) + { + _challenges.TryRemove(pair.Key, out _); + } + } + } + + public sealed record PhoneAuthChallenge( + string Id, + string NormalizedPhoneNumber, + string Code, + DateTimeOffset ExpiresAt, + bool IsRegistered); +} diff --git a/src/Ikar.Server/Infrastructure/Auth/TokenService.cs b/src/Ikar.Server/Infrastructure/Auth/TokenService.cs new file mode 100644 index 00000000..dc641245 --- /dev/null +++ b/src/Ikar.Server/Infrastructure/Auth/TokenService.cs @@ -0,0 +1,163 @@ +using System.IdentityModel.Tokens.Jwt; +using System.Security.Claims; +using System.Security.Cryptography; +using System.Text; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Options; +using Microsoft.IdentityModel.Tokens; +using Ikar.Server.Data; +using Ikar.Server.Data.Entities; +using Ikar.Shared; + +namespace Ikar.Server.Infrastructure.Auth; + +public sealed class TokenService( + IkarDbContext dbContext, + IOptions<JwtOptions> jwtOptions) +{ + private readonly JwtOptions _jwtOptions = jwtOptions.Value; + + public Task<AuthSessionDto> CreateSessionAsync(User user, CancellationToken cancellationToken = default) => + CreateSessionAsync(user, null, cancellationToken); + + public async Task<AuthSessionDto> CreateSessionAsync( + User user, + ClientVersionSnapshot? clientVersion, + CancellationToken cancellationToken = default) + { + var now = DateTimeOffset.UtcNow; + var session = new UserSession + { + UserId = user.Id, + LastSeenAt = now + }; + if (clientVersion is not null) + { + ClientVersionRequestReader.Apply(session, clientVersion); + } + + var refreshToken = CreateOpaqueToken(); + session.TokenHash = HashToken(refreshToken); + dbContext.UserSessions.Add(session); + + await dbContext.SaveChangesAsync(cancellationToken); + return CreateAuthSession(user, session.Id, refreshToken, now); + } + + public Task<AuthSessionDto?> RefreshSessionAsync(string rawRefreshToken, CancellationToken cancellationToken = default) => + RefreshSessionAsync(rawRefreshToken, null, cancellationToken); + + public async Task<AuthSessionDto?> RefreshSessionAsync( + string rawRefreshToken, + ClientVersionSnapshot? clientVersion, + CancellationToken cancellationToken = default) + { + var hash = HashToken(rawRefreshToken); + var session = await dbContext.UserSessions.SingleOrDefaultAsync(x => x.TokenHash == hash, cancellationToken); + if (session is null) + { + return null; + } + + if (session.CreatedAt.AddDays(_jwtOptions.RefreshTokenLifetimeDays) <= DateTimeOffset.UtcNow) + { + dbContext.UserSessions.Remove(session); + await dbContext.SaveChangesAsync(cancellationToken); + return null; + } + + var user = await dbContext.Users.SingleAsync(x => x.Id == session.UserId, cancellationToken); + if (user.IsBlocked) + { + dbContext.UserSessions.Remove(session); + await dbContext.SaveChangesAsync(cancellationToken); + return null; + } + + var now = DateTimeOffset.UtcNow; + var refreshToken = CreateOpaqueToken(); + session.TokenHash = HashToken(refreshToken); + session.CreatedAt = now; + session.LastSeenAt = now; + if (clientVersion is not null) + { + ClientVersionRequestReader.Apply(session, clientVersion); + } + + await dbContext.SaveChangesAsync(cancellationToken); + + return CreateAuthSession(user, session.Id, refreshToken, now); + } + + public async Task<bool> RevokeSessionAsync(Guid sessionId, CancellationToken cancellationToken = default) + { + var session = await dbContext.UserSessions.SingleOrDefaultAsync(x => x.Id == sessionId, cancellationToken); + if (session is null) + { + return false; + } + + dbContext.UserSessions.Remove(session); + await dbContext.SaveChangesAsync(cancellationToken); + return true; + } + + public static string HashToken(string token) + { + var hashBytes = SHA256.HashData(Encoding.UTF8.GetBytes(token)); + return Convert.ToHexString(hashBytes); + } + + private AuthSessionDto CreateAuthSession(User user, Guid sessionId, string refreshToken, DateTimeOffset now) + { + var accessTokenExpiresAt = now.AddMinutes(_jwtOptions.AccessTokenLifetimeMinutes); + var credentials = new SigningCredentials( + new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_jwtOptions.SigningKey)), + SecurityAlgorithms.HmacSha256); + + var claims = new List<Claim> + { + new(ClaimTypes.NameIdentifier, user.Id.ToString()), + new(ClaimTypes.Name, user.DisplayName), + new("username", user.Username), + new("sid", sessionId.ToString()), + new(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString("N")) + }; + + var jwt = new JwtSecurityToken( + issuer: _jwtOptions.Issuer, + audience: _jwtOptions.Audience, + claims: claims, + notBefore: now.UtcDateTime, + expires: accessTokenExpiresAt.UtcDateTime, + signingCredentials: credentials); + + var accessToken = new JwtSecurityTokenHandler().WriteToken(jwt); + + return new AuthSessionDto( + accessToken, + refreshToken, + accessTokenExpiresAt, + new( + user.Id, + user.Username, + user.DisplayName, + false, + user.PhoneNumber, + now, + user.About, + string.IsNullOrWhiteSpace(user.AvatarStoragePath) + ? null + : $"/api/users/{user.Id}/avatar/{Uri.EscapeDataString(Path.GetFileName(user.AvatarStoragePath))}", + user.IsBot)); + } + + private static string CreateOpaqueToken() + { + var tokenBytes = RandomNumberGenerator.GetBytes(32); + return Convert.ToBase64String(tokenBytes) + .TrimEnd('=') + .Replace('+', '-') + .Replace('/', '_'); + } +} diff --git a/src/Ikar.Server/Infrastructure/Bots/BotUpdateService.cs b/src/Ikar.Server/Infrastructure/Bots/BotUpdateService.cs new file mode 100644 index 00000000..1ebee96b --- /dev/null +++ b/src/Ikar.Server/Infrastructure/Bots/BotUpdateService.cs @@ -0,0 +1,94 @@ +using Ikar.Server.Data; +using Ikar.Server.Data.Entities; +using Microsoft.EntityFrameworkCore; + +namespace Ikar.Server.Infrastructure.Bots; + +public sealed class BotUpdateService(IkarDbContext dbContext) +{ + public async Task EnqueueIncomingMessageAsync(Guid messageId, CancellationToken cancellationToken = default) + { + var message = await dbContext.Messages + .Include(x => x.Sender) + .Include(x => x.Chat) + .ThenInclude(x => x.Members) + .ThenInclude(x => x.User) + .ThenInclude(x => x.BotProfile) + .SingleOrDefaultAsync(x => x.Id == messageId, cancellationToken); + + if (message is null || + message.Sender.IsBot || + message.Chat.Type != Ikar.Shared.ChatType.Direct || + message.Chat.Members.Count != 2) + { + return; + } + + var botMember = message.Chat.Members + .FirstOrDefault(member => member.User.IsBot && member.User.BotProfile is not null); + if (botMember?.User.BotProfile is null || !botMember.User.BotProfile.IsEnabled) + { + return; + } + + var updateExists = await dbContext.BotUpdates + .AsNoTracking() + .AnyAsync( + x => x.BotId == botMember.User.BotProfile.Id && + x.MessageId == message.Id, + cancellationToken); + if (updateExists) + { + return; + } + + dbContext.BotUpdates.Add(new BotUpdate + { + BotId = botMember.User.BotProfile.Id, + ChatId = message.ChatId, + MessageId = message.Id, + CreatedAt = message.SentAt + }); + + await dbContext.SaveChangesAsync(cancellationToken); + } + + public async Task MarkMessagesReadByBotAsync( + Guid botUserId, + IReadOnlyCollection<Message> messages, + CancellationToken cancellationToken = default) + { + var maxByChat = messages + .GroupBy(message => message.ChatId) + .Select(group => new + { + ChatId = group.Key, + MaxSentAt = group.Max(message => message.SentAt) + }) + .ToList(); + + foreach (var item in maxByChat) + { + var membership = await dbContext.ChatMembers + .SingleOrDefaultAsync( + x => x.ChatId == item.ChatId && x.UserId == botUserId, + cancellationToken); + if (membership is null) + { + continue; + } + + if (membership.LastDeliveredAt is null || membership.LastDeliveredAt < item.MaxSentAt) + { + membership.LastDeliveredAt = item.MaxSentAt; + } + + if (membership.LastReadAt is null || membership.LastReadAt < item.MaxSentAt) + { + membership.LastReadAt = item.MaxSentAt; + } + } + + await dbContext.SaveChangesAsync(cancellationToken); + } +} diff --git a/src/Ikar.Server/Infrastructure/Calls/CallSessionStore.cs b/src/Ikar.Server/Infrastructure/Calls/CallSessionStore.cs new file mode 100644 index 00000000..78c6e6a7 --- /dev/null +++ b/src/Ikar.Server/Infrastructure/Calls/CallSessionStore.cs @@ -0,0 +1,213 @@ +using Ikar.Shared; + +namespace Ikar.Server.Infrastructure.Calls; + +public sealed class CallSessionStore +{ + private readonly object _sync = new(); + private readonly Dictionary<Guid, StoredCallSession> _sessions = []; + private readonly Dictionary<Guid, Guid> _participantCalls = []; + + public bool TryCreate(Guid chatId, Guid callerId, Guid calleeId, CallMediaType mediaType, out ActiveCallSession? session, out string error) + { + lock (_sync) + { + if (_participantCalls.ContainsKey(callerId)) + { + error = "У вас уже есть активный звонок."; + session = default; + return false; + } + + if (_participantCalls.ContainsKey(calleeId)) + { + error = "Собеседник уже занят другим звонком."; + session = default; + return false; + } + + var stored = new StoredCallSession(chatId, callerId, calleeId, mediaType); + _sessions[stored.CallId] = stored; + _participantCalls[callerId] = stored.CallId; + _participantCalls[calleeId] = stored.CallId; + session = stored.ToSnapshot(); + error = string.Empty; + return true; + } + } + + public bool TryAccept(Guid callId, Guid userId, out ActiveCallSession? session, out string error) + { + lock (_sync) + { + if (!_sessions.TryGetValue(callId, out var stored)) + { + error = "Звонок уже завершён."; + session = default; + return false; + } + + if (stored.State != CallSessionState.Ringing) + { + error = "Звонок уже недоступен."; + session = default; + return false; + } + + if (stored.CalleeId != userId) + { + error = "Принять звонок может только вызываемый пользователь."; + session = default; + return false; + } + + stored.State = CallSessionState.Connected; + stored.ConnectedAt = DateTimeOffset.UtcNow; + session = stored.ToSnapshot(); + error = string.Empty; + return true; + } + } + + public bool TryDecline(Guid callId, Guid userId, out ActiveCallSession? session, out string error) => + TryTerminate(callId, userId, "declined", requireParticipant: true, out session, out error); + + public bool TryEnd(Guid callId, Guid userId, string reason, out ActiveCallSession? session, out string error) => + TryTerminate(callId, userId, reason, requireParticipant: true, out session, out error); + + public bool TryEndByParticipant(Guid userId, string reason, out ActiveCallSession? session) + { + lock (_sync) + { + if (!_participantCalls.TryGetValue(userId, out var callId) || + !_sessions.TryGetValue(callId, out var stored)) + { + session = default; + return false; + } + + RemoveSession(stored, reason); + session = stored.ToSnapshot(); + return true; + } + } + + public bool TryResolveRecipient(Guid callId, Guid senderUserId, out Guid recipientUserId, out ActiveCallSession? session, out string error) + { + lock (_sync) + { + if (!_sessions.TryGetValue(callId, out var stored)) + { + recipientUserId = Guid.Empty; + session = default; + error = "Звонок уже завершён."; + return false; + } + + if (stored.State != CallSessionState.Connected) + { + recipientUserId = Guid.Empty; + session = default; + error = "Соединение ещё не установлено."; + return false; + } + + if (stored.CallerId == senderUserId) + { + recipientUserId = stored.CalleeId; + session = stored.ToSnapshot(); + error = string.Empty; + return true; + } + + if (stored.CalleeId == senderUserId) + { + recipientUserId = stored.CallerId; + session = stored.ToSnapshot(); + error = string.Empty; + return true; + } + + recipientUserId = Guid.Empty; + session = default; + error = "Нет доступа к этому звонку."; + return false; + } + } + + private bool TryTerminate(Guid callId, Guid userId, string reason, bool requireParticipant, out ActiveCallSession? session, out string error) + { + lock (_sync) + { + if (!_sessions.TryGetValue(callId, out var stored)) + { + error = "Звонок уже завершён."; + session = default; + return false; + } + + if (requireParticipant && stored.CallerId != userId && stored.CalleeId != userId) + { + error = "Нет доступа к этому звонку."; + session = default; + return false; + } + + RemoveSession(stored, reason); + session = stored.ToSnapshot(); + error = string.Empty; + return true; + } + } + + private void RemoveSession(StoredCallSession stored, string reason) + { + stored.State = CallSessionState.Ended; + stored.EndReason = reason; + _sessions.Remove(stored.CallId); + _participantCalls.Remove(stored.CallerId); + _participantCalls.Remove(stored.CalleeId); + } + + private sealed class StoredCallSession(Guid chatId, Guid callerId, Guid calleeId, CallMediaType mediaType) + { + public Guid CallId { get; } = Guid.NewGuid(); + + public Guid ChatId { get; } = chatId; + + public Guid CallerId { get; } = callerId; + + public Guid CalleeId { get; } = calleeId; + + public CallMediaType MediaType { get; } = mediaType; + + public DateTimeOffset CreatedAt { get; } = DateTimeOffset.UtcNow; + + public DateTimeOffset? ConnectedAt { get; set; } + + public string EndReason { get; set; } = string.Empty; + + public CallSessionState State { get; set; } = CallSessionState.Ringing; + + public ActiveCallSession ToSnapshot() => + new(CallId, ChatId, CallerId, CalleeId, MediaType, CreatedAt, ConnectedAt, EndReason, State); + } +} + +public sealed record ActiveCallSession( + Guid CallId, + Guid ChatId, + Guid CallerId, + Guid CalleeId, + CallMediaType MediaType, + DateTimeOffset CreatedAt, + DateTimeOffset? ConnectedAt, + string EndReason, + CallSessionState State); + +public enum CallSessionState +{ + Ringing = 0, + Connected = 1, + Ended = 2 +} diff --git a/src/Ikar.Server/Infrastructure/Calls/WebRtcOptions.cs b/src/Ikar.Server/Infrastructure/Calls/WebRtcOptions.cs new file mode 100644 index 00000000..f432fca2 --- /dev/null +++ b/src/Ikar.Server/Infrastructure/Calls/WebRtcOptions.cs @@ -0,0 +1,34 @@ +using Ikar.Shared; + +namespace Ikar.Server.Infrastructure.Calls; + +public sealed class WebRtcOptions +{ + public const string SectionName = "WebRtc"; + + public List<WebRtcIceServerOptions> IceServers { get; set; } = + [ + new() + { + Urls = ["stun:stun.l.google.com:19302"] + } + ]; + + public IReadOnlyList<CallIceServerDto> ToDto() => + IceServers + .Where(server => server.Urls.Count > 0) + .Select(server => new CallIceServerDto( + Urls: server.Urls, + Username: string.IsNullOrWhiteSpace(server.Username) ? null : server.Username, + Credential: string.IsNullOrWhiteSpace(server.Credential) ? null : server.Credential)) + .ToList(); +} + +public sealed class WebRtcIceServerOptions +{ + public List<string> Urls { get; set; } = []; + + public string? Username { get; set; } + + public string? Credential { get; set; } +} diff --git a/src/Ikar.Server/Infrastructure/ClaimsPrincipalExtensions.cs b/src/Ikar.Server/Infrastructure/ClaimsPrincipalExtensions.cs new file mode 100644 index 00000000..d9ecef83 --- /dev/null +++ b/src/Ikar.Server/Infrastructure/ClaimsPrincipalExtensions.cs @@ -0,0 +1,22 @@ +using System.Security.Claims; + +namespace Ikar.Server.Infrastructure; + +public static class ClaimsPrincipalExtensions +{ + public static Guid GetRequiredUserId(this ClaimsPrincipal principal) + { + var value = principal.FindFirstValue(ClaimTypes.NameIdentifier); + return Guid.TryParse(value, out var userId) + ? userId + : throw new InvalidOperationException("Authenticated user id claim is missing."); + } + + public static Guid GetRequiredSessionId(this ClaimsPrincipal principal) + { + var value = principal.FindFirstValue("sid"); + return Guid.TryParse(value, out var sessionId) + ? sessionId + : throw new InvalidOperationException("Authenticated session id claim is missing."); + } +} diff --git a/src/Ikar.Server/Infrastructure/DatabaseSeeder.cs b/src/Ikar.Server/Infrastructure/DatabaseSeeder.cs new file mode 100644 index 00000000..91a32c74 --- /dev/null +++ b/src/Ikar.Server/Infrastructure/DatabaseSeeder.cs @@ -0,0 +1,119 @@ +using Microsoft.AspNetCore.Identity; +using Microsoft.EntityFrameworkCore; +using Ikar.Server.Data; +using Ikar.Server.Data.Entities; +using Ikar.Shared; + +namespace Ikar.Server.Infrastructure; + +public sealed class DatabaseSeeder(IkarDbContext dbContext) +{ + private readonly PasswordHasher<User> _passwordHasher = new(); + + public async Task SeedAsync() + { + if (await dbContext.Users.AnyAsync()) + { + return; + } + + var alice = CreateUser("alice", "Alice Carter", "demo123", "+10000000001"); + var bob = CreateUser("bob", "Bob Miller", "demo123", "+10000000002"); + var carol = CreateUser("carol", "Carol Stone", "demo123", "+10000000003"); + + var directChat = new Chat + { + Type = ChatType.Direct, + CreatedBy = alice, + CreatedAt = DateTimeOffset.UtcNow.AddMinutes(-30), + LastActivityAt = DateTimeOffset.UtcNow.AddMinutes(-5), + Members = + [ + new ChatMember { User = alice, IsOwner = true, JoinedAt = DateTimeOffset.UtcNow.AddMinutes(-30) }, + new ChatMember { User = bob, IsOwner = false, JoinedAt = DateTimeOffset.UtcNow.AddMinutes(-30) } + ] + }; + + var groupChat = new Chat + { + Type = ChatType.Group, + Title = "Ikar Crew", + CreatedBy = alice, + CreatedAt = DateTimeOffset.UtcNow.AddMinutes(-20), + LastActivityAt = DateTimeOffset.UtcNow.AddMinutes(-2), + Members = + [ + new ChatMember { User = alice, IsOwner = true, JoinedAt = DateTimeOffset.UtcNow.AddMinutes(-20) }, + new ChatMember { User = bob, IsOwner = false, JoinedAt = DateTimeOffset.UtcNow.AddMinutes(-20) }, + new ChatMember { User = carol, IsOwner = false, JoinedAt = DateTimeOffset.UtcNow.AddMinutes(-20) } + ] + }; + + directChat.Messages.Add(new Message + { + Chat = directChat, + Sender = alice, + Text = "Welcome to Ikar. This is a seeded private dialog.", + SentAt = DateTimeOffset.UtcNow.AddMinutes(-10) + }); + + directChat.Messages.Add(new Message + { + Chat = directChat, + Sender = bob, + Text = "Messages are stored in SQLite and delivered through SignalR.", + SentAt = DateTimeOffset.UtcNow.AddMinutes(-5) + }); + + groupChat.Messages.Add(new Message + { + Chat = groupChat, + Sender = carol, + Text = "Use this group to validate shared conversations.", + SentAt = DateTimeOffset.UtcNow.AddMinutes(-2) + }); + + var channel = new Chat + { + Type = ChatType.Channel, + Title = "Ikar Updates", + CreatedBy = alice, + CreatedAt = DateTimeOffset.UtcNow.AddMinutes(-15), + LastActivityAt = DateTimeOffset.UtcNow.AddMinutes(-1), + Members = + [ + new ChatMember { User = alice, IsOwner = true, Role = ChatMemberRole.Owner, CanPinMessages = true, CanDeleteMessages = true, CanInviteUsers = true, CanPostMessages = true, JoinedAt = DateTimeOffset.UtcNow.AddMinutes(-15) }, + new ChatMember { User = bob, IsOwner = false, CanPostMessages = false, JoinedAt = DateTimeOffset.UtcNow.AddMinutes(-15) }, + new ChatMember { User = carol, IsOwner = false, CanPostMessages = false, JoinedAt = DateTimeOffset.UtcNow.AddMinutes(-15) } + ] + }; + + channel.Messages.Add(new Message + { + Chat = channel, + Sender = alice, + Text = "This channel is broadcast-only. Owners can post, subscribers can read.", + PostedAsChannel = true, + SentAt = DateTimeOffset.UtcNow.AddMinutes(-1) + }); + + dbContext.Users.AddRange(alice, bob, carol); + dbContext.Chats.AddRange(directChat, groupChat, channel); + await dbContext.SaveChangesAsync(); + } + + private User CreateUser(string username, string displayName, string password, string phoneNumber) + { + var user = new User + { + Username = username, + NormalizedUsername = username.ToUpperInvariant(), + DisplayName = displayName, + PhoneNumber = phoneNumber, + NormalizedPhoneNumber = PhoneNumberNormalizer.Normalize(phoneNumber) + }; + + user.PasswordHash = _passwordHasher.HashPassword(user, password); + return user; + } +} diff --git a/src/Ikar.Server/Infrastructure/DtoMapper.cs b/src/Ikar.Server/Infrastructure/DtoMapper.cs new file mode 100644 index 00000000..102d5526 --- /dev/null +++ b/src/Ikar.Server/Infrastructure/DtoMapper.cs @@ -0,0 +1,666 @@ +using Ikar.Server.Data.Entities; +using Ikar.Shared; + +namespace Ikar.Server.Infrastructure; + +public static class DtoMapper +{ + private static readonly HashSet<string> AudioExtensions = + [ + ".aac", + ".flac", + ".m4a", + ".mp3", + ".oga", + ".ogg", + ".opus", + ".wav", + ".webm" + ]; + + public static UserSummaryDto ToDto(this User user, PresenceTracker presenceTracker) => + new( + user.Id, + user.Username, + user.DisplayName, + presenceTracker.IsOnline(user.Id), + user.PhoneNumber, + user.Sessions + .OrderByDescending(x => x.LastSeenAt) + .Select(x => (DateTimeOffset?)x.LastSeenAt) + .FirstOrDefault(), + user.About, + ResolveAvatarPath(user), + user.IsBot); + + public static BotSummaryDto ToDto(this Bot bot) => + new( + bot.Id, + bot.UserId, + bot.User.Username, + bot.User.DisplayName, + bot.User.About, + bot.IsEnabled, + bot.CreatedAt, + bot.Commands + .OrderBy(x => x.SortOrder) + .ThenBy(x => x.Command, StringComparer.OrdinalIgnoreCase) + .Select(x => new BotCommandDto(x.Command, x.Description)) + .ToList()); + + public static PushDeviceDto ToDto(this PushDevice device) => + new( + device.Id, + device.Platform, + device.InstallationId, + device.DeviceName, + device.NotificationsEnabled, + device.UpdatedAt); + + public static MessageDto ToDto(this Message message, PresenceTracker presenceTracker, Guid currentUserId) + { + var sender = ResolveMessageSenderDto(message, presenceTracker, currentUserId); + var displayAuthorName = ResolveDisplayAuthorName(message); + var viewCount = message.Chat?.Type == ChatType.Channel && message.PostedAsChannel + ? message.Views.Count + : (int?)null; + + return new MessageDto( + message.Id, + message.ChatId, + message.Chat?.Type ?? ChatType.Direct, + sender, + message.Text, + message.Attachments + .OrderBy(x => x.SortOrder) + .ThenBy(x => x.OriginalFileName) + .Select(x => x.ToDto(message.ChatId)) + .ToList(), + message.SentAt, + message.EditedAt, + message.DeletedAt, + ResolveDeliveryState(message, currentUserId), + message.ForwardedFromDisplayName, + BuildReplyDto(message.ReplyToMessage, message.Chat), + message.PinnedAt, + message.PinnedByUser?.ToDto(presenceTracker), + message.MediaAlbumId, + BuildReactions(message, currentUserId), + message.HasProtectedContent || message.Chat?.HasProtectedContent == true, + message.ExpiresAt, + message.TtlSeconds, + message.PostedAsChannel, + displayAuthorName, + viewCount); + } + + public static AttachmentDto ToDto(this MessageAttachment attachment, Guid chatId) => + new( + attachment.Id, + attachment.OriginalFileName, + attachment.ContentType, + attachment.FileSizeBytes, + $"/api/chats/{chatId}/attachments/{attachment.Id}/content", + ResolveAttachmentKind(attachment), + attachment.SortOrder); + + public static ChatSummaryDto ToSummaryDto( + this Chat chat, + Guid currentUserId, + PresenceTracker presenceTracker, + Message? latestMessage = null, + int? unreadCountOverride = null) + { + var currentMembership = chat.Members.FirstOrDefault(x => x.UserId == currentUserId); + var permissions = BuildPermissions(currentMembership, chat.Type); + var canSendMessages = permissions.CanPostMessages; + var channelStats = BuildChannelStats(chat); + var visibleMembers = BuildVisibleMembers(chat, currentMembership); + var orderedMembers = visibleMembers + .Select(x => x.User) + .OrderBy(x => x.DisplayName) + .ToList(); + + var participants = orderedMembers + .Select(user => user.ToDto(presenceTracker)) + .ToList(); + + var counterpart = chat.Type == ChatType.Direct + ? orderedMembers.FirstOrDefault(x => x.Id != currentUserId) + : null; + var title = chat.Type == ChatType.Direct + ? counterpart?.DisplayName ?? (string.IsNullOrWhiteSpace(chat.Title) ? "Dialog" : chat.Title) + : string.IsNullOrWhiteSpace(chat.Title) ? "New Group" : chat.Title; + + var secondary = chat.Type switch + { + ChatType.Direct => counterpart is null + ? null + : counterpart.IsBot + ? $"бот · @{counterpart.Username}" + : $"@{counterpart.Username}", + ChatType.Channel => $"{FormatSubscribers(channelStats.SubscriberCount)}{(canSendMessages ? " · публикация разрешена" : string.Empty)}", + _ => $"{participants.Count} members" + }; + + var lastMessage = latestMessage ?? chat.Messages.OrderByDescending(x => x.SentAt).FirstOrDefault(); + if (lastMessage is not null) + { + lastMessage.Chat ??= chat; + } + + var lastPreview = lastMessage is null ? null : BuildMessagePreview(lastMessage); + var lastMessageAttachment = lastMessage is null || + lastMessage.DeletedAt is not null || + !string.IsNullOrWhiteSpace(lastMessage.Text) + ? null + : lastMessage.Attachments + .OrderBy(attachment => attachment.SortOrder) + .ThenBy(attachment => attachment.Id) + .FirstOrDefault() + ?.ToDto(chat.Id); + var unreadCount = unreadCountOverride ?? chat.Messages.Count(message => + message.SenderId != currentUserId && + message.DeletedAt is null && + (currentMembership?.LastReadAt is null || message.SentAt > currentMembership.LastReadAt.Value)); + + return new ChatSummaryDto( + chat.Id, + title, + chat.Type, + secondary, + chat.LastActivityAt ?? chat.CreatedAt, + lastPreview, + participants, + canSendMessages, + unreadCount, + currentMembership?.IsPinned == true, + currentMembership?.IsArchived == true, + currentMembership?.MutedUntil is not null && currentMembership.MutedUntil > DateTimeOffset.UtcNow, + currentMembership?.FolderKey, + chat.HasProtectedContent, + chat.DefaultMessageTtlSeconds, + lastMessageAttachment, + channelStats.SubscriberCount, + channelStats.AdminCount, + currentMembership is not null, + chat.Type == ChatType.Channel && currentMembership is null && !string.IsNullOrWhiteSpace(chat.PublicUsername), + permissions.CanManageMembers, + chat.Type == ChatType.Channel && canSendMessages, + chat.PublicUsername, + chat.LinkedDiscussionChatId, + chat.ChannelSignaturesEnabled, + chat.Description); + } + + public static ChatDetailsDto ToDetailsDto( + this Chat chat, + Guid currentUserId, + PresenceTracker presenceTracker, + Guid? firstUnreadMessageId = null, + IReadOnlyList<Message>? messagesOverride = null, + bool hasMoreMessages = false, + IReadOnlyList<Message>? pinnedMessagesOverride = null) + { + var currentMembership = chat.Members.FirstOrDefault(x => x.UserId == currentUserId); + var permissions = BuildPermissions(currentMembership, chat.Type); + var canSendMessages = permissions.CanPostMessages; + var channelStats = BuildChannelStats(chat); + var visibleMembers = BuildVisibleMembers(chat, currentMembership); + var participants = visibleMembers + .Select(x => x.User) + .OrderBy(x => x.DisplayName) + .Select(x => x.ToDto(presenceTracker)) + .ToList(); + var members = visibleMembers + .OrderByDescending(x => x.IsOwner || x.Role == ChatMemberRole.Owner) + .ThenByDescending(x => x.Role == ChatMemberRole.Admin) + .ThenBy(x => x.User.DisplayName) + .Select(x => new ChatMemberDto( + x.User.ToDto(presenceTracker), + x.Role, + x.IsOwner, + BuildPermissions(x, chat.Type))) + .ToList(); + + var counterpart = chat.Type == ChatType.Direct + ? chat.Members.Select(x => x.User).FirstOrDefault(x => x.Id != currentUserId) + : null; + + var title = chat.Type == ChatType.Direct + ? counterpart?.DisplayName ?? (string.IsNullOrWhiteSpace(chat.Title) ? "Dialog" : chat.Title) + : string.IsNullOrWhiteSpace(chat.Title) ? "New Group" : chat.Title; + + var sourceMessages = messagesOverride ?? chat.Messages.OrderBy(x => x.SentAt).ToList(); + foreach (var message in sourceMessages) + { + message.Chat = chat; + } + + var messages = sourceMessages + .OrderBy(x => x.SentAt) + .Select(x => x.ToDto(presenceTracker, currentUserId)) + .ToList(); + + var pinnedMessages = (pinnedMessagesOverride ?? chat.Messages + .Where(x => x.PinnedAt is not null && x.DeletedAt is null) + .OrderByDescending(x => x.PinnedAt) + .Take(5) + .ToList()) + .Select(message => + { + message.Chat = chat; + return message.ToDto(presenceTracker, currentUserId); + }) + .ToList(); + + return new ChatDetailsDto( + chat.Id, + title, + chat.Type, + participants, + canSendMessages, + messages, + firstUnreadMessageId, + hasMoreMessages, + pinnedMessages, + permissions, + members, + chat.HasProtectedContent, + chat.DefaultMessageTtlSeconds, + channelStats.SubscriberCount, + channelStats.AdminCount, + currentMembership is not null, + chat.Type == ChatType.Channel && currentMembership is null && !string.IsNullOrWhiteSpace(chat.PublicUsername), + permissions.CanManageMembers, + chat.Type == ChatType.Channel && canSendMessages, + chat.PublicUsername, + chat.LinkedDiscussionChatId, + chat.ChannelSignaturesEnabled, + chat.Description); + } + + public static ModerationLogDto ToDto(this ModerationLogEntry entry, PresenceTracker presenceTracker) => + new( + entry.Id, + entry.ChatId, + entry.ActorUserId, + string.IsNullOrWhiteSpace(entry.ActorUser.DisplayName) + ? entry.ActorUser.Username + : entry.ActorUser.DisplayName, + entry.TargetType, + entry.TargetId, + entry.Action, + entry.Reason, + entry.CreatedAt); + + public static StoryDto ToDto(this Story story, PresenceTracker presenceTracker, Guid currentUserId) => + new( + story.Id, + story.AuthorUser.ToDto(presenceTracker), + story.DeletedAt is null ? story.Text : string.Empty, + story.DeletedAt is null + ? story.Attachments + .OrderBy(x => x.SortOrder) + .ThenBy(x => x.OriginalFileName) + .Select(x => x.ToDto(story.Id)) + .ToList() + : [], + story.Visibility, + story.HasProtectedContent, + story.CreatedAt, + story.ExpiresAt, + story.DeletedAt, + story.Views.Count, + story.Views.Any(x => x.ViewerUserId == currentUserId)); + + public static AttachmentDto ToDto(this StoryAttachment attachment, Guid storyId) => + new( + attachment.Id, + attachment.OriginalFileName, + attachment.ContentType, + attachment.FileSizeBytes, + $"/api/stories/{storyId}/attachments/{attachment.Id}/content", + AttachmentKind.File, + attachment.SortOrder); + + public static ChatPermissionsDto BuildPermissions(ChatMember? membership, ChatType chatType) + { + if (membership is null) + { + return new ChatPermissionsDto(false, false, false, false, false); + } + + var isManager = membership.IsOwner || membership.Role is ChatMemberRole.Owner or ChatMemberRole.Admin; + var canPost = chatType != ChatType.Channel || isManager || membership.CanPostMessages; + return new ChatPermissionsDto( + CanPostMessages: canPost, + CanPinMessages: isManager || membership.CanPinMessages, + CanDeleteMessages: isManager || membership.CanDeleteMessages, + CanInviteUsers: isManager || membership.CanInviteUsers, + CanManageMembers: isManager); + } + + private static IReadOnlyList<ChatMember> BuildVisibleMembers(Chat chat, ChatMember? currentMembership) + { + if (chat.Type != ChatType.Channel) + { + return chat.Members.ToList(); + } + + if (currentMembership is not null && BuildPermissions(currentMembership, chat.Type).CanManageMembers) + { + return chat.Members.ToList(); + } + + if (currentMembership is null) + { + return chat.Members + .Where(IsChannelManager) + .ToList(); + } + + return chat.Members + .Where(member => member.UserId == currentMembership.UserId || IsChannelManager(member)) + .ToList(); + } + + private static ChannelStats BuildChannelStats(Chat chat) + { + if (chat.Type != ChatType.Channel) + { + var memberCount = chat.Members.Count; + return new ChannelStats(memberCount, chat.Members.Count(IsChannelManager)); + } + + return new ChannelStats( + chat.Members.Count, + chat.Members.Count(IsChannelManager)); + } + + private static bool IsChannelManager(ChatMember member) => + member.IsOwner || member.Role is ChatMemberRole.Owner or ChatMemberRole.Admin; + + private static string FormatSubscribers(int count) => + $"{count} {FormatRussianPlural(count, "подписчик", "подписчика", "подписчиков")}"; + + private static string FormatRussianPlural(int count, string one, string few, string many) + { + var value = Math.Abs(count) % 100; + var lastDigit = value % 10; + if (value is >= 11 and <= 14) + { + return many; + } + + return lastDigit switch + { + 1 => one, + >= 2 and <= 4 => few, + _ => many + }; + } + + private static UserSummaryDto ResolveMessageSenderDto(Message message, PresenceTracker presenceTracker, Guid currentUserId) + { + if (message.Chat is { Type: ChatType.Channel } chat && + message.PostedAsChannel && + !CanInspectChannelSender(chat, currentUserId)) + { + return BuildChannelIdentityDto(chat); + } + + return message.Sender.ToDto(presenceTracker); + } + + private static bool CanInspectChannelSender(Chat chat, Guid currentUserId) + { + var membership = chat.Members.FirstOrDefault(member => member.UserId == currentUserId); + return membership is not null && BuildPermissions(membership, chat.Type).CanManageMembers; + } + + private static UserSummaryDto BuildChannelIdentityDto(Chat chat) => + new( + chat.Id, + chat.PublicUsername ?? $"channel-{chat.Id:N}", + string.IsNullOrWhiteSpace(chat.Title) ? "Channel" : chat.Title!, + false, + null, + null, + null, + null); + + private static string ResolveDisplayAuthorName(Message message) + { + if (message.Chat?.Type == ChatType.Channel && message.PostedAsChannel) + { + if (!string.IsNullOrWhiteSpace(message.AuthorSignature)) + { + return message.AuthorSignature!; + } + + return string.IsNullOrWhiteSpace(message.Chat.Title) ? "Channel" : message.Chat.Title!; + } + + return string.IsNullOrWhiteSpace(message.Sender.DisplayName) + ? message.Sender.Username + : message.Sender.DisplayName; + } + + private static string ResolveReplyAuthorName(Message replyToMessage, Chat? currentChat) + { + if (currentChat?.Type == ChatType.Channel && replyToMessage.PostedAsChannel) + { + if (!string.IsNullOrWhiteSpace(replyToMessage.AuthorSignature)) + { + return replyToMessage.AuthorSignature!; + } + + return string.IsNullOrWhiteSpace(currentChat.Title) ? "Channel" : currentChat.Title!; + } + + return string.IsNullOrWhiteSpace(replyToMessage.Sender.DisplayName) + ? replyToMessage.Sender.Username + : replyToMessage.Sender.DisplayName; + } + + public static string BuildPushTitle(this Chat chat, Message message) => + chat.Type switch + { + ChatType.Direct => message.Sender.DisplayName, + ChatType.Channel when message.PostedAsChannel => string.IsNullOrWhiteSpace(chat.Title) ? "Channel" : chat.Title!, + _ => string.IsNullOrWhiteSpace(chat.Title) ? message.Sender.DisplayName : chat.Title! + }; + + public static string BuildPushBody(this Message message) + { + if (message.DeletedAt is not null) + { + return "Message removed"; + } + + if (!string.IsNullOrWhiteSpace(message.Text)) + { + return message.Attachments.Count == 0 + ? message.Text + : $"{message.Text} ({BuildAttachmentPreview(message.Attachments)})"; + } + + return BuildAttachmentPreview(message.Attachments); + } + + private static string BuildMessagePreview(Message lastMessage) + { + var isChannelPost = lastMessage.Chat?.Type == ChatType.Channel && lastMessage.PostedAsChannel; + + if (lastMessage.DeletedAt is not null) + { + return isChannelPost + ? "Публикация удалена" + : $"{ResolveDisplayAuthorName(lastMessage)}: message removed"; + } + + if (string.IsNullOrWhiteSpace(lastMessage.Text)) + { + var attachmentPreview = BuildAttachmentPreview(lastMessage.Attachments); + return isChannelPost + ? attachmentPreview + : $"{ResolveDisplayAuthorName(lastMessage)}: {attachmentPreview}"; + } + + var textPreview = lastMessage.Attachments.Count == 0 + ? lastMessage.Text + : $"{lastMessage.Text} ({BuildAttachmentPreview(lastMessage.Attachments)})"; + + return isChannelPost + ? textPreview + : $"{ResolveDisplayAuthorName(lastMessage)}: {textPreview}"; + } + + private static MessageReplyDto? BuildReplyDto(Message? replyToMessage, Chat? currentChat) + { + if (replyToMessage is null) + { + return null; + } + + return new MessageReplyDto( + replyToMessage.Id, + replyToMessage.SenderId, + ResolveReplyAuthorName(replyToMessage, currentChat), + BuildReplyPreviewText(replyToMessage)); + } + + private static IReadOnlyList<MessageReactionDto> BuildReactions(Message message, Guid currentUserId) => + message.Reactions + .Where(reaction => !string.IsNullOrWhiteSpace(reaction.Emoji)) + .GroupBy(reaction => reaction.Emoji) + .Select(group => new MessageReactionDto( + group.Key, + group.Count(), + group.Any(reaction => reaction.UserId == currentUserId))) + .OrderByDescending(reaction => reaction.Count) + .ThenBy(reaction => reaction.Emoji, StringComparer.Ordinal) + .ToList(); + + private static string BuildAttachmentPreview(ICollection<MessageAttachment> attachments) + { + if (attachments.Count == 0) + { + return string.Empty; + } + + if (attachments.Count == 1) + { + var attachment = attachments.First(); + if (ResolveAttachmentKind(attachment) == AttachmentKind.VoiceNote) + { + return "голосовое сообщение"; + } + + if (IsImageAttachment(attachment.ContentType, attachment.OriginalFileName)) + { + return "фотография"; + } + + return $"файл: {attachment.OriginalFileName}"; + } + + if (attachments.All(attachment => IsImageAttachment(attachment.ContentType, attachment.OriginalFileName))) + { + return $"{attachments.Count} {FormatRussianPlural(attachments.Count, "фотография", "фотографии", "фотографий")}"; + } + + return $"{attachments.Count} {FormatRussianPlural(attachments.Count, "файл", "файла", "файлов")}"; + } + + private static string BuildReplyPreviewText(Message message) + { + if (message.DeletedAt is not null) + { + return "Сообщение удалено"; + } + + if (!string.IsNullOrWhiteSpace(message.Text)) + { + return message.Attachments.Count == 0 + ? message.Text + : $"{message.Text} ({BuildAttachmentPreview(message.Attachments)})"; + } + + return BuildAttachmentPreview(message.Attachments); + } + + private static AttachmentKind ResolveAttachmentKind(MessageAttachment attachment) => + IsAudioAttachment(attachment.ContentType, attachment.OriginalFileName) + ? AttachmentKind.VoiceNote + : AttachmentKind.File; + + private static MessageDeliveryState ResolveDeliveryState(Message message, Guid currentUserId) + { + if (message.SenderId != currentUserId) + { + return MessageDeliveryState.Sent; + } + + var recipients = (message.Chat?.Members ?? []) + .Where(member => member.UserId != currentUserId) + .ToList(); + + if (recipients.Count == 0) + { + return MessageDeliveryState.Sent; + } + + if (recipients.All(member => member.LastReadAt is not null && member.LastReadAt.Value >= message.SentAt)) + { + return MessageDeliveryState.Read; + } + + if (recipients.All(member => member.LastDeliveredAt is not null && member.LastDeliveredAt.Value >= message.SentAt)) + { + return MessageDeliveryState.Delivered; + } + + return MessageDeliveryState.Sent; + } + + private static bool IsAudioAttachment(string? contentType, string? fileName) + { + if (!string.IsNullOrWhiteSpace(contentType) && + contentType.StartsWith("audio/", StringComparison.OrdinalIgnoreCase)) + { + return true; + } + + var extension = Path.GetExtension(fileName ?? string.Empty); + return AudioExtensions.Contains(extension); + } + + private static bool IsImageAttachment(string? contentType, string? fileName) + { + if (!string.IsNullOrWhiteSpace(contentType) && + contentType.StartsWith("image/", StringComparison.OrdinalIgnoreCase)) + { + return true; + } + + var extension = Path.GetExtension(fileName ?? string.Empty).ToLowerInvariant(); + return extension is ".jpg" or ".jpeg" or ".png" or ".webp" or ".gif"; + } + + private sealed record ChannelStats(int SubscriberCount, int AdminCount); + + private static string? ResolveAvatarPath(User user) + { + if (string.IsNullOrWhiteSpace(user.AvatarStoragePath)) + { + return null; + } + + var fileName = Path.GetFileName(user.AvatarStoragePath); + return string.IsNullOrWhiteSpace(fileName) + ? null + : $"/api/users/{user.Id}/avatar/{Uri.EscapeDataString(fileName)}"; + } +} diff --git a/src/Ikar.Server/Infrastructure/Hubs/MessengerHub.cs b/src/Ikar.Server/Infrastructure/Hubs/MessengerHub.cs new file mode 100644 index 00000000..50fc3702 --- /dev/null +++ b/src/Ikar.Server/Infrastructure/Hubs/MessengerHub.cs @@ -0,0 +1,367 @@ +using Ikar.Server.Data; +using Ikar.Server.Data.Entities; +using Ikar.Server.Infrastructure.Auth; +using Ikar.Server.Infrastructure.Calls; +using Ikar.Server.Infrastructure.Push; +using Ikar.Shared; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.SignalR; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Options; + +namespace Ikar.Server.Infrastructure.Hubs; + +[Authorize] +public sealed class MessengerHub( + PresenceTracker presenceTracker, + IkarDbContext dbContext, + CallSessionStore callSessionStore, + IPushNotificationSender pushNotificationSender, + IOptions<WebRtcOptions> webRtcOptions) : Hub +{ + public override async Task OnConnectedAsync() + { + var userId = Context.User!.GetRequiredUserId(); + await Groups.AddToGroupAsync(Context.ConnectionId, GetUserGroup(userId)); + presenceTracker.MarkOnline(userId); + await CaptureClientVersionAsync(); + await base.OnConnectedAsync(); + } + + public override async Task OnDisconnectedAsync(Exception? exception) + { + if (Context.User?.Identity?.IsAuthenticated == true) + { + var userId = Context.User.GetRequiredUserId(); + presenceTracker.MarkOffline(userId); + if (callSessionStore.TryEndByParticipant(userId, "disconnected", out var endedSession)) + { + await NotifyCallEndedAsync(endedSession!); + } + } + + await base.OnDisconnectedAsync(exception); + } + + public Task<OutgoingCallDto> StartCall(Guid chatId) => + StartMediaCall(chatId, CallMediaType.Audio); + + public async Task SendTyping(Guid chatId, bool isTyping) + { + var userId = Context.User!.GetRequiredUserId(); + var chat = await dbContext.Chats + .Include(x => x.Members) + .ThenInclude(x => x.User) + .AsNoTracking() + .SingleOrDefaultAsync( + x => x.Id == chatId && x.Members.Any(member => member.UserId == userId), + Context.ConnectionAborted); + + if (chat is null) + { + throw new HubException("Chat not found."); + } + + if (chat.Type == ChatType.Channel && + !DtoMapper.BuildPermissions(chat.Members.FirstOrDefault(member => member.UserId == userId), chat.Type).CanPostMessages) + { + throw new HubException("Read-only channel."); + } + + var sender = chat.Members.Single(member => member.UserId == userId).User; + var payload = new TypingIndicatorDto(chatId, sender.ToDto(presenceTracker), isTyping, DateTimeOffset.UtcNow); + var tasks = chat.Members + .Where(member => member.UserId != userId) + .Select(member => Clients.User(member.UserId.ToString()) + .SendAsync("TypingChanged", payload, Context.ConnectionAborted)); + + await Task.WhenAll(tasks); + } + + public async Task<OutgoingCallDto> StartMediaCall(Guid chatId, CallMediaType mediaType) + { + var callerId = Context.User!.GetRequiredUserId(); + var chat = await LoadDirectChatAsync(chatId, callerId); + var caller = chat.Members.Single(member => member.UserId == callerId).User; + var callee = chat.Members.Single(member => member.UserId != callerId).User; + var calleeDevices = await LoadPushDevicesAsync(callee.Id); + var hasRealtimePresence = presenceTracker.IsOnline(callee.Id); + var hasPushDevices = calleeDevices.Count > 0; + + if (!hasRealtimePresence && !hasPushDevices) + { + throw new HubException("Собеседник сейчас недоступен для звонка."); + } + + if (!callSessionStore.TryCreate(chatId, callerId, callee.Id, mediaType, out var session, out var error)) + { + throw new HubException(error); + } + + var callerDto = caller.ToDto(presenceTracker); + var calleeDto = callee.ToDto(presenceTracker); + var resolvedSession = session!; + var incomingCall = new IncomingCallDto(resolvedSession.CallId, chatId, callerDto, mediaType); + + if (hasRealtimePresence) + { + await Clients.Group(GetUserGroup(callee.Id)) + .SendAsync("IncomingCall", incomingCall); + } + + if (hasPushDevices) + { + await pushNotificationSender.SendIncomingCallAsync(incomingCall, calleeDevices, Context.ConnectionAborted); + } + + return new OutgoingCallDto(resolvedSession.CallId, chatId, calleeDto, mediaType); + } + + public async Task AcceptCall(Guid callId) + { + var userId = Context.User!.GetRequiredUserId(); + if (!callSessionStore.TryAccept(callId, userId, out var session, out var error)) + { + throw new HubException(error); + } + + var resolvedSession = session!; + var connectedAt = resolvedSession.ConnectedAt ?? DateTimeOffset.UtcNow; + await NotifyCallConnectedAsync(resolvedSession with { ConnectedAt = connectedAt }); + } + + public async Task DeclineCall(Guid callId) + { + var userId = Context.User!.GetRequiredUserId(); + if (!callSessionStore.TryDecline(callId, userId, out var session, out var error)) + { + throw new HubException(error); + } + + await NotifyCallEndedAsync(session!); + } + + public async Task EndCall(Guid callId) + { + var userId = Context.User!.GetRequiredUserId(); + if (!callSessionStore.TryEnd(callId, userId, "ended", out var session, out var error)) + { + throw new HubException(error); + } + + await NotifyCallEndedAsync(session!); + } + + public async Task SendCallOffer(CallOfferDto payload) + { + if (string.IsNullOrWhiteSpace(payload.Sdp) || string.IsNullOrWhiteSpace(payload.Type)) + { + throw new HubException("Пустое WebRTC offer."); + } + + var recipientUserId = ResolveRecipientForConnectedCall(payload.CallId); + await Clients.Group(GetUserGroup(recipientUserId)) + .SendAsync("CallOffer", payload); + } + + public async Task SendCallAnswer(CallAnswerDto payload) + { + if (string.IsNullOrWhiteSpace(payload.Sdp) || string.IsNullOrWhiteSpace(payload.Type)) + { + throw new HubException("Пустой WebRTC answer."); + } + + var recipientUserId = ResolveRecipientForConnectedCall(payload.CallId); + await Clients.Group(GetUserGroup(recipientUserId)) + .SendAsync("CallAnswer", payload); + } + + public async Task SendCallIceCandidate(CallIceCandidateDto payload) + { + if (string.IsNullOrWhiteSpace(payload.Candidate)) + { + throw new HubException("Пустой ICE candidate."); + } + + var recipientUserId = ResolveRecipientForConnectedCall(payload.CallId); + await Clients.Group(GetUserGroup(recipientUserId)) + .SendAsync("CallIceCandidate", payload); + } + + private Guid ResolveRecipientForConnectedCall(Guid callId) + { + var userId = Context.User!.GetRequiredUserId(); + if (!callSessionStore.TryResolveRecipient(callId, userId, out var recipientUserId, out _, out var error)) + { + throw new HubException(error); + } + + return recipientUserId; + } + + private async Task<Chat> LoadDirectChatAsync(Guid chatId, Guid userId) + { + var chat = await dbContext.Chats + .Include(x => x.Members) + .ThenInclude(x => x.User) + .SingleOrDefaultAsync(x => x.Id == chatId); + + if (chat is null) + { + throw new HubException("Чат не найден."); + } + + if (chat.Type != ChatType.Direct) + { + throw new HubException("Звонки доступны только в личных чатах."); + } + + if (!chat.Members.Any(member => member.UserId == userId)) + { + throw new HubException("Нет доступа к этому чату."); + } + + if (chat.Members.Count != 2) + { + throw new HubException("Для звонка требуется один собеседник."); + } + + if (chat.Members.Any(member => member.User.IsBot)) + { + throw new HubException("Звонки недоступны в чатах с ботами."); + } + + return chat; + } + + private Task NotifyCallConnectedAsync(ActiveCallSession session) + { + var iceServers = webRtcOptions.Value.ToDto(); + var callerPayload = new CallConnectedDto( + session.CallId, + session.ChatId, + session.ConnectedAt ?? DateTimeOffset.UtcNow, + session.MediaType, + iceServers, + ShouldCreateOffer: true); + var calleePayload = new CallConnectedDto( + session.CallId, + session.ChatId, + session.ConnectedAt ?? DateTimeOffset.UtcNow, + session.MediaType, + iceServers, + ShouldCreateOffer: false); + + return Task.WhenAll( + Clients.Group(GetUserGroup(session.CallerId)).SendAsync("CallConnected", callerPayload), + Clients.Group(GetUserGroup(session.CalleeId)).SendAsync("CallConnected", calleePayload)); + } + + private async Task NotifyCallEndedAsync(ActiveCallSession session) + { + var payload = new CallEndedDto(session.CallId, session.ChatId, session.EndReason, session.MediaType); + await Task.WhenAll( + Clients.Group(GetUserGroup(session.CallerId)).SendAsync("CallEnded", payload), + Clients.Group(GetUserGroup(session.CalleeId)).SendAsync("CallEnded", payload)); + + await PersistCallHistoryMessageAsync(session); + + var calleeDevices = await LoadPushDevicesAsync(session.CalleeId); + if (calleeDevices.Count > 0) + { + await pushNotificationSender.SendCallEndedAsync(payload, calleeDevices, Context.ConnectionAborted); + } + } + + private async Task PersistCallHistoryMessageAsync(ActiveCallSession session) + { + var chat = await dbContext.Chats + .Include(x => x.Members) + .SingleOrDefaultAsync(x => x.Id == session.ChatId, Context.ConnectionAborted); + + if (chat is null || chat.Members.Count == 0) + { + return; + } + + var sender = await dbContext.Users + .SingleOrDefaultAsync(x => x.Id == session.CallerId, Context.ConnectionAborted); + + if (sender is null) + { + return; + } + + var sentAt = DateTimeOffset.UtcNow; + var message = new Message + { + ChatId = chat.Id, + Chat = chat, + SenderId = sender.Id, + Sender = sender, + Text = BuildCallHistoryText(session), + SentAt = sentAt + }; + + chat.LastActivityAt = sentAt; + dbContext.Messages.Add(message); + await dbContext.SaveChangesAsync(Context.ConnectionAborted); + await NotifyMessageCreatedAsync(chat, message); + } + + private Task NotifyMessageCreatedAsync(Chat chat, Message message) + { + var tasks = chat.Members.Select(async member => + { + var dto = message.ToDto(presenceTracker, member.UserId); + await Clients.User(member.UserId.ToString()) + .SendAsync("MessageCreated", dto, Context.ConnectionAborted); + }); + + return Task.WhenAll(tasks); + } + + private static string BuildCallHistoryText(ActiveCallSession session) + { + var callType = session.MediaType == CallMediaType.Video ? "Видеозвонок" : "Аудиозвонок"; + if (session.ConnectedAt is not null) + { + return $"{callType} завершён"; + } + + return session.EndReason switch + { + "declined" => "Вызов отклонён", + _ => $"{callType} без ответа" + }; + } + + private Task<List<PushDevice>> LoadPushDevicesAsync(Guid userId) => + dbContext.PushDevices + .Where(device => device.UserId == userId && device.NotificationsEnabled) + .ToListAsync(Context.ConnectionAborted); + + private async Task CaptureClientVersionAsync() + { + var httpContext = Context.GetHttpContext(); + if (httpContext is null) + { + return; + } + + var sessionId = Context.User!.GetRequiredSessionId(); + var session = await dbContext.UserSessions + .SingleOrDefaultAsync(x => x.Id == sessionId, Context.ConnectionAborted); + if (session is null) + { + return; + } + + if (ClientVersionRequestReader.Apply(session, ClientVersionRequestReader.Read(httpContext.Request))) + { + await dbContext.SaveChangesAsync(Context.ConnectionAborted); + } + } + + private static string GetUserGroup(Guid userId) => $"user:{userId:D}"; +} diff --git a/src/Ikar.Server/Infrastructure/PresenceTracker.cs b/src/Ikar.Server/Infrastructure/PresenceTracker.cs new file mode 100644 index 00000000..ffc2881c --- /dev/null +++ b/src/Ikar.Server/Infrastructure/PresenceTracker.cs @@ -0,0 +1,41 @@ +using System.Collections.Concurrent; + +namespace Ikar.Server.Infrastructure; + +public sealed class PresenceTracker +{ + private readonly ConcurrentDictionary<Guid, int> _connections = new(); + + public void MarkOnline(Guid userId) + { + _connections.AddOrUpdate(userId, 1, (_, current) => current + 1); + } + + public void MarkOffline(Guid userId) + { + while (true) + { + if (!_connections.TryGetValue(userId, out var current)) + { + return; + } + + if (current <= 1) + { + if (_connections.TryRemove(userId, out _)) + { + return; + } + + continue; + } + + if (_connections.TryUpdate(userId, current - 1, current)) + { + return; + } + } + } + + public bool IsOnline(Guid userId) => _connections.ContainsKey(userId); +} diff --git a/src/Ikar.Server/Infrastructure/Push/FirebasePushNotificationSender.cs b/src/Ikar.Server/Infrastructure/Push/FirebasePushNotificationSender.cs new file mode 100644 index 00000000..874e8c97 --- /dev/null +++ b/src/Ikar.Server/Infrastructure/Push/FirebasePushNotificationSender.cs @@ -0,0 +1,492 @@ +using System.Security.Cryptography; +using System.Text; +using System.Text.Json; +using System.Text.Json.Serialization; +using Microsoft.Extensions.Options; +using Ikar.Server.Data; +using Ikar.Server.Data.Entities; +using Ikar.Shared; + +namespace Ikar.Server.Infrastructure.Push; + +public sealed class FirebasePushNotificationSender( + HttpClient httpClient, + IOptions<PushOptions> options, + IHostEnvironment hostEnvironment, + IkarDbContext dbContext, + ILogger<FirebasePushNotificationSender> logger) : IPushNotificationSender +{ + private static readonly JsonSerializerOptions JsonOptions = new(JsonSerializerDefaults.Web); + private readonly PushOptions _options = options.Value; + private readonly SemaphoreSlim _tokenLock = new(1, 1); + + private OAuthTokenCache? _cachedToken; + private ServiceAccountCredentials? _cachedCredentials; + + public async Task SendMessageAsync( + Chat chat, + Message message, + IReadOnlyCollection<PushDevice> devices, + CancellationToken cancellationToken = default) + { + var androidDevices = GetAndroidDevices(devices); + + if (androidDevices.Count == 0) + { + return; + } + + var credentials = LoadCredentials(); + if (credentials is null) + { + logger.LogDebug("Firebase push is not configured. Skipping {DeviceCount} Android device(s).", androidDevices.Count); + return; + } + + var projectId = string.IsNullOrWhiteSpace(_options.FirebaseProjectId) + ? credentials.ProjectId + : _options.FirebaseProjectId.Trim(); + + if (string.IsNullOrWhiteSpace(projectId)) + { + logger.LogWarning("Push:FirebaseProjectId is empty and the service account JSON does not contain project_id."); + return; + } + + var accessToken = await GetAccessTokenAsync(credentials, cancellationToken); + var title = chat.BuildPushTitle(message); + var body = message.BuildPushBody(); + + foreach (var device in androidDevices) + { + await SendToAndroidAsync( + projectId, + accessToken, + device, + new Dictionary<string, string> + { + [PushDataKeys.Kind] = PushDataKinds.ChatMessage, + [PushDataKeys.ChatId] = message.ChatId.ToString(), + [PushDataKeys.ChatType] = chat.Type.ToString(), + [PushDataKeys.MessageId] = message.Id.ToString(), + [PushDataKeys.Title] = title, + [PushDataKeys.Body] = body, + [PushDataKeys.SenderId] = message.SenderId.ToString(), + [PushDataKeys.SenderName] = message.Sender.DisplayName, + [PushDataKeys.SenderPhoneNumber] = message.Sender.PhoneNumber ?? string.Empty + }, + cancellationToken); + } + } + + public async Task SendMessageReactionAsync( + Chat chat, + Message message, + User reactor, + string emoji, + IReadOnlyCollection<PushDevice> devices, + CancellationToken cancellationToken = default) + { + var androidDevices = GetAndroidDevices(devices); + if (androidDevices.Count == 0) + { + return; + } + + var credentials = LoadCredentials(); + if (credentials is null) + { + logger.LogDebug("Firebase push is not configured. Skipping reaction push for {DeviceCount} Android device(s).", androidDevices.Count); + return; + } + + var projectId = ResolveProjectId(credentials); + if (string.IsNullOrWhiteSpace(projectId)) + { + logger.LogWarning("Push:FirebaseProjectId is empty and the service account JSON does not contain project_id."); + return; + } + + var accessToken = await GetAccessTokenAsync(credentials, cancellationToken); + var title = BuildReactionPushTitle(chat, reactor); + var body = BuildReactionPushBody(emoji); + + foreach (var device in androidDevices) + { + await SendToAndroidAsync( + projectId, + accessToken, + device, + new Dictionary<string, string> + { + [PushDataKeys.Kind] = PushDataKinds.MessageReaction, + [PushDataKeys.ChatId] = message.ChatId.ToString(), + [PushDataKeys.ChatType] = chat.Type.ToString(), + [PushDataKeys.MessageId] = message.Id.ToString(), + [PushDataKeys.Title] = title, + [PushDataKeys.Body] = body, + [PushDataKeys.SenderId] = reactor.Id.ToString(), + [PushDataKeys.SenderName] = ResolveDisplayName(reactor), + [PushDataKeys.SenderPhoneNumber] = reactor.PhoneNumber ?? string.Empty, + [PushDataKeys.ReactionEmoji] = emoji + }, + cancellationToken); + } + } + + public async Task SendIncomingCallAsync( + IncomingCallDto call, + IReadOnlyCollection<PushDevice> devices, + CancellationToken cancellationToken = default) + { + var androidDevices = GetAndroidDevices(devices); + if (androidDevices.Count == 0) + { + return; + } + + var credentials = LoadCredentials(); + if (credentials is null) + { + logger.LogDebug("Firebase push is not configured. Skipping incoming call push for {CallId}.", call.CallId); + return; + } + + var projectId = ResolveProjectId(credentials); + if (string.IsNullOrWhiteSpace(projectId)) + { + logger.LogWarning("Push:FirebaseProjectId is empty and the service account JSON does not contain project_id."); + return; + } + + var accessToken = await GetAccessTokenAsync(credentials, cancellationToken); + var isVideoCall = call.MediaType == CallMediaType.Video; + var data = new Dictionary<string, string> + { + [PushDataKeys.Kind] = isVideoCall ? PushDataKinds.VideoCallInvite : PushDataKinds.AudioCallInvite, + [PushDataKeys.CallId] = call.CallId.ToString(), + [PushDataKeys.ChatId] = call.ChatId.ToString(), + [PushDataKeys.SenderId] = call.Caller.Id.ToString(), + [PushDataKeys.SenderName] = call.Caller.DisplayName, + [PushDataKeys.SenderPhoneNumber] = call.Caller.PhoneNumber ?? string.Empty, + [PushDataKeys.CallMediaType] = call.MediaType.ToString(), + [PushDataKeys.Title] = call.Caller.DisplayName, + [PushDataKeys.Body] = isVideoCall ? "Входящий видеозвонок" : "Входящий аудиозвонок" + }; + + foreach (var device in androidDevices) + { + await SendToAndroidAsync(projectId, accessToken, device, data, cancellationToken); + } + } + + public async Task SendCallEndedAsync( + CallEndedDto call, + IReadOnlyCollection<PushDevice> devices, + CancellationToken cancellationToken = default) + { + var androidDevices = GetAndroidDevices(devices); + if (androidDevices.Count == 0) + { + return; + } + + var credentials = LoadCredentials(); + if (credentials is null) + { + logger.LogDebug("Firebase push is not configured. Skipping call ended push for {CallId}.", call.CallId); + return; + } + + var projectId = ResolveProjectId(credentials); + if (string.IsNullOrWhiteSpace(projectId)) + { + logger.LogWarning("Push:FirebaseProjectId is empty and the service account JSON does not contain project_id."); + return; + } + + var accessToken = await GetAccessTokenAsync(credentials, cancellationToken); + var isVideoCall = call.MediaType == CallMediaType.Video; + var data = new Dictionary<string, string> + { + [PushDataKeys.Kind] = isVideoCall ? PushDataKinds.VideoCallEnded : PushDataKinds.AudioCallEnded, + [PushDataKeys.CallId] = call.CallId.ToString(), + [PushDataKeys.ChatId] = call.ChatId.ToString(), + [PushDataKeys.CallMediaType] = call.MediaType.ToString(), + [PushDataKeys.Body] = call.Reason + }; + + foreach (var device in androidDevices) + { + await SendToAndroidAsync(projectId, accessToken, device, data, cancellationToken); + } + } + + public async Task SendAppUpdateAvailableAsync( + AndroidAppReleaseDto release, + IReadOnlyCollection<PushDevice> devices, + CancellationToken cancellationToken = default) + { + var androidDevices = GetAndroidDevices(devices); + if (androidDevices.Count == 0) + { + return; + } + + var credentials = LoadCredentials(); + if (credentials is null) + { + logger.LogDebug("Firebase push is not configured. Skipping app update push for version {VersionCode}.", release.VersionCode); + return; + } + + var projectId = ResolveProjectId(credentials); + if (string.IsNullOrWhiteSpace(projectId)) + { + logger.LogWarning("Push:FirebaseProjectId is empty and the service account JSON does not contain project_id."); + return; + } + + var accessToken = await GetAccessTokenAsync(credentials, cancellationToken); + var data = new Dictionary<string, string> + { + [PushDataKeys.Kind] = PushDataKinds.AppUpdateAvailable, + [PushDataKeys.Title] = "Доступно обновление Ikar", + [PushDataKeys.Body] = $"Доступна версия {release.VersionName}", + [PushDataKeys.VersionCode] = release.VersionCode.ToString(), + [PushDataKeys.VersionName] = release.VersionName + }; + + foreach (var device in androidDevices) + { + await SendToAndroidAsync(projectId, accessToken, device, data, cancellationToken); + } + } + + private ServiceAccountCredentials? LoadCredentials() + { + if (_cachedCredentials is not null) + { + return _cachedCredentials; + } + + var json = _options.ServiceAccountJson; + if (string.IsNullOrWhiteSpace(json) && !string.IsNullOrWhiteSpace(_options.ServiceAccountJsonPath)) + { + var path = _options.ServiceAccountJsonPath; + if (!Path.IsPathRooted(path)) + { + path = Path.Combine(hostEnvironment.ContentRootPath, path); + } + + if (!File.Exists(path)) + { + logger.LogWarning("Push service account file was not found: {Path}", path); + return null; + } + + json = File.ReadAllText(path); + } + + if (string.IsNullOrWhiteSpace(json)) + { + return null; + } + + try + { + var credentials = JsonSerializer.Deserialize<ServiceAccountCredentials>(json, JsonOptions); + if (credentials is null || + string.IsNullOrWhiteSpace(credentials.ClientEmail) || + string.IsNullOrWhiteSpace(credentials.PrivateKey)) + { + logger.LogWarning("Push service account JSON is missing required fields."); + return null; + } + + _cachedCredentials = credentials; + return credentials; + } + catch (JsonException ex) + { + logger.LogWarning(ex, "Push service account JSON could not be parsed."); + return null; + } + } + + private async Task<string> GetAccessTokenAsync(ServiceAccountCredentials credentials, CancellationToken cancellationToken) + { + var now = DateTimeOffset.UtcNow; + if (_cachedToken is not null && _cachedToken.ExpiresAt > now.AddMinutes(5)) + { + return _cachedToken.AccessToken; + } + + await _tokenLock.WaitAsync(cancellationToken); + try + { + now = DateTimeOffset.UtcNow; + if (_cachedToken is not null && _cachedToken.ExpiresAt > now.AddMinutes(5)) + { + return _cachedToken.AccessToken; + } + + var assertion = CreateJwtAssertion(credentials, now); + using var request = new HttpRequestMessage(HttpMethod.Post, credentials.TokenUri ?? "https://oauth2.googleapis.com/token") + { + Content = new FormUrlEncodedContent( + [ + new KeyValuePair<string, string>("grant_type", "urn:ietf:params:oauth:grant-type:jwt-bearer"), + new KeyValuePair<string, string>("assertion", assertion) + ]) + }; + + using var response = await httpClient.SendAsync(request, cancellationToken); + var payload = await response.Content.ReadAsStringAsync(cancellationToken); + if (!response.IsSuccessStatusCode) + { + throw new InvalidOperationException( + string.IsNullOrWhiteSpace(payload) + ? $"Failed to acquire Firebase access token: {(int)response.StatusCode}." + : $"Failed to acquire Firebase access token: {payload}"); + } + + var tokenResponse = JsonSerializer.Deserialize<OAuthTokenResponse>(payload, JsonOptions) + ?? throw new InvalidOperationException("Firebase access token response was empty."); + + _cachedToken = new OAuthTokenCache( + tokenResponse.AccessToken, + now.AddSeconds(tokenResponse.ExpiresIn)); + + return _cachedToken.AccessToken; + } + finally + { + _tokenLock.Release(); + } + } + + private async Task SendToAndroidAsync( + string projectId, + string accessToken, + PushDevice device, + IReadOnlyDictionary<string, string> data, + CancellationToken cancellationToken) + { + var payload = new + { + message = new + { + token = device.DeviceToken, + data, + android = new + { + priority = "high", + ttl = "45s" + } + } + }; + + using var request = new HttpRequestMessage( + HttpMethod.Post, + $"https://fcm.googleapis.com/v1/projects/{projectId}/messages:send"); + request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", accessToken); + request.Content = new StringContent(JsonSerializer.Serialize(payload, JsonOptions), Encoding.UTF8, "application/json"); + + using var response = await httpClient.SendAsync(request, cancellationToken); + if (response.IsSuccessStatusCode) + { + return; + } + + var responseBody = await response.Content.ReadAsStringAsync(cancellationToken); + logger.LogWarning( + "Push send failed for installation {InstallationId} with status {StatusCode}. Response: {ResponseBody}", + device.InstallationId, + (int)response.StatusCode, + responseBody); + + if (!ShouldDeleteDevice(responseBody)) + { + return; + } + + dbContext.PushDevices.Remove(device); + await dbContext.SaveChangesAsync(cancellationToken); + } + + private static bool ShouldDeleteDevice(string? responseBody) => + !string.IsNullOrWhiteSpace(responseBody) && + (responseBody.Contains("UNREGISTERED", StringComparison.OrdinalIgnoreCase) || + responseBody.Contains("registration-token-not-registered", StringComparison.OrdinalIgnoreCase)); + + private static List<PushDevice> GetAndroidDevices(IReadOnlyCollection<PushDevice> devices) => + devices + .Where(x => x.Platform == PushPlatform.Android && !string.IsNullOrWhiteSpace(x.DeviceToken)) + .ToList(); + + private string ResolveProjectId(ServiceAccountCredentials credentials) => + string.IsNullOrWhiteSpace(_options.FirebaseProjectId) + ? credentials.ProjectId + : _options.FirebaseProjectId.Trim(); + + private static string BuildReactionPushTitle(Chat chat, User reactor) + { + var reactorName = ResolveDisplayName(reactor); + return chat.Type switch + { + ChatType.Direct => reactorName, + _ => string.IsNullOrWhiteSpace(chat.Title) ? reactorName : chat.Title! + }; + } + + private static string BuildReactionPushBody(string emoji) => + string.IsNullOrWhiteSpace(emoji) + ? "\u041d\u043e\u0432\u0430\u044f \u0440\u0435\u0430\u043a\u0446\u0438\u044f \u043d\u0430 \u0432\u0430\u0448\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435" + : $"\u0420\u0435\u0430\u043a\u0446\u0438\u044f {emoji} \u043d\u0430 \u0432\u0430\u0448\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435"; + + private static string ResolveDisplayName(User user) => + string.IsNullOrWhiteSpace(user.DisplayName) + ? user.Username + : user.DisplayName; + + private static string CreateJwtAssertion(ServiceAccountCredentials credentials, DateTimeOffset now) + { + var header = Base64UrlEncode("""{"alg":"RS256","typ":"JWT"}"""); + var payload = Base64UrlEncode(JsonSerializer.Serialize(new Dictionary<string, object> + { + ["iss"] = credentials.ClientEmail, + ["scope"] = "https://www.googleapis.com/auth/firebase.messaging", + ["aud"] = credentials.TokenUri ?? "https://oauth2.googleapis.com/token", + ["iat"] = now.ToUnixTimeSeconds(), + ["exp"] = now.AddHours(1).ToUnixTimeSeconds() + })); + + var unsignedToken = $"{header}.{payload}"; + using var rsa = RSA.Create(); + rsa.ImportFromPem(credentials.PrivateKey); + var signatureBytes = rsa.SignData(Encoding.UTF8.GetBytes(unsignedToken), HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1); + return $"{unsignedToken}.{Base64UrlEncode(signatureBytes)}"; + } + + private static string Base64UrlEncode(string value) => + Base64UrlEncode(Encoding.UTF8.GetBytes(value)); + + private static string Base64UrlEncode(byte[] value) => + Convert.ToBase64String(value) + .TrimEnd('=') + .Replace('+', '-') + .Replace('/', '_'); + + private sealed record OAuthTokenCache(string AccessToken, DateTimeOffset ExpiresAt); + + private sealed record OAuthTokenResponse( + [property: JsonPropertyName("access_token")] string AccessToken, + [property: JsonPropertyName("expires_in")] int ExpiresIn); + + private sealed record ServiceAccountCredentials( + [property: JsonPropertyName("project_id")] string ProjectId, + [property: JsonPropertyName("client_email")] string ClientEmail, + [property: JsonPropertyName("private_key")] string PrivateKey, + [property: JsonPropertyName("token_uri")] string? TokenUri); +} diff --git a/src/Ikar.Server/Infrastructure/Push/IPushNotificationSender.cs b/src/Ikar.Server/Infrastructure/Push/IPushNotificationSender.cs new file mode 100644 index 00000000..c0926d76 --- /dev/null +++ b/src/Ikar.Server/Infrastructure/Push/IPushNotificationSender.cs @@ -0,0 +1,36 @@ +using Ikar.Server.Data.Entities; +using Ikar.Shared; + +namespace Ikar.Server.Infrastructure.Push; + +public interface IPushNotificationSender +{ + Task SendMessageAsync( + Chat chat, + Message message, + IReadOnlyCollection<PushDevice> devices, + CancellationToken cancellationToken = default); + + Task SendMessageReactionAsync( + Chat chat, + Message message, + User reactor, + string emoji, + IReadOnlyCollection<PushDevice> devices, + CancellationToken cancellationToken = default); + + Task SendIncomingCallAsync( + IncomingCallDto call, + IReadOnlyCollection<PushDevice> devices, + CancellationToken cancellationToken = default); + + Task SendCallEndedAsync( + CallEndedDto call, + IReadOnlyCollection<PushDevice> devices, + CancellationToken cancellationToken = default); + + Task SendAppUpdateAvailableAsync( + AndroidAppReleaseDto release, + IReadOnlyCollection<PushDevice> devices, + CancellationToken cancellationToken = default); +} diff --git a/src/Ikar.Server/Infrastructure/Push/PushDispatchBackgroundService.cs b/src/Ikar.Server/Infrastructure/Push/PushDispatchBackgroundService.cs new file mode 100644 index 00000000..9c3b71fd --- /dev/null +++ b/src/Ikar.Server/Infrastructure/Push/PushDispatchBackgroundService.cs @@ -0,0 +1,97 @@ +using Microsoft.EntityFrameworkCore; +using Ikar.Server.Data; + +namespace Ikar.Server.Infrastructure.Push; + +public sealed class PushDispatchBackgroundService( + IServiceScopeFactory serviceScopeFactory, + PushDispatchQueue queue, + ILogger<PushDispatchBackgroundService> logger) : BackgroundService +{ + protected override async Task ExecuteAsync(CancellationToken stoppingToken) + { + await foreach (var workItem in queue.ReadAllAsync(stoppingToken)) + { + try + { + await ProcessAsync(workItem, stoppingToken); + } + catch (OperationCanceledException) when (stoppingToken.IsCancellationRequested) + { + break; + } + catch (Exception ex) + { + logger.LogWarning( + ex, + "Background push dispatch failed for chat {ChatId}, message {MessageId}, kind {Kind}.", + workItem.ChatId, + workItem.MessageId, + workItem.Kind); + } + } + } + + private async Task ProcessAsync(PushDispatchWorkItem workItem, CancellationToken cancellationToken) + { + await using var scope = serviceScopeFactory.CreateAsyncScope(); + var dbContext = scope.ServiceProvider.GetRequiredService<IkarDbContext>(); + var dispatcher = scope.ServiceProvider.GetRequiredService<PushNotificationDispatcher>(); + + var chat = await dbContext.Chats + .Include(x => x.Members) + .SingleOrDefaultAsync(x => x.Id == workItem.ChatId, cancellationToken); + if (chat is null) + { + logger.LogDebug("Skipping push dispatch because chat {ChatId} was not found.", workItem.ChatId); + return; + } + + var message = await dbContext.Messages + .Include(x => x.Sender) + .Include(x => x.Attachments) + .SingleOrDefaultAsync( + x => x.Id == workItem.MessageId && + x.ChatId == workItem.ChatId, + cancellationToken); + if (message is null) + { + logger.LogDebug( + "Skipping push dispatch because message {MessageId} for chat {ChatId} was not found.", + workItem.MessageId, + workItem.ChatId); + return; + } + + if (workItem.Kind == PushDispatchKind.MessageReaction) + { + if (workItem.ActorUserId is null || string.IsNullOrWhiteSpace(workItem.ReactionEmoji)) + { + logger.LogDebug( + "Skipping reaction push dispatch for message {MessageId} because actor or emoji is missing.", + workItem.MessageId); + return; + } + + var reactor = await dbContext.Users + .SingleOrDefaultAsync(x => x.Id == workItem.ActorUserId.Value, cancellationToken); + if (reactor is null) + { + logger.LogDebug( + "Skipping reaction push dispatch because reactor {UserId} was not found.", + workItem.ActorUserId.Value); + return; + } + + await dispatcher.DispatchMessageReactionAsync( + chat, + message, + reactor, + workItem.ReactionEmoji, + cancellationToken); + return; + } + + await dispatcher.DispatchMessageAsync(chat, message, cancellationToken); + } +} diff --git a/src/Ikar.Server/Infrastructure/Push/PushDispatchQueue.cs b/src/Ikar.Server/Infrastructure/Push/PushDispatchQueue.cs new file mode 100644 index 00000000..1dc286ec --- /dev/null +++ b/src/Ikar.Server/Infrastructure/Push/PushDispatchQueue.cs @@ -0,0 +1,47 @@ +using System.Threading.Channels; + +namespace Ikar.Server.Infrastructure.Push; + +public enum PushDispatchKind +{ + ChatMessage = 0, + MessageReaction = 1 +} + +public sealed record PushDispatchWorkItem( + Guid ChatId, + Guid MessageId, + PushDispatchKind Kind = PushDispatchKind.ChatMessage, + Guid? ActorUserId = null, + string? ReactionEmoji = null); + +public sealed class PushDispatchQueue +{ + private readonly Channel<PushDispatchWorkItem> _channel = Channel.CreateUnbounded<PushDispatchWorkItem>( + new UnboundedChannelOptions + { + SingleReader = true, + SingleWriter = false + }); + + public ValueTask EnqueueAsync(Guid chatId, Guid messageId, CancellationToken cancellationToken = default) => + _channel.Writer.WriteAsync(new PushDispatchWorkItem(chatId, messageId), cancellationToken); + + public ValueTask EnqueueReactionAsync( + Guid chatId, + Guid messageId, + Guid reactorUserId, + string emoji, + CancellationToken cancellationToken = default) => + _channel.Writer.WriteAsync( + new PushDispatchWorkItem( + chatId, + messageId, + PushDispatchKind.MessageReaction, + reactorUserId, + emoji), + cancellationToken); + + public IAsyncEnumerable<PushDispatchWorkItem> ReadAllAsync(CancellationToken cancellationToken) => + _channel.Reader.ReadAllAsync(cancellationToken); +} diff --git a/src/Ikar.Server/Infrastructure/Push/PushNotificationDispatcher.cs b/src/Ikar.Server/Infrastructure/Push/PushNotificationDispatcher.cs new file mode 100644 index 00000000..15dc7eaa --- /dev/null +++ b/src/Ikar.Server/Infrastructure/Push/PushNotificationDispatcher.cs @@ -0,0 +1,83 @@ +using Microsoft.EntityFrameworkCore; +using Ikar.Server.Data; +using Ikar.Server.Data.Entities; + +namespace Ikar.Server.Infrastructure.Push; + +public sealed class PushNotificationDispatcher( + IkarDbContext dbContext, + IPushNotificationSender pushNotificationSender, + ILogger<PushNotificationDispatcher> logger) +{ + public async Task DispatchMessageAsync(Chat chat, Message message, CancellationToken cancellationToken = default) + { + var recipientIds = chat.Members + .Select(x => x.UserId) + .Where(x => x != message.SenderId) + .Distinct() + .ToList(); + + if (recipientIds.Count == 0) + { + return; + } + + var devices = await dbContext.PushDevices + .Where(x => recipientIds.Contains(x.UserId) && x.NotificationsEnabled) + .ToListAsync(cancellationToken); + + if (devices.Count == 0) + { + return; + } + + try + { + await pushNotificationSender.SendMessageAsync(chat, message, devices, cancellationToken); + } + catch (Exception ex) + { + logger.LogWarning(ex, "Push dispatch failed for message {MessageId}.", message.Id); + } + } + + public async Task DispatchMessageReactionAsync( + Chat chat, + Message message, + User reactor, + string emoji, + CancellationToken cancellationToken = default) + { + if (message.SenderId == reactor.Id || string.IsNullOrWhiteSpace(emoji)) + { + return; + } + + var devices = await dbContext.PushDevices + .Where(x => x.UserId == message.SenderId && x.NotificationsEnabled) + .ToListAsync(cancellationToken); + + if (devices.Count == 0) + { + return; + } + + try + { + await pushNotificationSender.SendMessageReactionAsync( + chat, + message, + reactor, + emoji, + devices, + cancellationToken); + } + catch (Exception ex) + { + logger.LogWarning( + ex, + "Push dispatch failed for reaction to message {MessageId}.", + message.Id); + } + } +} diff --git a/src/Ikar.Server/Infrastructure/Push/PushOptions.cs b/src/Ikar.Server/Infrastructure/Push/PushOptions.cs new file mode 100644 index 00000000..7eb25565 --- /dev/null +++ b/src/Ikar.Server/Infrastructure/Push/PushOptions.cs @@ -0,0 +1,12 @@ +namespace Ikar.Server.Infrastructure.Push; + +public sealed class PushOptions +{ + public const string SectionName = "Push"; + + public string FirebaseProjectId { get; set; } = string.Empty; + + public string ServiceAccountJsonPath { get; set; } = string.Empty; + + public string ServiceAccountJson { get; set; } = string.Empty; +} diff --git a/src/Ikar.Server/Infrastructure/Storage/AttachmentStorageService.cs b/src/Ikar.Server/Infrastructure/Storage/AttachmentStorageService.cs new file mode 100644 index 00000000..28931b92 --- /dev/null +++ b/src/Ikar.Server/Infrastructure/Storage/AttachmentStorageService.cs @@ -0,0 +1,128 @@ +using Ikar.Server.Data.Entities; + +namespace Ikar.Server.Infrastructure.Storage; + +public sealed class AttachmentStorageService(IWebHostEnvironment environment) +{ + private readonly string _rootPath = Path.Combine(environment.ContentRootPath, "Data", "Attachments"); + + public async Task<MessageAttachment> SaveAsync( + Guid messageId, + IFormFile file, + CancellationToken cancellationToken, + int sortOrder = 0) + { + if (file.Length <= 0) + { + throw new InvalidOperationException("Attachment is empty."); + } + + var (attachmentId, physicalPath) = CreateTargetPath(file.FileName); + + await using (var source = file.OpenReadStream()) + await using (var target = File.Create(physicalPath)) + { + await source.CopyToAsync(target, cancellationToken); + } + + return new MessageAttachment + { + Id = attachmentId, + MessageId = messageId, + OriginalFileName = string.IsNullOrWhiteSpace(file.FileName) ? "attachment" : Path.GetFileName(file.FileName), + ContentType = string.IsNullOrWhiteSpace(file.ContentType) ? "application/octet-stream" : file.ContentType, + FileSizeBytes = file.Length, + StoragePath = physicalPath, + SortOrder = sortOrder, + UploadedAt = DateTimeOffset.UtcNow + }; + } + + public async Task<StoryAttachment> SaveStoryAsync( + Guid storyId, + IFormFile file, + CancellationToken cancellationToken, + int sortOrder = 0) + { + if (file.Length <= 0) + { + throw new InvalidOperationException("Attachment is empty."); + } + + var (attachmentId, physicalPath) = CreateTargetPath(file.FileName); + + await using (var source = file.OpenReadStream()) + await using (var target = File.Create(physicalPath)) + { + await source.CopyToAsync(target, cancellationToken); + } + + return new StoryAttachment + { + Id = attachmentId, + StoryId = storyId, + OriginalFileName = string.IsNullOrWhiteSpace(file.FileName) ? "story-attachment" : Path.GetFileName(file.FileName), + ContentType = string.IsNullOrWhiteSpace(file.ContentType) ? "application/octet-stream" : file.ContentType, + FileSizeBytes = file.Length, + StoragePath = physicalPath, + SortOrder = sortOrder, + UploadedAt = DateTimeOffset.UtcNow + }; + } + + public async Task<MessageAttachment> CloneAsync( + Guid messageId, + MessageAttachment sourceAttachment, + CancellationToken cancellationToken, + int? sortOrder = null) + { + if (string.IsNullOrWhiteSpace(sourceAttachment.StoragePath) || !File.Exists(sourceAttachment.StoragePath)) + { + throw new FileNotFoundException("Source attachment file was not found.", sourceAttachment.StoragePath); + } + + var (attachmentId, physicalPath) = CreateTargetPath(sourceAttachment.OriginalFileName); + + await using (var source = File.OpenRead(sourceAttachment.StoragePath)) + await using (var target = File.Create(physicalPath)) + { + await source.CopyToAsync(target, cancellationToken); + } + + return new MessageAttachment + { + Id = attachmentId, + MessageId = messageId, + OriginalFileName = sourceAttachment.OriginalFileName, + ContentType = sourceAttachment.ContentType, + FileSizeBytes = sourceAttachment.FileSizeBytes, + StoragePath = physicalPath, + SortOrder = sortOrder ?? sourceAttachment.SortOrder, + UploadedAt = DateTimeOffset.UtcNow + }; + } + + public void DeleteIfExists(string? physicalPath) + { + if (!string.IsNullOrWhiteSpace(physicalPath) && File.Exists(physicalPath)) + { + File.Delete(physicalPath); + } + } + + private (Guid AttachmentId, string PhysicalPath) CreateTargetPath(string? originalFileName) + { + Directory.CreateDirectory(_rootPath); + + var attachmentId = Guid.NewGuid(); + var extension = Path.GetExtension(originalFileName); + var year = DateTime.UtcNow.ToString("yyyy"); + var month = DateTime.UtcNow.ToString("MM"); + var targetDirectory = Path.Combine(_rootPath, year, month); + Directory.CreateDirectory(targetDirectory); + + var storedFileName = $"{attachmentId:N}{extension}"; + var physicalPath = Path.Combine(targetDirectory, storedFileName); + return (attachmentId, physicalPath); + } +} diff --git a/src/Ikar.Server/Infrastructure/Storage/AvatarStorageService.cs b/src/Ikar.Server/Infrastructure/Storage/AvatarStorageService.cs new file mode 100644 index 00000000..70f2855a --- /dev/null +++ b/src/Ikar.Server/Infrastructure/Storage/AvatarStorageService.cs @@ -0,0 +1,59 @@ +namespace Ikar.Server.Infrastructure.Storage; + +public sealed record AvatarStorageResult(string PhysicalPath, string ContentType); + +public sealed class AvatarStorageService(IWebHostEnvironment environment) +{ + private readonly string _rootPath = Path.Combine(environment.ContentRootPath, "Data", "Avatars"); + + public async Task<AvatarStorageResult> SaveAsync(Guid userId, IFormFile file, CancellationToken cancellationToken) + { + if (file.Length <= 0) + { + throw new InvalidOperationException("Avatar file is empty."); + } + + Directory.CreateDirectory(_rootPath); + + var extension = Path.GetExtension(file.FileName); + var safeExtension = string.IsNullOrWhiteSpace(extension) ? ".bin" : extension; + var targetDirectory = Path.Combine(_rootPath, userId.ToString("N")); + Directory.CreateDirectory(targetDirectory); + + var storedFileName = $"{Guid.NewGuid():N}{safeExtension}"; + var physicalPath = Path.Combine(targetDirectory, storedFileName); + + await using (var source = file.OpenReadStream()) + await using (var target = File.Create(physicalPath)) + { + await source.CopyToAsync(target, cancellationToken); + } + + var contentType = ResolveContentType(file.ContentType, safeExtension); + + return new AvatarStorageResult(physicalPath, contentType); + } + + public void DeleteIfExists(string? physicalPath) + { + if (!string.IsNullOrWhiteSpace(physicalPath) && File.Exists(physicalPath)) + { + File.Delete(physicalPath); + } + } + + private static string ResolveContentType(string? uploadedContentType, string extension) => + string.IsNullOrWhiteSpace(uploadedContentType) + ? extension.ToLowerInvariant() switch + { + ".gif" => "image/gif", + ".heic" => "image/heic", + ".heif" => "image/heif", + ".jpeg" => "image/jpeg", + ".jpg" => "image/jpeg", + ".png" => "image/png", + ".webp" => "image/webp", + _ => "application/octet-stream" + } + : uploadedContentType; +} diff --git a/src/Ikar.Server/Infrastructure/Storage/DatabaseSchemaBootstrapper.cs b/src/Ikar.Server/Infrastructure/Storage/DatabaseSchemaBootstrapper.cs new file mode 100644 index 00000000..56f8e616 --- /dev/null +++ b/src/Ikar.Server/Infrastructure/Storage/DatabaseSchemaBootstrapper.cs @@ -0,0 +1,704 @@ +using System.Data; +using Microsoft.EntityFrameworkCore; +using Ikar.Server.Data; + +namespace Ikar.Server.Infrastructure.Storage; + +public sealed class DatabaseSchemaBootstrapper(IkarDbContext dbContext) +{ + public async Task EnsureLatestAsync(CancellationToken cancellationToken = default) + { + await EnableWriteAheadLoggingAsync(cancellationToken); + await EnsureMessageAttachmentsTableAsync(cancellationToken); + await EnsurePushDevicesTableAsync(cancellationToken); + await EnsureUserPrivacySettingsTableAsync(cancellationToken); + await EnsureChatInviteLinksTableAsync(cancellationToken); + await EnsureChatJoinRequestsTableAsync(cancellationToken); + await EnsureChatTopicsTableAsync(cancellationToken); + await EnsureBotsTableAsync(cancellationToken); + await EnsureBotCommandsTableAsync(cancellationToken); + await EnsureBotUpdatesTableAsync(cancellationToken); + await EnsureModerationLogEntriesTableAsync(cancellationToken); + await EnsureStoriesTablesAsync(cancellationToken); + await EnsureMessageReactionsTableAsync(cancellationToken); + await EnsureMessageViewsTableAsync(cancellationToken); + await EnsureAndroidUpdateCompatibilityHitsTableAsync(cancellationToken); + await EnsureChatMembersIndexesAsync(cancellationToken); + await EnsureColumnAsync("ChatMembers", "LastDeliveredAt", "TEXT NULL", cancellationToken); + await EnsureColumnAsync("ChatMembers", "LastReadAt", "TEXT NULL", cancellationToken); + await EnsureColumnAsync("ChatMembers", "Role", "INTEGER NOT NULL DEFAULT 0", cancellationToken); + await EnsureColumnAsync("ChatMembers", "CanPinMessages", "INTEGER NOT NULL DEFAULT 1", cancellationToken); + await EnsureColumnAsync("ChatMembers", "CanDeleteMessages", "INTEGER NOT NULL DEFAULT 0", cancellationToken); + await EnsureColumnAsync("ChatMembers", "CanInviteUsers", "INTEGER NOT NULL DEFAULT 1", cancellationToken); + await EnsureColumnAsync("ChatMembers", "CanPostMessages", "INTEGER NOT NULL DEFAULT 1", cancellationToken); + await EnsureColumnAsync("ChatMembers", "IsArchived", "INTEGER NOT NULL DEFAULT 0", cancellationToken); + await EnsureColumnAsync("ChatMembers", "IsPinned", "INTEGER NOT NULL DEFAULT 0", cancellationToken); + await EnsureColumnAsync("ChatMembers", "MutedUntil", "TEXT NULL", cancellationToken); + await EnsureColumnAsync("ChatMembers", "FolderKey", "TEXT NULL", cancellationToken); + await EnsureColumnAsync("UserSessions", "ClientPlatform", "TEXT NULL", cancellationToken); + await EnsureColumnAsync("UserSessions", "ClientVersionCode", "INTEGER NULL", cancellationToken); + await EnsureColumnAsync("UserSessions", "ClientVersionName", "TEXT NULL", cancellationToken); + await EnsureColumnAsync("PushDevices", "ClientPlatform", "TEXT NULL", cancellationToken); + await EnsureColumnAsync("PushDevices", "ClientVersionCode", "INTEGER NULL", cancellationToken); + await EnsureColumnAsync("PushDevices", "ClientVersionName", "TEXT NULL", cancellationToken); + await EnsureColumnAsync("Chats", "Description", "TEXT NULL", cancellationToken); + await EnsureColumnAsync("Chats", "PublicUsername", "TEXT NULL", cancellationToken); + await EnsureColumnAsync("Chats", "LinkedDiscussionChatId", "TEXT NULL", cancellationToken); + await EnsureColumnAsync("Chats", "ChannelSignaturesEnabled", "INTEGER NOT NULL DEFAULT 0", cancellationToken); + await EnsureColumnAsync("Chats", "TopicsEnabled", "INTEGER NOT NULL DEFAULT 0", cancellationToken); + await EnsureColumnAsync("Chats", "HasProtectedContent", "INTEGER NOT NULL DEFAULT 0", cancellationToken); + await EnsureColumnAsync("Chats", "DefaultMessageTtlSeconds", "INTEGER NULL", cancellationToken); + await EnsureColumnAsync("Messages", "EditedAt", "TEXT NULL", cancellationToken); + await EnsureColumnAsync("Messages", "DeletedAt", "TEXT NULL", cancellationToken); + await EnsureColumnAsync("Messages", "ForwardedFromDisplayName", "TEXT NULL", cancellationToken); + await EnsureColumnAsync("Messages", "ReplyToMessageId", "TEXT NULL", cancellationToken); + await EnsureColumnAsync("Messages", "PinnedAt", "TEXT NULL", cancellationToken); + await EnsureColumnAsync("Messages", "PinnedByUserId", "TEXT NULL", cancellationToken); + await EnsureColumnAsync("Messages", "MediaAlbumId", "TEXT NULL", cancellationToken); + await EnsureColumnAsync("Messages", "TopicId", "TEXT NULL", cancellationToken); + await EnsureColumnAsync("Messages", "HasProtectedContent", "INTEGER NOT NULL DEFAULT 0", cancellationToken); + await EnsureColumnAsync("Messages", "ExpiresAt", "TEXT NULL", cancellationToken); + await EnsureColumnAsync("Messages", "TtlSeconds", "INTEGER NULL", cancellationToken); + await EnsureColumnAsync("Messages", "PostedAsChannel", "INTEGER NOT NULL DEFAULT 0", cancellationToken); + await EnsureColumnAsync("Messages", "AuthorSignature", "TEXT NULL", cancellationToken); + await EnsureLegacyChannelPostsMarkedAsync(cancellationToken); + await EnsureColumnAsync("MessageAttachments", "SortOrder", "INTEGER NOT NULL DEFAULT 0", cancellationToken); + await EnsureMessagesPinnedIndexAsync(cancellationToken); + await EnsureMessagesChatSenderSentAtIndexAsync(cancellationToken); + await EnsureMessagesAlbumIndexAsync(cancellationToken); + await EnsureMessagesTopicIndexAsync(cancellationToken); + await EnsureChatsPublicUsernameIndexAsync(cancellationToken); + await EnsureChatsLinkedDiscussionIndexAsync(cancellationToken); + await EnsureMessageAttachmentsSortIndexAsync(cancellationToken); + await EnsureChatMemberStateIndexesAsync(cancellationToken); + await EnsureColumnAsync("Users", "IsBlocked", "INTEGER NOT NULL DEFAULT 0", cancellationToken); + await EnsureColumnAsync("Users", "BlockedAt", "TEXT NULL", cancellationToken); + await EnsureColumnAsync("Users", "PhoneNumber", "TEXT NULL", cancellationToken); + await EnsureColumnAsync("Users", "NormalizedPhoneNumber", "TEXT NULL", cancellationToken); + await EnsureColumnAsync("Users", "About", "TEXT NULL", cancellationToken); + await EnsureColumnAsync("Users", "AvatarStoragePath", "TEXT NULL", cancellationToken); + await EnsureColumnAsync("Users", "AvatarContentType", "TEXT NULL", cancellationToken); + await EnsureColumnAsync("Users", "IsBot", "INTEGER NOT NULL DEFAULT 0", cancellationToken); + await EnsureColumnAsync("UserPrivacySettings", "BlockedUserIds", "TEXT NOT NULL DEFAULT ''", cancellationToken); + await EnsureColumnAsync("UserPrivacySettings", "AlwaysAllowUserIds", "TEXT NOT NULL DEFAULT ''", cancellationToken); + await EnsureColumnAsync("UserPrivacySettings", "NeverAllowUserIds", "TEXT NOT NULL DEFAULT ''", cancellationToken); + await EnsureMessagesExpiresAtIndexAsync(cancellationToken); + await EnsureUsersPhoneIndexAsync(cancellationToken); + } + + private async Task EnableWriteAheadLoggingAsync(CancellationToken cancellationToken) + { + await dbContext.Database.ExecuteSqlRawAsync("PRAGMA journal_mode = WAL;", cancellationToken); + } + + private async Task EnsureMessageAttachmentsTableAsync(CancellationToken cancellationToken) + { + await dbContext.Database.ExecuteSqlRawAsync( + """ + CREATE TABLE IF NOT EXISTS "MessageAttachments" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_MessageAttachments" PRIMARY KEY, + "MessageId" TEXT NOT NULL, + "OriginalFileName" TEXT NOT NULL, + "ContentType" TEXT NOT NULL, + "FileSizeBytes" INTEGER NOT NULL, + "StoragePath" TEXT NOT NULL, + "UploadedAt" TEXT NOT NULL, + CONSTRAINT "FK_MessageAttachments_Messages_MessageId" FOREIGN KEY ("MessageId") REFERENCES "Messages" ("Id") ON DELETE CASCADE + ); + """, + cancellationToken); + + await dbContext.Database.ExecuteSqlRawAsync( + """ + CREATE INDEX IF NOT EXISTS "IX_MessageAttachments_MessageId" ON "MessageAttachments" ("MessageId"); + """, + cancellationToken); + } + + private async Task EnsurePushDevicesTableAsync(CancellationToken cancellationToken) + { + await dbContext.Database.ExecuteSqlRawAsync( + """ + CREATE TABLE IF NOT EXISTS "PushDevices" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_PushDevices" PRIMARY KEY, + "UserId" TEXT NOT NULL, + "Platform" INTEGER NOT NULL, + "InstallationId" TEXT NOT NULL, + "DeviceToken" TEXT NOT NULL, + "DeviceName" TEXT NULL, + "NotificationsEnabled" INTEGER NOT NULL, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + CONSTRAINT "FK_PushDevices_Users_UserId" FOREIGN KEY ("UserId") REFERENCES "Users" ("Id") ON DELETE CASCADE + ); + """, + cancellationToken); + + await dbContext.Database.ExecuteSqlRawAsync( + """ + CREATE UNIQUE INDEX IF NOT EXISTS "IX_PushDevices_InstallationId" ON "PushDevices" ("InstallationId"); + """, + cancellationToken); + + await dbContext.Database.ExecuteSqlRawAsync( + """ + CREATE INDEX IF NOT EXISTS "IX_PushDevices_UserId" ON "PushDevices" ("UserId"); + """, + cancellationToken); + } + + private async Task EnsureBotsTableAsync(CancellationToken cancellationToken) + { + await dbContext.Database.ExecuteSqlRawAsync( + """ + CREATE TABLE IF NOT EXISTS "Bots" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Bots" PRIMARY KEY, + "UserId" TEXT NOT NULL, + "OwnerUserId" TEXT NOT NULL, + "TokenHash" TEXT NOT NULL, + "IsEnabled" INTEGER NOT NULL DEFAULT 1, + "CreatedAt" TEXT NOT NULL, + "UpdatedAt" TEXT NOT NULL, + CONSTRAINT "FK_Bots_Users_UserId" FOREIGN KEY ("UserId") REFERENCES "Users" ("Id") ON DELETE CASCADE, + CONSTRAINT "FK_Bots_Users_OwnerUserId" FOREIGN KEY ("OwnerUserId") REFERENCES "Users" ("Id") ON DELETE RESTRICT + ); + """, + cancellationToken); + + await dbContext.Database.ExecuteSqlRawAsync( + """ + CREATE UNIQUE INDEX IF NOT EXISTS "IX_Bots_UserId" ON "Bots" ("UserId"); + """, + cancellationToken); + + await dbContext.Database.ExecuteSqlRawAsync( + """ + CREATE UNIQUE INDEX IF NOT EXISTS "IX_Bots_TokenHash" ON "Bots" ("TokenHash"); + """, + cancellationToken); + + await dbContext.Database.ExecuteSqlRawAsync( + """ + CREATE INDEX IF NOT EXISTS "IX_Bots_OwnerUserId" ON "Bots" ("OwnerUserId"); + """, + cancellationToken); + } + + private async Task EnsureBotCommandsTableAsync(CancellationToken cancellationToken) + { + await dbContext.Database.ExecuteSqlRawAsync( + """ + CREATE TABLE IF NOT EXISTS "BotCommands" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_BotCommands" PRIMARY KEY, + "BotId" TEXT NOT NULL, + "Command" TEXT NOT NULL, + "Description" TEXT NOT NULL, + "SortOrder" INTEGER NOT NULL, + CONSTRAINT "FK_BotCommands_Bots_BotId" FOREIGN KEY ("BotId") REFERENCES "Bots" ("Id") ON DELETE CASCADE + ); + """, + cancellationToken); + + await dbContext.Database.ExecuteSqlRawAsync( + """ + CREATE UNIQUE INDEX IF NOT EXISTS "IX_BotCommands_BotId_Command" ON "BotCommands" ("BotId", "Command"); + """, + cancellationToken); + } + + private async Task EnsureBotUpdatesTableAsync(CancellationToken cancellationToken) + { + await dbContext.Database.ExecuteSqlRawAsync( + """ + CREATE TABLE IF NOT EXISTS "BotUpdates" ( + "Id" INTEGER NOT NULL CONSTRAINT "PK_BotUpdates" PRIMARY KEY AUTOINCREMENT, + "BotId" TEXT NOT NULL, + "ChatId" TEXT NOT NULL, + "MessageId" TEXT NOT NULL, + "CreatedAt" TEXT NOT NULL, + CONSTRAINT "FK_BotUpdates_Bots_BotId" FOREIGN KEY ("BotId") REFERENCES "Bots" ("Id") ON DELETE CASCADE, + CONSTRAINT "FK_BotUpdates_Messages_MessageId" FOREIGN KEY ("MessageId") REFERENCES "Messages" ("Id") ON DELETE CASCADE + ); + """, + cancellationToken); + + await dbContext.Database.ExecuteSqlRawAsync( + """ + CREATE INDEX IF NOT EXISTS "IX_BotUpdates_BotId_Id" ON "BotUpdates" ("BotId", "Id"); + """, + cancellationToken); + + await dbContext.Database.ExecuteSqlRawAsync( + """ + CREATE UNIQUE INDEX IF NOT EXISTS "IX_BotUpdates_BotId_MessageId" ON "BotUpdates" ("BotId", "MessageId"); + """, + cancellationToken); + } + + private async Task EnsureModerationLogEntriesTableAsync(CancellationToken cancellationToken) + { + await dbContext.Database.ExecuteSqlRawAsync( + """ + CREATE TABLE IF NOT EXISTS "ModerationLogEntries" ( + "Id" INTEGER NOT NULL CONSTRAINT "PK_ModerationLogEntries" PRIMARY KEY AUTOINCREMENT, + "ChatId" TEXT NULL, + "ActorUserId" TEXT NOT NULL, + "TargetType" INTEGER NOT NULL, + "TargetId" TEXT NULL, + "Action" TEXT NOT NULL, + "Reason" TEXT NULL, + "CreatedAt" TEXT NOT NULL, + CONSTRAINT "FK_ModerationLogEntries_Chats_ChatId" FOREIGN KEY ("ChatId") REFERENCES "Chats" ("Id") ON DELETE SET NULL, + CONSTRAINT "FK_ModerationLogEntries_Users_ActorUserId" FOREIGN KEY ("ActorUserId") REFERENCES "Users" ("Id") ON DELETE RESTRICT + ); + """, + cancellationToken); + + await dbContext.Database.ExecuteSqlRawAsync( + """ + CREATE INDEX IF NOT EXISTS "IX_ModerationLogEntries_ChatId_CreatedAt" ON "ModerationLogEntries" ("ChatId", "CreatedAt"); + """, + cancellationToken); + + await dbContext.Database.ExecuteSqlRawAsync( + """ + CREATE INDEX IF NOT EXISTS "IX_ModerationLogEntries_TargetType_TargetId" ON "ModerationLogEntries" ("TargetType", "TargetId"); + """, + cancellationToken); + } + + private async Task EnsureStoriesTablesAsync(CancellationToken cancellationToken) + { + await dbContext.Database.ExecuteSqlRawAsync( + """ + CREATE TABLE IF NOT EXISTS "Stories" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_Stories" PRIMARY KEY, + "AuthorUserId" TEXT NOT NULL, + "Text" TEXT NOT NULL, + "Visibility" INTEGER NOT NULL DEFAULT 0, + "HasProtectedContent" INTEGER NOT NULL DEFAULT 0, + "CreatedAt" TEXT NOT NULL, + "ExpiresAt" TEXT NOT NULL, + "DeletedAt" TEXT NULL, + CONSTRAINT "FK_Stories_Users_AuthorUserId" FOREIGN KEY ("AuthorUserId") REFERENCES "Users" ("Id") ON DELETE CASCADE + ); + """, + cancellationToken); + + await dbContext.Database.ExecuteSqlRawAsync( + """ + CREATE TABLE IF NOT EXISTS "StoryAttachments" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_StoryAttachments" PRIMARY KEY, + "StoryId" TEXT NOT NULL, + "OriginalFileName" TEXT NOT NULL, + "ContentType" TEXT NOT NULL, + "FileSizeBytes" INTEGER NOT NULL, + "StoragePath" TEXT NOT NULL, + "SortOrder" INTEGER NOT NULL DEFAULT 0, + "UploadedAt" TEXT NOT NULL, + CONSTRAINT "FK_StoryAttachments_Stories_StoryId" FOREIGN KEY ("StoryId") REFERENCES "Stories" ("Id") ON DELETE CASCADE + ); + """, + cancellationToken); + + await dbContext.Database.ExecuteSqlRawAsync( + """ + CREATE TABLE IF NOT EXISTS "StoryViews" ( + "StoryId" TEXT NOT NULL, + "ViewerUserId" TEXT NOT NULL, + "ViewedAt" TEXT NOT NULL, + CONSTRAINT "PK_StoryViews" PRIMARY KEY ("StoryId", "ViewerUserId"), + CONSTRAINT "FK_StoryViews_Stories_StoryId" FOREIGN KEY ("StoryId") REFERENCES "Stories" ("Id") ON DELETE CASCADE, + CONSTRAINT "FK_StoryViews_Users_ViewerUserId" FOREIGN KEY ("ViewerUserId") REFERENCES "Users" ("Id") ON DELETE CASCADE + ); + """, + cancellationToken); + + await dbContext.Database.ExecuteSqlRawAsync("""CREATE INDEX IF NOT EXISTS "IX_Stories_AuthorUserId_CreatedAt" ON "Stories" ("AuthorUserId", "CreatedAt");""", cancellationToken); + await dbContext.Database.ExecuteSqlRawAsync("""CREATE INDEX IF NOT EXISTS "IX_Stories_ExpiresAt" ON "Stories" ("ExpiresAt");""", cancellationToken); + await dbContext.Database.ExecuteSqlRawAsync("""CREATE INDEX IF NOT EXISTS "IX_StoryAttachments_StoryId_SortOrder" ON "StoryAttachments" ("StoryId", "SortOrder");""", cancellationToken); + await dbContext.Database.ExecuteSqlRawAsync("""CREATE INDEX IF NOT EXISTS "IX_StoryViews_ViewerUserId" ON "StoryViews" ("ViewerUserId");""", cancellationToken); + } + + private async Task EnsureAndroidUpdateCompatibilityHitsTableAsync(CancellationToken cancellationToken) + { + await dbContext.Database.ExecuteSqlRawAsync( + """ + CREATE TABLE IF NOT EXISTS "AndroidUpdateCompatibilityHits" ( + "Id" INTEGER NOT NULL CONSTRAINT "PK_AndroidUpdateCompatibilityHits" PRIMARY KEY AUTOINCREMENT, + "HitAt" TEXT NOT NULL, + "Route" TEXT NOT NULL, + "RequestPath" TEXT NOT NULL, + "RequestedFileName" TEXT NULL, + "ClientPlatform" TEXT NULL, + "ClientVersionCode" INTEGER NULL, + "ClientVersionName" TEXT NULL, + "UserAgent" TEXT NULL, + "RemoteIp" TEXT NULL + ); + """, + cancellationToken); + + await dbContext.Database.ExecuteSqlRawAsync( + """ + CREATE INDEX IF NOT EXISTS "IX_AndroidUpdateCompatibilityHits_HitAt" ON "AndroidUpdateCompatibilityHits" ("HitAt"); + """, + cancellationToken); + + await dbContext.Database.ExecuteSqlRawAsync( + """ + CREATE INDEX IF NOT EXISTS "IX_AndroidUpdateCompatibilityHits_Route_HitAt" ON "AndroidUpdateCompatibilityHits" ("Route", "HitAt"); + """, + cancellationToken); + + await dbContext.Database.ExecuteSqlRawAsync( + """ + CREATE INDEX IF NOT EXISTS "IX_AndroidUpdateCompatibilityHits_ClientPlatform_ClientVersionCode_HitAt" + ON "AndroidUpdateCompatibilityHits" ("ClientPlatform", "ClientVersionCode", "HitAt"); + """, + cancellationToken); + } + + private async Task EnsureMessageReactionsTableAsync(CancellationToken cancellationToken) + { + await dbContext.Database.ExecuteSqlRawAsync( + """ + CREATE TABLE IF NOT EXISTS "MessageReactions" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_MessageReactions" PRIMARY KEY, + "MessageId" TEXT NOT NULL, + "UserId" TEXT NOT NULL, + "Emoji" TEXT NOT NULL, + "CreatedAt" TEXT NOT NULL, + CONSTRAINT "FK_MessageReactions_Messages_MessageId" FOREIGN KEY ("MessageId") REFERENCES "Messages" ("Id") ON DELETE CASCADE, + CONSTRAINT "FK_MessageReactions_Users_UserId" FOREIGN KEY ("UserId") REFERENCES "Users" ("Id") ON DELETE CASCADE + ); + """, + cancellationToken); + + await dbContext.Database.ExecuteSqlRawAsync( + """ + CREATE INDEX IF NOT EXISTS "IX_MessageReactions_MessageId" ON "MessageReactions" ("MessageId"); + """, + cancellationToken); + + await dbContext.Database.ExecuteSqlRawAsync( + """ + CREATE UNIQUE INDEX IF NOT EXISTS "IX_MessageReactions_MessageId_UserId" ON "MessageReactions" ("MessageId", "UserId"); + """, + cancellationToken); + + await dbContext.Database.ExecuteSqlRawAsync( + """ + CREATE INDEX IF NOT EXISTS "IX_Messages_ReplyToMessageId" ON "Messages" ("ReplyToMessageId"); + """, + cancellationToken); + } + + private async Task EnsureMessageViewsTableAsync(CancellationToken cancellationToken) + { + await dbContext.Database.ExecuteSqlRawAsync( + """ + CREATE TABLE IF NOT EXISTS "MessageViews" ( + "MessageId" TEXT NOT NULL, + "ViewerUserId" TEXT NOT NULL, + "ViewedAt" TEXT NOT NULL, + CONSTRAINT "PK_MessageViews" PRIMARY KEY ("MessageId", "ViewerUserId"), + CONSTRAINT "FK_MessageViews_Messages_MessageId" FOREIGN KEY ("MessageId") REFERENCES "Messages" ("Id") ON DELETE CASCADE, + CONSTRAINT "FK_MessageViews_Users_ViewerUserId" FOREIGN KEY ("ViewerUserId") REFERENCES "Users" ("Id") ON DELETE CASCADE + ); + """, + cancellationToken); + + await dbContext.Database.ExecuteSqlRawAsync( + """ + CREATE INDEX IF NOT EXISTS "IX_MessageViews_ViewerUserId" ON "MessageViews" ("ViewerUserId"); + """, + cancellationToken); + } + + private async Task EnsureChatMembersIndexesAsync(CancellationToken cancellationToken) + { + await dbContext.Database.ExecuteSqlRawAsync( + """ + CREATE INDEX IF NOT EXISTS "IX_ChatMembers_UserId" ON "ChatMembers" ("UserId"); + """, + cancellationToken); + } + + private async Task EnsureUserPrivacySettingsTableAsync(CancellationToken cancellationToken) + { + await dbContext.Database.ExecuteSqlRawAsync( + """ + CREATE TABLE IF NOT EXISTS "UserPrivacySettings" ( + "UserId" TEXT NOT NULL CONSTRAINT "PK_UserPrivacySettings" PRIMARY KEY, + "PhoneNumberVisibility" TEXT NOT NULL DEFAULT 'contacts', + "LastSeenVisibility" TEXT NOT NULL DEFAULT 'contacts', + "ProfilePhotoVisibility" TEXT NOT NULL DEFAULT 'everyone', + "BlockedUserIds" TEXT NOT NULL DEFAULT '', + "AlwaysAllowUserIds" TEXT NOT NULL DEFAULT '', + "NeverAllowUserIds" TEXT NOT NULL DEFAULT '', + "PasscodeLockEnabled" INTEGER NOT NULL DEFAULT 0, + "ShowMessagePreview" INTEGER NOT NULL DEFAULT 1, + "UpdatedAt" TEXT NOT NULL, + CONSTRAINT "FK_UserPrivacySettings_Users_UserId" FOREIGN KEY ("UserId") REFERENCES "Users" ("Id") ON DELETE CASCADE + ); + """, + cancellationToken); + } + + private async Task EnsureChatInviteLinksTableAsync(CancellationToken cancellationToken) + { + await dbContext.Database.ExecuteSqlRawAsync( + """ + CREATE TABLE IF NOT EXISTS "ChatInviteLinks" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_ChatInviteLinks" PRIMARY KEY, + "ChatId" TEXT NOT NULL, + "CreatedById" TEXT NOT NULL, + "Token" TEXT NOT NULL, + "Title" TEXT NULL, + "CreatesJoinRequest" INTEGER NOT NULL DEFAULT 0, + "IsRevoked" INTEGER NOT NULL DEFAULT 0, + "CreatedAt" TEXT NOT NULL, + "RevokedAt" TEXT NULL, + CONSTRAINT "FK_ChatInviteLinks_Chats_ChatId" FOREIGN KEY ("ChatId") REFERENCES "Chats" ("Id") ON DELETE CASCADE, + CONSTRAINT "FK_ChatInviteLinks_Users_CreatedById" FOREIGN KEY ("CreatedById") REFERENCES "Users" ("Id") ON DELETE RESTRICT + ); + """, + cancellationToken); + + await dbContext.Database.ExecuteSqlRawAsync( + """ + CREATE UNIQUE INDEX IF NOT EXISTS "IX_ChatInviteLinks_Token" ON "ChatInviteLinks" ("Token"); + """, + cancellationToken); + + await dbContext.Database.ExecuteSqlRawAsync( + """ + CREATE INDEX IF NOT EXISTS "IX_ChatInviteLinks_ChatId" ON "ChatInviteLinks" ("ChatId"); + """, + cancellationToken); + } + + private async Task EnsureChatJoinRequestsTableAsync(CancellationToken cancellationToken) + { + await dbContext.Database.ExecuteSqlRawAsync( + """ + CREATE TABLE IF NOT EXISTS "ChatJoinRequests" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_ChatJoinRequests" PRIMARY KEY, + "ChatId" TEXT NOT NULL, + "InviteLinkId" TEXT NOT NULL, + "UserId" TEXT NOT NULL, + "Status" INTEGER NOT NULL DEFAULT 0, + "RequestedAt" TEXT NOT NULL, + "ResolvedAt" TEXT NULL, + "ResolvedByUserId" TEXT NULL, + CONSTRAINT "FK_ChatJoinRequests_Chats_ChatId" FOREIGN KEY ("ChatId") REFERENCES "Chats" ("Id") ON DELETE CASCADE, + CONSTRAINT "FK_ChatJoinRequests_ChatInviteLinks_InviteLinkId" FOREIGN KEY ("InviteLinkId") REFERENCES "ChatInviteLinks" ("Id") ON DELETE CASCADE, + CONSTRAINT "FK_ChatJoinRequests_Users_UserId" FOREIGN KEY ("UserId") REFERENCES "Users" ("Id") ON DELETE CASCADE, + CONSTRAINT "FK_ChatJoinRequests_Users_ResolvedByUserId" FOREIGN KEY ("ResolvedByUserId") REFERENCES "Users" ("Id") ON DELETE SET NULL + ); + """, + cancellationToken); + + await dbContext.Database.ExecuteSqlRawAsync( + """ + CREATE INDEX IF NOT EXISTS "IX_ChatJoinRequests_ChatId_Status" ON "ChatJoinRequests" ("ChatId", "Status"); + """, + cancellationToken); + + await dbContext.Database.ExecuteSqlRawAsync( + """ + CREATE UNIQUE INDEX IF NOT EXISTS "IX_ChatJoinRequests_InviteLinkId_UserId" ON "ChatJoinRequests" ("InviteLinkId", "UserId"); + """, + cancellationToken); + } + + private async Task EnsureChatTopicsTableAsync(CancellationToken cancellationToken) + { + await dbContext.Database.ExecuteSqlRawAsync( + """ + CREATE TABLE IF NOT EXISTS "ChatTopics" ( + "Id" TEXT NOT NULL CONSTRAINT "PK_ChatTopics" PRIMARY KEY, + "ChatId" TEXT NOT NULL, + "CreatedById" TEXT NOT NULL, + "Title" TEXT NOT NULL, + "Icon" TEXT NOT NULL DEFAULT '💬', + "IsPinned" INTEGER NOT NULL DEFAULT 0, + "IsClosed" INTEGER NOT NULL DEFAULT 0, + "CreatedAt" TEXT NOT NULL, + "LastActivityAt" TEXT NOT NULL, + CONSTRAINT "FK_ChatTopics_Chats_ChatId" FOREIGN KEY ("ChatId") REFERENCES "Chats" ("Id") ON DELETE CASCADE, + CONSTRAINT "FK_ChatTopics_Users_CreatedById" FOREIGN KEY ("CreatedById") REFERENCES "Users" ("Id") ON DELETE RESTRICT + ); + """, + cancellationToken); + + await dbContext.Database.ExecuteSqlRawAsync( + """ + CREATE INDEX IF NOT EXISTS "IX_ChatTopics_ChatId_IsPinned" ON "ChatTopics" ("ChatId", "IsPinned"); + """, + cancellationToken); + + await dbContext.Database.ExecuteSqlRawAsync( + """ + CREATE INDEX IF NOT EXISTS "IX_ChatTopics_ChatId_LastActivityAt" ON "ChatTopics" ("ChatId", "LastActivityAt"); + """, + cancellationToken); + } + + private async Task EnsureMessagesPinnedIndexAsync(CancellationToken cancellationToken) + { + await dbContext.Database.ExecuteSqlRawAsync( + """ + CREATE INDEX IF NOT EXISTS "IX_Messages_ChatId_PinnedAt" ON "Messages" ("ChatId", "PinnedAt"); + """, + cancellationToken); + } + + private async Task EnsureMessagesChatSenderSentAtIndexAsync(CancellationToken cancellationToken) + { + await dbContext.Database.ExecuteSqlRawAsync( + """ + CREATE INDEX IF NOT EXISTS "IX_Messages_ChatId_SenderId_SentAt" ON "Messages" ("ChatId", "SenderId", "SentAt"); + """, + cancellationToken); + } + + private async Task EnsureMessagesAlbumIndexAsync(CancellationToken cancellationToken) + { + await dbContext.Database.ExecuteSqlRawAsync( + """ + CREATE INDEX IF NOT EXISTS "IX_Messages_MediaAlbumId" ON "Messages" ("MediaAlbumId"); + """, + cancellationToken); + } + + private async Task EnsureMessagesTopicIndexAsync(CancellationToken cancellationToken) + { + await dbContext.Database.ExecuteSqlRawAsync( + """ + CREATE INDEX IF NOT EXISTS "IX_Messages_TopicId" ON "Messages" ("TopicId"); + """, + cancellationToken); + } + + private async Task EnsureMessagesExpiresAtIndexAsync(CancellationToken cancellationToken) + { + await dbContext.Database.ExecuteSqlRawAsync( + """ + CREATE INDEX IF NOT EXISTS "IX_Messages_ExpiresAt" ON "Messages" ("ExpiresAt"); + """, + cancellationToken); + } + + private async Task EnsureChatsPublicUsernameIndexAsync(CancellationToken cancellationToken) + { + await dbContext.Database.ExecuteSqlRawAsync( + """ + CREATE UNIQUE INDEX IF NOT EXISTS "IX_Chats_PublicUsername" ON "Chats" ("PublicUsername") WHERE "PublicUsername" IS NOT NULL; + """, + cancellationToken); + } + + private async Task EnsureChatsLinkedDiscussionIndexAsync(CancellationToken cancellationToken) + { + await dbContext.Database.ExecuteSqlRawAsync( + """ + CREATE INDEX IF NOT EXISTS "IX_Chats_LinkedDiscussionChatId" ON "Chats" ("LinkedDiscussionChatId"); + """, + cancellationToken); + } + + private async Task EnsureLegacyChannelPostsMarkedAsync(CancellationToken cancellationToken) + { + await dbContext.Database.ExecuteSqlRawAsync( + """ + UPDATE "Messages" + SET "PostedAsChannel" = 1 + WHERE "PostedAsChannel" = 0 + AND "ChatId" IN (SELECT "Id" FROM "Chats" WHERE "Type" = 3); + """, + cancellationToken); + } + + private async Task EnsureMessageAttachmentsSortIndexAsync(CancellationToken cancellationToken) + { + await dbContext.Database.ExecuteSqlRawAsync( + """ + CREATE INDEX IF NOT EXISTS "IX_MessageAttachments_MessageId_SortOrder" ON "MessageAttachments" ("MessageId", "SortOrder"); + """, + cancellationToken); + } + + private async Task EnsureChatMemberStateIndexesAsync(CancellationToken cancellationToken) + { + await dbContext.Database.ExecuteSqlRawAsync( + """ + CREATE INDEX IF NOT EXISTS "IX_ChatMembers_UserId_IsPinned" ON "ChatMembers" ("UserId", "IsPinned"); + """, + cancellationToken); + + await dbContext.Database.ExecuteSqlRawAsync( + """ + CREATE INDEX IF NOT EXISTS "IX_ChatMembers_UserId_IsArchived" ON "ChatMembers" ("UserId", "IsArchived"); + """, + cancellationToken); + + await dbContext.Database.ExecuteSqlRawAsync( + """ + CREATE INDEX IF NOT EXISTS "IX_ChatMembers_UserId_FolderKey" ON "ChatMembers" ("UserId", "FolderKey"); + """, + cancellationToken); + } + + private async Task EnsureUsersPhoneIndexAsync(CancellationToken cancellationToken) + { + await dbContext.Database.ExecuteSqlRawAsync( + """ + CREATE UNIQUE INDEX IF NOT EXISTS "IX_Users_NormalizedPhoneNumber" ON "Users" ("NormalizedPhoneNumber") WHERE "NormalizedPhoneNumber" IS NOT NULL; + """, + cancellationToken); + } + + private async Task EnsureColumnAsync( + string tableName, + string columnName, + string definition, + CancellationToken cancellationToken) + { + var connection = dbContext.Database.GetDbConnection(); + var shouldClose = connection.State != ConnectionState.Open; + if (shouldClose) + { + await connection.OpenAsync(cancellationToken); + } + + try + { + await using var command = connection.CreateCommand(); + command.CommandText = $"PRAGMA table_info(\"{tableName}\");"; + + await using var reader = await command.ExecuteReaderAsync(cancellationToken); + while (await reader.ReadAsync(cancellationToken)) + { + if (string.Equals(reader.GetString(1), columnName, StringComparison.OrdinalIgnoreCase)) + { + return; + } + } + + await reader.DisposeAsync(); + + await using var alterCommand = connection.CreateCommand(); + alterCommand.CommandText = $"ALTER TABLE \"{tableName}\" ADD COLUMN \"{columnName}\" {definition};"; + await alterCommand.ExecuteNonQueryAsync(cancellationToken); + } + finally + { + if (shouldClose) + { + await connection.CloseAsync(); + } + } + } +} diff --git a/src/Ikar.Server/Infrastructure/Updates/AndroidAppUpdateMonitorService.cs b/src/Ikar.Server/Infrastructure/Updates/AndroidAppUpdateMonitorService.cs new file mode 100644 index 00000000..b25b6503 --- /dev/null +++ b/src/Ikar.Server/Infrastructure/Updates/AndroidAppUpdateMonitorService.cs @@ -0,0 +1,99 @@ +using Ikar.Server.Data; +using Ikar.Server.Infrastructure.Hubs; +using Ikar.Server.Infrastructure.Push; +using Ikar.Shared; +using Microsoft.AspNetCore.SignalR; +using Microsoft.EntityFrameworkCore; + +namespace Ikar.Server.Infrastructure.Updates; + +public sealed class AndroidAppUpdateMonitorService( + IServiceScopeFactory serviceScopeFactory, + AndroidAppUpdateService androidAppUpdateService, + IHubContext<MessengerHub> hubContext, + ILogger<AndroidAppUpdateMonitorService> logger) : BackgroundService +{ + private static readonly TimeSpan PollInterval = TimeSpan.FromSeconds(15); + private AndroidAppReleaseDto? _lastObservedRelease; + + protected override async Task ExecuteAsync(CancellationToken stoppingToken) + { + _lastObservedRelease = await androidAppUpdateService.GetLatestReleaseAsync(stoppingToken); + + using var timer = new PeriodicTimer(PollInterval); + while (await timer.WaitForNextTickAsync(stoppingToken)) + { + try + { + var currentRelease = await androidAppUpdateService.GetLatestReleaseAsync(stoppingToken); + if (currentRelease is null) + { + continue; + } + + if (!HasRelevantUpdateChange(_lastObservedRelease, currentRelease)) + { + continue; + } + + var previousRelease = _lastObservedRelease; + _lastObservedRelease = currentRelease; + await NotifyClientsAsync(currentRelease, stoppingToken); + await NotifyPushDevicesAsync(currentRelease, stoppingToken); + + logger.LogInformation( + "Detected Android app update change from version {PreviousVersion} to {CurrentVersion}.", + previousRelease?.VersionName ?? "none", + currentRelease.VersionName); + } + catch (OperationCanceledException) when (stoppingToken.IsCancellationRequested) + { + break; + } + catch (Exception ex) + { + logger.LogWarning(ex, "Android app update monitor failed during polling."); + } + } + } + + private static bool HasRelevantUpdateChange(AndroidAppReleaseDto? previousRelease, AndroidAppReleaseDto currentRelease) + { + if (previousRelease is null) + { + return true; + } + + return previousRelease.VersionCode != currentRelease.VersionCode || + !string.Equals(previousRelease.VersionName, currentRelease.VersionName, StringComparison.Ordinal) || + !string.Equals(previousRelease.DownloadPath, currentRelease.DownloadPath, StringComparison.Ordinal); + } + + private Task NotifyClientsAsync(AndroidAppReleaseDto release, CancellationToken cancellationToken) => + hubContext.Clients.All.SendAsync("AppUpdateAvailable", release, cancellationToken); + + private async Task NotifyPushDevicesAsync(AndroidAppReleaseDto release, CancellationToken cancellationToken) + { + await using var scope = serviceScopeFactory.CreateAsyncScope(); + var dbContext = scope.ServiceProvider.GetRequiredService<IkarDbContext>(); + var pushNotificationSender = scope.ServiceProvider.GetRequiredService<IPushNotificationSender>(); + + var devices = await dbContext.PushDevices + .Where(device => device.Platform == PushPlatform.Android && device.NotificationsEnabled) + .ToListAsync(cancellationToken); + + if (devices.Count == 0) + { + return; + } + + try + { + await pushNotificationSender.SendAppUpdateAvailableAsync(release, devices, cancellationToken); + } + catch (Exception ex) + { + logger.LogWarning(ex, "Android app update push dispatch failed for version {VersionCode}.", release.VersionCode); + } + } +} diff --git a/src/Ikar.Server/Infrastructure/Updates/AndroidAppUpdateService.cs b/src/Ikar.Server/Infrastructure/Updates/AndroidAppUpdateService.cs new file mode 100644 index 00000000..9efd61bd --- /dev/null +++ b/src/Ikar.Server/Infrastructure/Updates/AndroidAppUpdateService.cs @@ -0,0 +1,347 @@ +using System.Globalization; +using System.Net; +using System.Net.Http.Headers; +using System.Net.Http.Json; +using System.Text.Json; +using System.Text.RegularExpressions; +using Ikar.Shared; + +namespace Ikar.Server.Infrastructure.Updates; + +public sealed class AndroidAppUpdateService( + IHostEnvironment hostEnvironment, + IHttpClientFactory httpClientFactory, + ILogger<AndroidAppUpdateService> logger) +{ + private const string ArgusBaseUrl = "https://argus.kusoft.xyz"; + private const string ArgusSlug = "ikar-android"; + private const string ArgusChannel = "stable"; + private const string ArgusPlatform = "android"; + private static readonly JsonSerializerOptions JsonOptions = new(JsonSerializerDefaults.Web); + private static readonly Regex VersionCodeFromFileNameRegex = new( + @"ikar-android-(\d+)\.apk$", + RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.IgnoreCase); + + private string UpdatesRootPath => Path.Combine(hostEnvironment.ContentRootPath, "Data", "AppUpdates", "Android"); + + private string MetadataPath => Path.Combine(UpdatesRootPath, "latest.json"); + + public void EnsureStorage() + { + Directory.CreateDirectory(UpdatesRootPath); + } + + public async Task<AndroidAppReleaseDto?> GetLatestReleaseAsync(CancellationToken cancellationToken = default) + { + var argusManifest = await TryGetArgusManifestAsync(cancellationToken); + if (argusManifest is not null) + { + return ApplyMandatoryLatestPolicy(argusManifest.Release); + } + + var localRelease = GetLatestLocalRelease(); + return localRelease is null ? null : ApplyMandatoryLatestPolicy(localRelease); + } + + public async Task<AndroidAppDownloadResolution?> ResolvePackageAsync(string fileName, CancellationToken cancellationToken = default) + { + var argusManifest = await TryGetArgusManifestAsync(cancellationToken); + if (argusManifest is not null && MatchesArgusFileName(argusManifest, fileName)) + { + return AndroidAppDownloadResolution.ForRedirect( + argusManifest.Release.DownloadPath, + argusManifest.OriginalFileName); + } + + var latest = GetLocalMetadata(); + if (latest is null) + { + return null; + } + + if (!string.Equals(latest.PackageFileName, fileName, StringComparison.Ordinal)) + { + return null; + } + + var physicalPath = Path.Combine(UpdatesRootPath, latest.PackageFileName); + if (!File.Exists(physicalPath)) + { + return null; + } + + return AndroidAppDownloadResolution.ForPhysical(physicalPath, latest.PackageFileName); + } + + public async Task<AndroidAppDownloadResolution?> ResolveLatestPackageAsync(CancellationToken cancellationToken = default) + { + var argusManifest = await TryGetArgusManifestAsync(cancellationToken); + if (argusManifest is not null) + { + return AndroidAppDownloadResolution.ForRedirect( + argusManifest.Release.DownloadPath, + argusManifest.OriginalFileName); + } + + var latest = GetLocalMetadata(); + if (latest is null) + { + return null; + } + + var physicalPath = Path.Combine(UpdatesRootPath, latest.PackageFileName); + if (!File.Exists(physicalPath)) + { + return null; + } + + return AndroidAppDownloadResolution.ForPhysical(physicalPath, latest.PackageFileName); + } + + private async Task<ArgusAndroidRelease?> TryGetArgusManifestAsync(CancellationToken cancellationToken) + { + try + { + using var client = httpClientFactory.CreateClient(); + using var request = new HttpRequestMessage( + HttpMethod.Get, + $"{ArgusBaseUrl.TrimEnd('/')}/api/apps/{ArgusSlug}/manifest?platform={ArgusPlatform}&channel={ArgusChannel}"); + request.Headers.CacheControl = new CacheControlHeaderValue + { + NoCache = true, + NoStore = true + }; + + using var response = await client.SendAsync(request, cancellationToken); + if (response.StatusCode == HttpStatusCode.NotFound) + { + return null; + } + + if (!response.IsSuccessStatusCode) + { + logger.LogWarning( + "Argus manifest request failed with status code {StatusCode}.", + (int)response.StatusCode); + return null; + } + + var manifest = await response.Content.ReadFromJsonAsync<ArgusManifestDto>(JsonOptions, cancellationToken); + if (manifest?.Release is null) + { + logger.LogWarning("Argus manifest response was empty or missing release metadata."); + return null; + } + + if (!TryMapArgusRelease(manifest.Release, out var release, out var originalFileName)) + { + logger.LogWarning( + "Argus manifest could not be mapped to AndroidAppReleaseDto. Version={Version}, OriginalFileName={OriginalFileName}.", + manifest.Release.Version, + manifest.Release.OriginalFileName); + return null; + } + + return new ArgusAndroidRelease(release, originalFileName); + } + catch (Exception ex) + { + logger.LogWarning(ex, "Failed to load Android app release metadata from Argus."); + return null; + } + } + + private static bool TryMapArgusRelease( + ArgusReleaseDto argusRelease, + out AndroidAppReleaseDto release, + out string originalFileName) + { + release = null!; + originalFileName = argusRelease.OriginalFileName; + + if (!TryParseVersion(argusRelease.Version, argusRelease.OriginalFileName, out var versionCode, out var versionName)) + { + return false; + } + + var downloadPath = BuildAbsoluteArgusUrl(argusRelease.DownloadPath); + if (downloadPath is null) + { + return false; + } + + release = new AndroidAppReleaseDto( + versionCode, + versionName, + downloadPath, + argusRelease.PublishedAt, + argusRelease.Notes); + + return true; + } + + private static bool TryParseVersion( + string rawVersion, + string? originalFileName, + out int versionCode, + out string versionName) + { + versionCode = 0; + versionName = rawVersion.Trim(); + + var buildSeparatorIndex = versionName.IndexOf('+'); + if (buildSeparatorIndex >= 0) + { + var parsedVersionName = versionName[..buildSeparatorIndex].Trim(); + var buildMetadata = versionName[(buildSeparatorIndex + 1)..].Trim(); + + if (!string.IsNullOrWhiteSpace(parsedVersionName)) + { + versionName = parsedVersionName; + } + + if (int.TryParse(buildMetadata, NumberStyles.Integer, CultureInfo.InvariantCulture, out var parsedVersionCode) && + parsedVersionCode > 0) + { + versionCode = parsedVersionCode; + } + } + + if (versionCode <= 0 && + !string.IsNullOrWhiteSpace(originalFileName) && + TryParseVersionCodeFromFileName(originalFileName, out var parsedFromFileName)) + { + versionCode = parsedFromFileName; + } + + return versionCode > 0 && !string.IsNullOrWhiteSpace(versionName); + } + + private static bool TryParseVersionCodeFromFileName(string fileName, out int versionCode) + { + versionCode = 0; + var match = VersionCodeFromFileNameRegex.Match(fileName); + if (!match.Success) + { + return false; + } + + return int.TryParse(match.Groups[1].Value, NumberStyles.Integer, CultureInfo.InvariantCulture, out versionCode) && + versionCode > 0; + } + + private static string? BuildAbsoluteArgusUrl(string? rawPath) + { + if (string.IsNullOrWhiteSpace(rawPath)) + { + return null; + } + + if (Uri.TryCreate(rawPath, UriKind.Absolute, out var absoluteUri) && + (absoluteUri.Scheme == Uri.UriSchemeHttp || absoluteUri.Scheme == Uri.UriSchemeHttps)) + { + return absoluteUri.ToString(); + } + + return new Uri(new Uri($"{ArgusBaseUrl.TrimEnd('/')}/"), rawPath.TrimStart('/')).ToString(); + } + + private static bool MatchesArgusFileName(ArgusAndroidRelease argusManifest, string requestedFileName) + { + var normalizedRequested = requestedFileName.Trim(); + if (string.Equals(normalizedRequested, argusManifest.OriginalFileName, StringComparison.OrdinalIgnoreCase)) + { + return true; + } + + var generatedFileName = BuildExpectedFileName(argusManifest.Release.VersionCode); + return string.Equals(normalizedRequested, generatedFileName, StringComparison.OrdinalIgnoreCase); + } + + private AndroidAppReleaseDto? GetLatestLocalRelease() + { + var metadata = GetLocalMetadata(); + if (metadata is null) + { + return null; + } + + var packagePath = Path.Combine(UpdatesRootPath, metadata.PackageFileName); + if (!File.Exists(packagePath)) + { + return null; + } + + return new AndroidAppReleaseDto( + metadata.VersionCode, + metadata.VersionName, + $"/api/app-updates/android/download/{Uri.EscapeDataString(metadata.PackageFileName)}", + metadata.PublishedAt, + metadata.Notes); + } + + private static AndroidAppReleaseDto ApplyMandatoryLatestPolicy(AndroidAppReleaseDto release) + { + return release with + { + IsRequired = true, + MinimumSupportedVersionCode = release.VersionCode + }; + } + + private AndroidAppReleaseMetadata? GetLocalMetadata() + { + if (!File.Exists(MetadataPath)) + { + return null; + } + + return JsonSerializer.Deserialize<AndroidAppReleaseMetadata>(File.ReadAllText(MetadataPath), JsonOptions); + } + + private static string BuildExpectedFileName(int versionCode) => $"ikar-android-{versionCode}.apk"; + + private sealed record ArgusManifestDto( + string Slug, + string Name, + string Summary, + string Description, + string? RepositoryUrl, + string? HomepageUrl, + ArgusReleaseDto Release); + + private sealed record ArgusReleaseDto( + Guid Id, + string Version, + string Channel, + string Platform, + string PackageKind, + string DownloadPath, + string OriginalFileName, + string ContentType, + long PackageSizeBytes, + string Sha256, + DateTimeOffset PublishedAt, + string? Notes); + + private sealed record ArgusAndroidRelease(AndroidAppReleaseDto Release, string OriginalFileName); + + public sealed record AndroidAppDownloadResolution( + string FileName, + string? PhysicalPath, + string? RedirectUrl) + { + public static AndroidAppDownloadResolution ForPhysical(string physicalPath, string fileName) => + new(fileName, physicalPath, null); + + public static AndroidAppDownloadResolution ForRedirect(string redirectUrl, string fileName) => + new(fileName, null, redirectUrl); + } + + public sealed record AndroidAppReleaseMetadata( + int VersionCode, + string VersionName, + string PackageFileName, + DateTimeOffset PublishedAt, + string? Notes); +} diff --git a/src/Ikar.Server/Infrastructure/Updates/AndroidUpdateCompatibilityTrackingService.cs b/src/Ikar.Server/Infrastructure/Updates/AndroidUpdateCompatibilityTrackingService.cs new file mode 100644 index 00000000..2346bb79 --- /dev/null +++ b/src/Ikar.Server/Infrastructure/Updates/AndroidUpdateCompatibilityTrackingService.cs @@ -0,0 +1,82 @@ +using Microsoft.EntityFrameworkCore; +using Ikar.Server.Data; +using Ikar.Server.Data.Entities; +using Ikar.Shared; + +namespace Ikar.Server.Infrastructure.Updates; + +public sealed class AndroidUpdateCompatibilityTrackingService(IkarDbContext dbContext) +{ + private const int MaxUserAgentLength = 512; + + public async Task TrackHitAsync( + HttpRequest request, + string route, + string? requestedFileName, + CancellationToken cancellationToken) + { + var hit = new AndroidUpdateCompatibilityHit + { + HitAt = DateTimeOffset.UtcNow, + Route = TrimToLength(route, 64) ?? "unknown", + RequestPath = TrimToLength(request.Path.Value, 256) ?? string.Empty, + RequestedFileName = TrimToLength(requestedFileName, 260), + ClientPlatform = TrimToLength(ReadClientPlatform(request), 32), + ClientVersionCode = ReadClientVersionCode(request), + ClientVersionName = TrimToLength(ReadClientVersionName(request), 64), + UserAgent = TrimToLength(request.Headers.UserAgent.ToString(), MaxUserAgentLength), + RemoteIp = TrimToLength(request.HttpContext.Connection.RemoteIpAddress?.ToString(), 64) + }; + + dbContext.AndroidUpdateCompatibilityHits.Add(hit); + await dbContext.SaveChangesAsync(cancellationToken); + } + + private static string? ReadClientPlatform(HttpRequest request) + { + var platform = request.Headers[ClientVersionMetadata.PlatformHeaderName].ToString(); + if (!string.IsNullOrWhiteSpace(platform)) + { + return platform; + } + + platform = request.Query[ClientVersionMetadata.PlatformQueryName].ToString(); + return string.IsNullOrWhiteSpace(platform) ? null : platform; + } + + private static int? ReadClientVersionCode(HttpRequest request) + { + var rawVersionCode = request.Headers[ClientVersionMetadata.VersionCodeHeaderName].ToString(); + if (string.IsNullOrWhiteSpace(rawVersionCode)) + { + rawVersionCode = request.Query[ClientVersionMetadata.VersionCodeQueryName].ToString(); + } + + return int.TryParse(rawVersionCode, out var parsedVersionCode) && parsedVersionCode > 0 + ? parsedVersionCode + : null; + } + + private static string? ReadClientVersionName(HttpRequest request) + { + var versionName = request.Headers[ClientVersionMetadata.VersionNameHeaderName].ToString(); + if (!string.IsNullOrWhiteSpace(versionName)) + { + return versionName; + } + + versionName = request.Query[ClientVersionMetadata.VersionNameQueryName].ToString(); + return string.IsNullOrWhiteSpace(versionName) ? null : versionName; + } + + private static string? TrimToLength(string? value, int maxLength) + { + if (string.IsNullOrWhiteSpace(value)) + { + return null; + } + + var trimmed = value.Trim(); + return trimmed.Length <= maxLength ? trimmed : trimmed[..maxLength]; + } +} diff --git a/src/Ikar.Server/Program.cs b/src/Ikar.Server/Program.cs new file mode 100644 index 00000000..c4046ffd --- /dev/null +++ b/src/Ikar.Server/Program.cs @@ -0,0 +1,297 @@ +using System.Net; +using System.Security.Claims; +using Microsoft.AspNetCore.Authentication.JwtBearer; +using Microsoft.AspNetCore.Authentication.Cookies; +using Microsoft.AspNetCore.HttpOverrides; +using Microsoft.EntityFrameworkCore; +using Microsoft.IdentityModel.Tokens; +using Ikar.Server.Data; +using Ikar.Server.Infrastructure; +using Ikar.Server.Infrastructure.Admin; +using Ikar.Server.Infrastructure.Auth; +using Ikar.Server.Infrastructure.Bots; +using Ikar.Server.Infrastructure.Calls; +using Ikar.Server.Infrastructure.Hubs; +using Ikar.Server.Infrastructure.Push; +using Ikar.Server.Infrastructure.Storage; +using Ikar.Server.Infrastructure.Updates; +using Ikar.Shared; +using System.Text; + +var builder = WebApplication.CreateBuilder(args); +var sessionActivityWriteInterval = TimeSpan.FromMinutes(1); +var seedDemoData = builder.Configuration.GetValue<bool?>("SeedDemoData") ?? builder.Environment.IsDevelopment(); +var configuredUrls = + builder.Configuration["ASPNETCORE_URLS"] ?? + builder.Configuration["URLS"] ?? + "http://0.0.0.0:5099"; + +builder.WebHost.UseUrls(configuredUrls); + +builder.Services.AddControllers(); +builder.Services.AddOpenApi(); +builder.Services.AddSignalR(); +builder.Services.AddEndpointsApiExplorer(); +builder.Services.AddHttpClient(); + +builder.Services.AddDbContext<IkarDbContext>(options => + options.UseSqlite(builder.Configuration.GetConnectionString("IkarDb") ?? + "Data Source=Data/ikar.db")); + +builder.Services.Configure<ForwardedHeadersOptions>(options => +{ + options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto | ForwardedHeaders.XForwardedHost; + options.KnownProxies.Add(IPAddress.Loopback); + options.KnownProxies.Add(IPAddress.IPv6Loopback); +}); + +builder.Services.Configure<JwtOptions>(builder.Configuration.GetSection(JwtOptions.SectionName)); +builder.Services.Configure<PushOptions>(builder.Configuration.GetSection(PushOptions.SectionName)); +builder.Services.Configure<AdminOptions>(builder.Configuration.GetSection(AdminOptions.SectionName)); +builder.Services.Configure<WebRtcOptions>(builder.Configuration.GetSection(WebRtcOptions.SectionName)); + +var jwtOptions = builder.Configuration + .GetSection(JwtOptions.SectionName) + .Get<JwtOptions>() ?? new JwtOptions(); +var signingKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtOptions.SigningKey)); + +builder.Services + .AddAuthentication(JwtBearerDefaults.AuthenticationScheme) + .AddJwtBearer(options => + { + options.TokenValidationParameters = new TokenValidationParameters + { + ValidateIssuer = true, + ValidateAudience = true, + ValidateIssuerSigningKey = true, + ValidateLifetime = true, + ValidIssuer = jwtOptions.Issuer, + ValidAudience = jwtOptions.Audience, + IssuerSigningKey = signingKey, + ClockSkew = TimeSpan.FromSeconds(30) + }; + + options.Events = new JwtBearerEvents + { + OnMessageReceived = context => + { + var accessToken = context.Request.Query["access_token"]; + var path = context.HttpContext.Request.Path; + if (!string.IsNullOrWhiteSpace(accessToken) && + path.StartsWithSegments("/hubs/messenger")) + { + context.Token = accessToken; + } + + return Task.CompletedTask; + }, + OnTokenValidated = async context => + { + var principal = context.Principal; + if (principal is null) + { + context.Fail("Token principal is missing."); + return; + } + + var sessionId = principal.GetRequiredSessionId(); + var dbContext = context.HttpContext.RequestServices.GetRequiredService<IkarDbContext>(); + var session = await dbContext.UserSessions + .Include(x => x.User) + .SingleOrDefaultAsync(x => x.Id == sessionId, context.HttpContext.RequestAborted); + if (session is null) + { + context.Fail("Session is no longer active."); + return; + } + + if (session.User.IsBlocked) + { + context.Fail("User is blocked."); + return; + } + + var now = DateTimeOffset.UtcNow; + var changed = ClientVersionRequestReader.Apply( + session, + ClientVersionRequestReader.Read(context.HttpContext.Request)); + if (session.LastSeenAt <= now.Subtract(sessionActivityWriteInterval)) + { + session.LastSeenAt = now; + changed = true; + } + + if (changed) + { + await dbContext.SaveChangesAsync(context.HttpContext.RequestAborted); + } + } + }; + }) + .AddCookie(AdminAuthConstants.Scheme, options => + { + options.Cookie.Name = "Ikar.Admin"; + options.Cookie.HttpOnly = true; + options.Cookie.SameSite = SameSiteMode.Strict; + options.Cookie.SecurePolicy = builder.Environment.IsDevelopment() + ? CookieSecurePolicy.SameAsRequest + : CookieSecurePolicy.Always; + options.ExpireTimeSpan = TimeSpan.FromHours(12); + options.SlidingExpiration = true; + options.Events = new CookieAuthenticationEvents + { + OnRedirectToLogin = context => + { + context.Response.StatusCode = StatusCodes.Status401Unauthorized; + return Task.CompletedTask; + }, + OnRedirectToAccessDenied = context => + { + context.Response.StatusCode = StatusCodes.Status403Forbidden; + return Task.CompletedTask; + } + }; + }); + +builder.Services.AddAuthorization(options => +{ + options.AddPolicy(AdminAuthConstants.Policy, policy => + { + policy.AuthenticationSchemes.Add(AdminAuthConstants.Scheme); + policy.RequireAuthenticatedUser(); + policy.RequireClaim(ClaimTypes.Role, "Admin"); + }); +}); +builder.Services.AddSingleton<PresenceTracker>(); +builder.Services.AddSingleton<CallSessionStore>(); +builder.Services.AddSingleton(new ServerRuntimeState(DateTimeOffset.UtcNow)); +builder.Services.AddScoped<TokenService>(); +builder.Services.AddSingleton<BotTokenService>(); +builder.Services.AddSingleton<PhoneAuthChallengeStore>(); +builder.Services.AddScoped<DatabaseSeeder>(); +builder.Services.AddScoped<DatabaseSchemaBootstrapper>(); +builder.Services.AddScoped<AttachmentStorageService>(); +builder.Services.AddScoped<AvatarStorageService>(); +builder.Services.AddScoped<BotUpdateService>(); +builder.Services.AddScoped<PushNotificationDispatcher>(); +builder.Services.AddScoped<AndroidUpdateCompatibilityTrackingService>(); +builder.Services.AddScoped<AdminService>(); +builder.Services.AddSingleton<AndroidAppUpdateService>(); +builder.Services.AddHostedService<AndroidAppUpdateMonitorService>(); +builder.Services.AddSingleton<PushDispatchQueue>(); +builder.Services.AddHostedService<PushDispatchBackgroundService>(); +builder.Services.AddHttpClient<IPushNotificationSender, FirebasePushNotificationSender>(); + +var app = builder.Build(); + +Directory.CreateDirectory(Path.Combine(app.Environment.ContentRootPath, "Data")); +app.Services.GetRequiredService<AndroidAppUpdateService>().EnsureStorage(); + +await using (var scope = app.Services.CreateAsyncScope()) +{ + var db = scope.ServiceProvider.GetRequiredService<IkarDbContext>(); + await db.Database.EnsureCreatedAsync(); + await scope.ServiceProvider.GetRequiredService<DatabaseSchemaBootstrapper>().EnsureLatestAsync(); + if (seedDemoData) + { + await scope.ServiceProvider.GetRequiredService<DatabaseSeeder>().SeedAsync(); + } +} + +if (app.Environment.IsDevelopment()) +{ + app.MapOpenApi(); +} + +app.Use(async (context, next) => +{ + if (context.Request.Path == "/" || context.Request.Path == "/index.html") + { + context.Response.Redirect("https://argus.kusoft.xyz/#catalog", permanent: false); + return; + } + + if (context.Request.Path == "/admin" || context.Request.Path == "/admin/") + { + context.Response.Redirect("/admin/index.html"); + return; + } + + await next(); +}); +app.UseForwardedHeaders(); +app.UseStaticFiles(); +app.Use(async (context, next) => +{ + if (!ShouldEnforceAndroidClientVersion(context.Request)) + { + await next(); + return; + } + + var release = await context.RequestServices + .GetRequiredService<AndroidAppUpdateService>() + .GetLatestReleaseAsync(context.RequestAborted); + + var minimumSupportedVersionCode = release?.MinimumSupportedVersionCode ?? 0; + if (release is null || minimumSupportedVersionCode <= 0) + { + await next(); + return; + } + + if (!TryGetClientPlatform(context.Request, out var clientPlatform) || + !string.Equals(clientPlatform, ClientPlatformNames.Android, StringComparison.OrdinalIgnoreCase)) + { + await next(); + return; + } + + if (!TryGetClientVersionCode(context.Request, out var clientVersionCode) || + clientVersionCode >= minimumSupportedVersionCode) + { + await next(); + return; + } + + context.Response.StatusCode = StatusCodes.Status426UpgradeRequired; + context.Response.ContentType = "application/json; charset=utf-8"; + await context.Response.WriteAsJsonAsync(release, cancellationToken: context.RequestAborted); +}); +app.UseAuthentication(); +app.UseMiddleware<ApiRateLimitMiddleware>(); +app.UseAuthorization(); + +app.MapControllers(); +app.MapGet("/health", async (IkarDbContext dbContext, CancellationToken cancellationToken) => +{ + var canConnect = await dbContext.Database.CanConnectAsync(cancellationToken); + return canConnect + ? Results.Ok(new { status = "ok" }) + : Results.StatusCode(StatusCodes.Status503ServiceUnavailable); +}); +app.MapHub<MessengerHub>("/hubs/messenger"); + +app.Run(); + +static bool ShouldEnforceAndroidClientVersion(HttpRequest request) +{ + if (request.Path.StartsWithSegments("/health", StringComparison.OrdinalIgnoreCase) || + request.Path.StartsWithSegments("/api/app-updates", StringComparison.OrdinalIgnoreCase)) + { + return false; + } + + return request.Path.StartsWithSegments("/api", StringComparison.OrdinalIgnoreCase) || + request.Path.StartsWithSegments("/hubs/messenger", StringComparison.OrdinalIgnoreCase); +} + +static bool TryGetClientPlatform(HttpRequest request, out string? clientPlatform) +{ + return ClientVersionRequestReader.TryGetClientPlatform(request, out clientPlatform); +} + +static bool TryGetClientVersionCode(HttpRequest request, out int clientVersionCode) +{ + return ClientVersionRequestReader.TryGetClientVersionCode(request, out clientVersionCode); +} diff --git a/src/Ikar.Server/Properties/launchSettings.json b/src/Ikar.Server/Properties/launchSettings.json new file mode 100644 index 00000000..402e6edd --- /dev/null +++ b/src/Ikar.Server/Properties/launchSettings.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": false, + "applicationUrl": "http://localhost:5099", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "Ikar.Server": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": false, + "applicationUrl": "http://localhost:5099", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/src/Ikar.Server/appsettings.Development.json b/src/Ikar.Server/appsettings.Development.json new file mode 100644 index 00000000..70147db7 --- /dev/null +++ b/src/Ikar.Server/appsettings.Development.json @@ -0,0 +1,9 @@ +{ + "SeedDemoData": true, + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/src/Ikar.Server/appsettings.json b/src/Ikar.Server/appsettings.json new file mode 100644 index 00000000..7af62eda --- /dev/null +++ b/src/Ikar.Server/appsettings.json @@ -0,0 +1,38 @@ +{ + "ConnectionStrings": { + "IkarDb": "Data Source=Data/ikar.db" + }, + "Jwt": { + "Issuer": "Ikar.Server", + "Audience": "Ikar.Client", + "SigningKey": "Ikar-Replace-This-Development-Key-With-A-Long-Random-Secret-CHANGE_ME_USE_SECRET_STORE_VALUE_32_CHARS_MINIMUM", + "AccessTokenLifetimeMinutes": 15, + "RefreshTokenLifetimeDays": 30 + }, + "Push": { + "FirebaseProjectId": "", + "ServiceAccountJsonPath": "", + "ServiceAccountJson": "" + }, + "WebRtc": { + "IceServers": [ + { + "Urls": [ + "stun:stun.l.google.com:19302" + ] + } + ] + }, + "Admin": { + "Username": "", + "Password": "" + }, + "SeedDemoData": false, + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*" +} diff --git a/src/Ikar.Server/wwwroot/admin/admin.css b/src/Ikar.Server/wwwroot/admin/admin.css new file mode 100644 index 00000000..184bc1fa --- /dev/null +++ b/src/Ikar.Server/wwwroot/admin/admin.css @@ -0,0 +1,704 @@ +:root { + --paper: #f4f1ea; + --paper-2: #ebe6dc; + --ink: #14171b; + --ink-2: #2a3038; + --muted: #68707b; + --line: #c9c2b5; + --line-strong: #9e9688; + --panel: #fffdf8; + --rail: #171b20; + --rail-2: #20262e; + --accent: #0f5f9f; + --accent-2: #0b7c86; + --warning: #a56300; + --danger: #b3261e; + --ok: #256b3b; + --shadow: 0 24px 80px rgba(34, 29, 22, 0.12); + --font: "Aptos", "Segoe UI Variable", "Segoe UI", sans-serif; + --mono: "Cascadia Mono", "JetBrains Mono", "Consolas", monospace; +} + +* { + box-sizing: border-box; +} + +html, +body { + margin: 0; + min-height: 100%; +} + +body { + background: + linear-gradient(90deg, rgba(20, 23, 27, 0.035) 1px, transparent 1px), + linear-gradient(0deg, rgba(20, 23, 27, 0.025) 1px, transparent 1px), + linear-gradient(135deg, #f9f6ef 0%, var(--paper) 48%, #e7edf0 100%); + background-size: 40px 40px, 40px 40px, auto; + color: var(--ink); + font-family: var(--font); +} + +button, +input, +select { + font: inherit; +} + +button { + border-radius: 0; +} + +.hidden { + display: none !important; +} + +.login-view { + min-height: 100vh; + display: grid; + place-items: center; + padding: 32px; +} + +.login-card { + width: min(480px, 100%); + border: 1px solid var(--line-strong); + background: var(--panel); + padding: 34px; + box-shadow: var(--shadow); +} + +.login-card h1, +.topbar h1, +.command-panel h2, +.empty-state h2 { + margin: 0; + letter-spacing: -0.035em; +} + +.login-card h1 { + font-size: clamp(32px, 5vw, 52px); + line-height: 0.95; +} + +.app-shell { + min-height: 100vh; + display: grid; + grid-template-columns: 292px minmax(0, 1fr); +} + +.rail { + position: sticky; + top: 0; + height: 100vh; + display: flex; + flex-direction: column; + gap: 22px; + padding: 22px; + border-right: 1px solid #0b0d10; + background: + linear-gradient(180deg, rgba(255, 255, 255, 0.04), transparent 30%), + var(--rail); + color: #f5efe4; +} + +.brand { + display: grid; + grid-template-columns: 46px minmax(0, 1fr); + gap: 12px; + align-items: center; + padding-bottom: 18px; + border-bottom: 1px solid rgba(255, 255, 255, 0.14); +} + +.brand-mark { + display: grid; + place-items: center; + width: 46px; + height: 46px; + border: 1px solid rgba(255, 255, 255, 0.35); + background: #f5efe4; + color: var(--rail); + font-weight: 850; + letter-spacing: -0.08em; +} + +.brand-title { + font-size: 21px; + font-weight: 820; + letter-spacing: -0.04em; +} + +.brand-subtitle, +.rail-label, +.rail-search span, +.eyebrow, +.muted, +.cell-secondary, +th, +.topbar-meta, +.counter { + color: var(--muted); +} + +.rail .muted, +.rail-label, +.rail-search span, +.brand-subtitle { + color: rgba(245, 239, 228, 0.62); +} + +.rail-section { + border: 1px solid rgba(255, 255, 255, 0.14); + padding: 13px; + background: rgba(255, 255, 255, 0.035); +} + +.rail-value { + margin-top: 6px; + overflow: hidden; + color: #fffdf8; + font-weight: 760; + text-overflow: ellipsis; +} + +.rail-search { + display: grid; + gap: 8px; +} + +.rail-search input, +.field input, +.toolbar select, +.toolbar input, +.inspector input, +.inspector select { + width: 100%; + min-height: 40px; + border: 1px solid var(--line-strong); + border-radius: 0; + background: #fffdf8; + color: var(--ink); + padding: 9px 10px; +} + +.rail-search input { + border-color: rgba(255, 255, 255, 0.2); + background: #101318; + color: #fffdf8; +} + +input:focus, +select:focus, +button:focus-visible { + outline: 2px solid color-mix(in srgb, var(--accent) 40%, transparent); + outline-offset: 2px; +} + +.nav-list { + display: grid; + gap: 6px; +} + +.nav-item { + width: 100%; + border: 1px solid transparent; + background: transparent; + color: rgba(245, 239, 228, 0.72); + cursor: pointer; + padding: 11px 12px; + text-align: left; +} + +.nav-item:hover, +.nav-item.active { + border-color: rgba(255, 255, 255, 0.18); + background: var(--rail-2); + color: #fffdf8; +} + +.rail-footer { + display: grid; + gap: 9px; + margin-top: auto; +} + +.workspace { + min-width: 0; + padding: 28px; +} + +.topbar { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 24px; + margin-bottom: 20px; +} + +.topbar h1 { + font-size: clamp(28px, 4vw, 46px); + line-height: 0.98; +} + +.topbar-meta { + display: flex; + flex-wrap: wrap; + gap: 10px; + align-items: center; + justify-content: flex-end; + font-size: 13px; +} + +.section { + display: none; +} + +.section.active { + display: grid; + gap: 18px; +} + +.hero-grid { + display: grid; + grid-template-columns: minmax(0, 1.55fr) minmax(320px, 0.85fr); + gap: 18px; +} + +.split-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 18px; +} + +.registry-layout { + display: grid; + grid-template-columns: minmax(0, 1fr) minmax(360px, 460px); + gap: 18px; + align-items: start; +} + +.command-panel, +.inspector { + border: 1px solid var(--line); + background: color-mix(in srgb, var(--panel) 92%, white); + box-shadow: 0 1px 0 rgba(255, 255, 255, 0.7) inset; +} + +.command-panel { + padding: 18px; +} + +.inspector { + position: sticky; + top: 18px; + max-height: calc(100vh - 56px); + overflow: auto; + padding: 0; +} + +.panel-head { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 16px; + margin-bottom: 14px; +} + +.eyebrow { + margin: 0 0 7px; + font-size: 11px; + font-weight: 850; + letter-spacing: 0.13em; + text-transform: uppercase; +} + +.muted { + line-height: 1.55; +} + +.mono { + font-family: var(--mono); +} + +.metric-grid { + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: 10px; +} + +.metric-grid.compact { + grid-template-columns: repeat(3, minmax(0, 1fr)); +} + +.metric { + min-height: 104px; + border: 1px solid var(--line); + background: #fbf8f1; + padding: 13px; +} + +.metric-label { + color: var(--muted); + font-size: 11px; + font-weight: 800; + letter-spacing: 0.08em; + text-transform: uppercase; +} + +.metric-value { + margin-top: 12px; + font-size: clamp(24px, 3vw, 34px); + font-weight: 860; + letter-spacing: -0.045em; +} + +.metric-note { + margin-top: 8px; + color: var(--muted); + font-size: 13px; +} + +.focus-list, +.feature-matrix, +.action-stack, +.stack { + display: grid; + gap: 10px; +} + +.focus-item, +.feature-row, +.operation-result { + border-left: 4px solid var(--line-strong); + background: #fbf8f1; + padding: 12px; +} + +.focus-item.ok { + border-left-color: var(--ok); +} + +.focus-item.warn { + border-left-color: var(--warning); +} + +.focus-item.danger { + border-left-color: var(--danger); +} + +.feature-row { + display: flex; + justify-content: space-between; + gap: 12px; +} + +.toolbar { + display: flex; + flex-wrap: wrap; + gap: 12px; + margin-bottom: 12px; +} + +.toolbar label { + display: grid; + min-width: 180px; + gap: 6px; + color: var(--muted); + font-size: 13px; +} + +.table-wrap { + overflow: auto; + border: 1px solid var(--line); + background: #fffdf8; +} + +table { + width: 100%; + border-collapse: collapse; +} + +th, +td { + padding: 11px 12px; + border-bottom: 1px solid #e2dbcf; + text-align: left; + vertical-align: top; +} + +th { + position: sticky; + top: 0; + z-index: 1; + background: #ede7dc; + font-size: 11px; + font-weight: 850; + letter-spacing: 0.08em; + text-transform: uppercase; +} + +td { + font-size: 14px; +} + +tr[data-chat-id], +tr[data-row-click] { + cursor: pointer; +} + +tr[data-chat-id]:hover, +tr[data-row-click]:hover { + background: #f7f1e7; +} + +tr.selected { + background: #eef5f4; + box-shadow: inset 4px 0 0 var(--accent-2); +} + +.cell-primary { + font-weight: 780; +} + +.cell-secondary { + margin-top: 4px; + font-size: 12px; + line-height: 1.45; +} + +.status, +.counter, +.rect-badge { + display: inline-flex; + align-items: center; + min-height: 28px; + border: 1px solid var(--line-strong); + background: #fffdf8; + padding: 5px 8px; + font-size: 12px; + font-weight: 780; + white-space: nowrap; +} + +.status.ok, +.rect-badge.ok { + border-color: color-mix(in srgb, var(--ok) 60%, var(--line)); + color: var(--ok); +} + +.status.warn, +.rect-badge.warn { + border-color: color-mix(in srgb, var(--warning) 60%, var(--line)); + color: var(--warning); +} + +.status.danger, +.rect-badge.danger { + border-color: color-mix(in srgb, var(--danger) 60%, var(--line)); + color: var(--danger); +} + +.button { + border: 1px solid var(--line-strong); + background: #fffdf8; + color: var(--ink); + cursor: pointer; + min-height: 38px; + padding: 9px 12px; + font-weight: 780; +} + +.button:hover { + transform: translateY(-1px); +} + +.button.primary { + border-color: var(--accent); + background: var(--accent); + color: #fff; +} + +.button.secondary { + border-color: var(--ink-2); + background: var(--ink-2); + color: #fffdf8; +} + +.button.ghost { + background: transparent; + color: inherit; +} + +.button.danger { + border-color: var(--danger); + background: #fff7f4; + color: var(--danger); +} + +.button.small { + min-height: 30px; + padding: 6px 8px; + font-size: 12px; +} + +.action-row { + display: flex; + flex-wrap: wrap; + gap: 7px; +} + +.table-link { + color: var(--accent); + font-weight: 800; + text-decoration: none; +} + +.table-link:hover { + text-decoration: underline; +} + +.notice, +.toast { + border: 1px solid var(--line-strong); + background: #fff9e9; + color: #6b3f00; + padding: 12px 14px; +} + +.notice { + margin-bottom: 16px; +} + +.toast { + position: fixed; + right: 22px; + bottom: 22px; + z-index: 20; + max-width: min(460px, calc(100vw - 44px)); + background: var(--ink); + color: #fffdf8; +} + +.field { + display: grid; + gap: 7px; +} + +.field span { + color: var(--muted); + font-size: 13px; +} + +.inspector-block { + padding: 16px; + border-bottom: 1px solid var(--line); +} + +.inspector-block h3 { + margin: 0 0 10px; + font-size: 16px; +} + +.inspector-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 10px; +} + +.check-line { + display: flex; + align-items: center; + gap: 8px; + min-height: 36px; +} + +.check-line input { + width: auto; +} + +.empty-state { + padding: 22px; +} + +.mini-list { + display: grid; + gap: 8px; +} + +.mini-row { + border: 1px solid #e2dbcf; + background: #fbf8f1; + padding: 10px; +} + +.permissions-grid { + display: grid; + grid-template-columns: 1fr; + gap: 8px; +} + +.permission-row { + border: 1px solid #e2dbcf; + padding: 10px; + background: #fffdf8; +} + +.permission-controls { + display: grid; + grid-template-columns: minmax(120px, 0.9fr) repeat(4, minmax(70px, 1fr)) auto; + gap: 8px; + align-items: center; + margin-top: 8px; +} + +.coverage-list { + margin: 0; + padding-left: 18px; + color: var(--ink-2); + line-height: 1.65; +} + +@media (max-width: 1280px) { + .metric-grid, + .metric-grid.compact { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .hero-grid, + .split-grid, + .registry-layout { + grid-template-columns: 1fr; + } + + .inspector { + position: static; + max-height: none; + } +} + +@media (max-width: 860px) { + .app-shell { + grid-template-columns: 1fr; + } + + .rail { + position: static; + height: auto; + } + + .workspace { + padding: 18px; + } + + .topbar { + display: grid; + } + + .metric-grid, + .metric-grid.compact, + .inspector-grid, + .permission-controls { + grid-template-columns: 1fr; + } +} diff --git a/src/Ikar.Server/wwwroot/admin/admin.js b/src/Ikar.Server/wwwroot/admin/admin.js new file mode 100644 index 00000000..de50b74a --- /dev/null +++ b/src/Ikar.Server/wwwroot/admin/admin.js @@ -0,0 +1,1027 @@ +const state = { + session: null, + activeSection: "overview", + query: "", + status: null, + compatibility: null, + users: [], + chats: [], + attachments: [], + moderation: [], + selectedChatId: null, + selectedChatDetails: null, + refreshTimer: null, +}; + +const sectionMeta = { + overview: ["Обзор", "Операционная картина"], + users: ["Пользователи", "Пользователи и боты"], + chats: ["Чаты и каналы", "Управление чатами, группами и каналами"], + media: ["Медиа", "Хранилище вложений"], + moderation: ["Модерация", "Журнал действий"], + updates: ["Обновления", "Android-релизы и совместимость"], + operations: ["Операции", "Maintenance и контроль данных"], +}; + +const elements = { + loginView: document.getElementById("loginView"), + appView: document.getElementById("appView"), + loginForm: document.getElementById("loginForm"), + loginUsername: document.getElementById("loginUsername"), + loginPassword: document.getElementById("loginPassword"), + loginNotice: document.getElementById("loginNotice"), + adminIdentity: document.getElementById("adminIdentity"), + globalSearch: document.getElementById("globalSearch"), + refreshButton: document.getElementById("refreshButton"), + logoutButton: document.getElementById("logoutButton"), + sectionKicker: document.getElementById("sectionKicker"), + sectionTitle: document.getElementById("sectionTitle"), + lastUpdated: document.getElementById("lastUpdated"), + healthBadge: document.getElementById("healthBadge"), + noticeBar: document.getElementById("noticeBar"), + metricGrid: document.getElementById("metricGrid"), + uptimeValue: document.getElementById("uptimeValue"), + focusList: document.getElementById("focusList"), + featureMatrix: document.getElementById("featureMatrix"), + usersCount: document.getElementById("usersCount"), + usersTable: document.getElementById("usersTable"), + chatsCount: document.getElementById("chatsCount"), + chatsTable: document.getElementById("chatsTable"), + chatTypeFilter: document.getElementById("chatTypeFilter"), + chatAttentionFilter: document.getElementById("chatAttentionFilter"), + chatInspector: document.getElementById("chatInspector"), + attachmentsCount: document.getElementById("attachmentsCount"), + attachmentsTable: document.getElementById("attachmentsTable"), + moderationCount: document.getElementById("moderationCount"), + moderationTable: document.getElementById("moderationTable"), + compatibilityCount: document.getElementById("compatibilityCount"), + compatibilitySummary: document.getElementById("compatibilitySummary"), + updateRiskList: document.getElementById("updateRiskList"), + compatibilityRoutesTable: document.getElementById("compatibilityRoutesTable"), + compatibilityVersionsTable: document.getElementById("compatibilityVersionsTable"), + compatibilityHitsTable: document.getElementById("compatibilityHitsTable"), + operationResult: document.getElementById("operationResult"), + toast: document.getElementById("toast"), +}; + +document.addEventListener("DOMContentLoaded", () => { + wireEvents(); + initialize().catch(handleError); +}); + +function wireEvents() { + elements.loginForm.addEventListener("submit", async (event) => { + event.preventDefault(); + await login(); + }); + + elements.refreshButton.addEventListener("click", () => refreshAll().catch(handleError)); + elements.logoutButton.addEventListener("click", () => logout().catch(handleError)); + elements.chatTypeFilter.addEventListener("change", renderChats); + elements.chatAttentionFilter.addEventListener("change", renderChats); + + elements.globalSearch.addEventListener("input", () => { + window.clearTimeout(state.refreshTimer); + state.refreshTimer = window.setTimeout(() => { + state.query = elements.globalSearch.value.trim(); + refreshAll().catch(handleError); + }, 360); + }); + + document.addEventListener("click", handleDocumentClick); +} + +async function initialize() { + state.session = await fetchJson("/admin/api/session", { method: "GET" }, false); + renderSession(); + + if (!state.session.configured) { + showLogin("Административные учетные данные на сервере не настроены."); + return; + } + + if (!state.session.authenticated) { + showLogin(); + return; + } + + showApp(); + await refreshAll(); +} + +async function login() { + elements.loginNotice.classList.add("hidden"); + await fetchJson("/admin/api/session/login", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + username: elements.loginUsername.value.trim(), + password: elements.loginPassword.value, + }), + }, false); + + state.session = await fetchJson("/admin/api/session", { method: "GET" }, false); + elements.loginPassword.value = ""; + renderSession(); + showApp(); + await refreshAll(); +} + +async function logout() { + await fetchJson("/admin/api/session/logout", { method: "POST" }); + state.session = await fetchJson("/admin/api/session", { method: "GET" }, false); + state.selectedChatId = null; + state.selectedChatDetails = null; + renderSession(); + showLogin(); +} + +async function refreshAll() { + state.query = elements.globalSearch.value.trim(); + const query = state.query ? `?q=${encodeURIComponent(state.query)}` : ""; + + const [status, compatibility, users, chats, attachments, moderation] = await Promise.all([ + fetchJson("/admin/api/status"), + fetchJson("/admin/api/app-updates/compatibility-report"), + fetchJson(`/admin/api/users${query}`), + fetchJson(`/admin/api/chats${query}`), + fetchJson(`/admin/api/attachments${query}`), + fetchJson("/admin/api/moderation-log?limit=150"), + ]); + + state.status = status; + state.compatibility = compatibility; + state.users = users || []; + state.chats = chats || []; + state.attachments = attachments || []; + state.moderation = moderation || []; + + if (state.selectedChatId) { + await loadChatDetails(state.selectedChatId, false); + } + + elements.lastUpdated.textContent = `обновлено ${new Date().toLocaleTimeString("ru-RU")}`; + renderAll(); +} + +async function loadChatDetails(chatId, rerender = true) { + state.selectedChatId = chatId; + state.selectedChatDetails = await fetchJson(`/admin/api/chats/${chatId}/details`); + if (rerender) { + renderChats(); + renderChatInspector(); + } +} + +function showLogin(message) { + elements.appView.classList.add("hidden"); + elements.loginView.classList.remove("hidden"); + if (message) { + elements.loginNotice.textContent = message; + elements.loginNotice.classList.remove("hidden"); + } else { + elements.loginNotice.classList.add("hidden"); + } +} + +function showApp() { + elements.loginView.classList.add("hidden"); + elements.appView.classList.remove("hidden"); + setSection(state.activeSection); +} + +function setSection(section) { + state.activeSection = section; + document.querySelectorAll(".nav-item").forEach((item) => { + item.classList.toggle("active", item.dataset.section === section); + }); + document.querySelectorAll(".section").forEach((panel) => { + panel.classList.toggle("active", panel.dataset.panel === section); + }); + + const [kicker, title] = sectionMeta[section] || sectionMeta.overview; + elements.sectionKicker.textContent = kicker; + elements.sectionTitle.textContent = title; +} + +function renderAll() { + renderStatus(); + renderUsers(); + renderChats(); + renderAttachments(); + renderModeration(); + renderCompatibility(); + renderChatInspector(); +} + +function renderSession() { + elements.adminIdentity.textContent = state.session?.authenticated ? state.session.username : "Гость"; +} + +function renderStatus() { + const status = state.status; + if (!status) { + return; + } + + const healthy = Boolean(status.databaseReachable); + elements.healthBadge.textContent = healthy ? "База доступна" : "База недоступна"; + elements.healthBadge.className = `status ${healthy ? "ok" : "danger"}`; + elements.uptimeValue.textContent = formatDuration(status.startedAtUtc, status.currentTimeUtc); + + elements.metricGrid.innerHTML = [ + metric("Пользователи", status.totalUsers, `${status.blockedUsers} заблокировано, ${status.botUsers} ботов`), + metric("Чаты", status.totalChats, `${status.groupChats} групп, ${status.channelChats} каналов`), + metric("Сообщения", status.totalMessages, `${status.pinnedMessages} закреплено, ${status.expiringMessages} с TTL`), + metric("Медиа", status.totalAttachments, formatBytes(status.attachmentBytes)), + metric("Protected", status.protectedChats, `${status.protectedMessages} защищенных сообщений`), + metric("Stories", status.totalStories, `${status.activeStories} активных, ${status.protectedStories} protected`), + metric("Join requests", status.pendingJoinRequests, `${status.activeInviteLinks} активных invite links`), + metric("Сессии", status.activeSessions, `${status.registeredPushDevices} push-устройств`), + ].join(""); + + elements.focusList.innerHTML = [ + focus(healthy ? "ok" : "danger", "База данных", healthy ? "Соединение активно." : "Нужно проверить подключение к БД."), + focus(status.pendingJoinRequests > 0 ? "warn" : "ok", "Заявки на вход", `${status.pendingJoinRequests} ожидают решения.`), + focus(status.expiringMessages > 0 ? "warn" : "ok", "TTL-сообщения", `${status.expiringMessages} активных сообщений с автоудалением.`), + focus(status.blockedUsers > 0 ? "warn" : "ok", "Ограниченные аккаунты", `${status.blockedUsers} пользователей заблокировано.`), + focus(status.moderationEvents > 0 ? "ok" : "warn", "Модерация", `${status.moderationEvents} событий в журнале.`), + ].join(""); + + elements.featureMatrix.innerHTML = [ + feature("Пользователи и privacy", `${status.totalUsers} аккаунтов`, status.totalUsers > 0), + feature("Группы и каналы", `${status.groupChats + status.channelChats} публичных контуров`, status.groupChats + status.channelChats > 0), + feature("Protected content", `${status.protectedChats} чатов`, status.protectedChats > 0), + feature("Топики и роли", `${status.topics} топиков`, status.topics > 0), + feature("Истории", `${status.activeStories} активных`, status.totalStories > 0), + feature("Боты", `${status.enabledBots}/${status.totalBots} включено`, status.totalBots > 0), + ].join(""); +} + +function renderUsers() { + elements.usersCount.textContent = `${state.users.length} строк`; + elements.usersTable.innerHTML = state.users.length === 0 + ? emptyRow("Пользователи по текущему фильтру не найдены.", 9) + : state.users.map((user) => ` + <tr> + <td> + <div class="cell-primary">${escapeHtml(displayName(user.displayName, user.username))}</div> + <div class="cell-secondary">@${escapeHtml(user.username)}${user.phoneNumber ? ` · ${escapeHtml(user.phoneNumber)}` : ""}</div> + ${user.about ? `<div class="cell-secondary">${escapeHtml(user.about)}</div>` : ""} + </td> + <td>${badge(user.isBot ? "Бот" : "Человек", user.isBot ? "warn" : "ok")}</td> + <td>${formatDate(user.createdAt)}</td> + <td>${user.lastSeenAt ? formatDate(user.lastSeenAt) : "—"}</td> + <td>${renderUserClientVersion(user)}</td> + <td>${user.activeSessions} / ${user.pushDevices}</td> + <td>${user.chatMemberships} / ${user.messagesSent}</td> + <td> + ${badge(user.passcodeLockEnabled ? "Passcode" : "Без lock", user.passcodeLockEnabled ? "ok" : "warn")} + <div class="cell-secondary">${user.showMessagePreview ? "Preview включены" : "Preview скрыты"}</div> + </td> + <td> + <div class="action-row"> + <button class="button small" type="button" data-action="${user.isBlocked ? "unblock-user" : "block-user"}" data-user-id="${escapeAttribute(user.id)}"> + ${user.isBlocked ? "Разблокировать" : "Заблокировать"} + </button> + <button class="button small danger" type="button" data-action="delete-user" data-user-id="${escapeAttribute(user.id)}" data-user-name="${escapeAttribute(user.username)}"> + Удалить + </button> + </div> + </td> + </tr> + `).join(""); +} + +function renderUserClientVersion(user) { + const versions = Array.isArray(user.clientVersions) ? user.clientVersions : []; + if (!versions.length && user.clientVersionCode == null && !user.clientVersionName && !user.clientPlatform) { + return "—"; + } + + const platform = user.clientPlatform ? escapeHtml(user.clientPlatform) : "unknown"; + const details = versions.slice(0, 3).map((version) => { + const sessions = Number(version.sessions || 0); + const pushDevices = Number(version.pushDevices || 0); + const countParts = []; + if (sessions > 0) { + countParts.push(`${sessions} сесс.`); + } + if (pushDevices > 0) { + countParts.push(`${pushDevices} push`); + } + const countLabel = countParts.length ? ` · ${countParts.join(" / ")}` : ""; + const seenLabel = version.lastSeenAt ? ` · ${formatDate(version.lastSeenAt)}` : ""; + return `<div class="cell-secondary">${escapeHtml(version.clientPlatform || "unknown")} · ${formatVersion(version.clientVersionCode, version.clientVersionName)}${countLabel}${seenLabel}</div>`; + }).join(""); + + return ` + <div class="cell-primary">${formatVersion(user.clientVersionCode, user.clientVersionName)}</div> + <div class="cell-secondary">${platform}</div> + ${details} + `; +} + +function renderChats() { + const typeFilter = elements.chatTypeFilter.value; + const attentionFilter = elements.chatAttentionFilter.value; + const rows = state.chats.filter((chat) => { + if (typeFilter !== "all" && chat.type !== typeFilter) { + return false; + } + if (attentionFilter === "pending") { + return chat.pendingJoinRequests > 0; + } + if (attentionFilter === "protected") { + return chat.hasProtectedContent || chat.protectedMessages > 0; + } + if (attentionFilter === "topics") { + return chat.topicsEnabled || chat.topics > 0; + } + return true; + }); + + elements.chatsCount.textContent = `${rows.length} строк`; + elements.chatsTable.innerHTML = rows.length === 0 + ? emptyRow("Чаты по текущему фильтру не найдены.", 8) + : rows.map((chat) => ` + <tr data-chat-id="${escapeAttribute(chat.id)}" class="${chat.id === state.selectedChatId ? "selected" : ""}"> + <td> + <div class="cell-primary">${escapeHtml(chat.title)}</div> + <div class="cell-secondary">${chat.publicUsername ? `@${escapeHtml(chat.publicUsername)}` : "без public username"}</div> + </td> + <td>${formatChatType(chat.type)}</td> + <td>${escapeHtml(chat.createdBy || "—")}</td> + <td>${chat.lastActivityAt ? formatDate(chat.lastActivityAt) : formatDate(chat.createdAt)}</td> + <td>${chat.members}</td> + <td> + <div>${chat.messages}</div> + <div class="cell-secondary">${chat.pinnedMessages} pinned · ${chat.protectedMessages} protected</div> + </td> + <td> + <div class="action-row"> + ${chat.hasProtectedContent ? badge("Protected", "ok") : badge("Обычный", "warn")} + ${chat.pendingJoinRequests > 0 ? badge(`${chat.pendingJoinRequests} заявок`, "warn") : ""} + ${chat.topicsEnabled ? badge(`${chat.topics} топиков`, "ok") : ""} + </div> + </td> + <td> + <div class="action-row"> + <button class="button small" type="button" data-action="open-chat" data-chat-id="${escapeAttribute(chat.id)}">Инспектор</button> + <button class="button small danger" type="button" data-action="delete-chat" data-chat-id="${escapeAttribute(chat.id)}" data-chat-title="${escapeAttribute(chat.title)}">Удалить</button> + </div> + </td> + </tr> + `).join(""); +} + +function renderChatInspector() { + const details = state.selectedChatDetails; + if (!details) { + elements.chatInspector.innerHTML = ` + <div class="empty-state"> + <p class="eyebrow">Инспектор</p> + <h2>Выберите чат</h2> + <p class="muted">Здесь появятся настройки protected mode, TTL, public username, участники, права, invite links и заявки на вход.</p> + </div> + `; + return; + } + + const chat = details.chat; + elements.chatInspector.innerHTML = ` + <div class="inspector-block"> + <p class="eyebrow">${formatChatType(chat.type)}</p> + <h2>${escapeHtml(chat.title)}</h2> + <p class="muted">${chat.members} участников · ${chat.messages} сообщений · ${chat.attachments} вложений</p> + </div> + + <div class="inspector-block"> + <h3>Настройки чата</h3> + <div class="inspector-grid"> + <label class="field"> + <span>Public username</span> + <input id="chatPublicUsername" value="${escapeAttribute(chat.publicUsername || "")}" placeholder="channel_name"> + </label> + <label class="field"> + <span>TTL по умолчанию, сек.</span> + <input id="chatTtlSeconds" type="number" min="0" value="${chat.defaultMessageTtlSeconds ?? ""}" placeholder="0 = выключено"> + </label> + <label class="check-line"> + <input id="chatTopicsEnabled" type="checkbox" ${chat.topicsEnabled ? "checked" : ""}> + <span>Топики включены</span> + </label> + <label class="check-line"> + <input id="chatProtected" type="checkbox" ${chat.hasProtectedContent ? "checked" : ""}> + <span>Protected content</span> + </label> + </div> + <div class="action-row" style="margin-top: 12px"> + <button class="button secondary" type="button" data-action="save-chat-settings" data-chat-id="${escapeAttribute(chat.id)}">Сохранить настройки</button> + </div> + </div> + + <div class="inspector-block"> + <h3>Участники и права</h3> + <div class="permissions-grid"> + ${details.members.length === 0 ? `<div class="muted">Участников нет.</div>` : details.members.map(renderMemberPermissions).join("")} + </div> + </div> + + <div class="inspector-block"> + <h3>Invite links</h3> + <div class="inspector-grid"> + <label class="field"> + <span>Название ссылки</span> + <input id="newInviteTitle" placeholder="Например: Публичная ссылка"> + </label> + <label class="check-line"> + <input id="newInviteRequiresApproval" type="checkbox"> + <span>Требовать approval</span> + </label> + </div> + <div class="action-row" style="margin-top: 12px"> + <button class="button secondary" type="button" data-action="create-invite" data-chat-id="${escapeAttribute(chat.id)}">Создать ссылку</button> + </div> + <div class="mini-list" style="margin-top: 12px"> + ${details.inviteLinks.length === 0 ? `<div class="muted">Ссылок пока нет.</div>` : details.inviteLinks.map((link) => ` + <div class="mini-row"> + <div class="cell-primary">${escapeHtml(link.title || "Без названия")}</div> + <div class="cell-secondary mono">${escapeHtml(link.link)}</div> + <div class="action-row" style="margin-top: 8px"> + ${badge(link.createsJoinRequest ? "approval" : "direct join", link.createsJoinRequest ? "warn" : "ok")} + ${badge(link.isRevoked ? "отозвана" : "активна", link.isRevoked ? "danger" : "ok")} + ${link.isRevoked ? "" : `<button class="button small danger" type="button" data-action="revoke-invite" data-chat-id="${escapeAttribute(chat.id)}" data-invite-id="${escapeAttribute(link.id)}">Отозвать</button>`} + </div> + </div> + `).join("")} + </div> + </div> + + <div class="inspector-block"> + <h3>Заявки на вход</h3> + <div class="mini-list"> + ${details.joinRequests.length === 0 ? `<div class="muted">Заявок нет.</div>` : details.joinRequests.map((request) => ` + <div class="mini-row"> + <div class="cell-primary">${escapeHtml(displayName(request.displayName, request.username))}</div> + <div class="cell-secondary">${formatDate(request.requestedAt)} · ${formatJoinStatus(request.status)}</div> + ${isPendingJoinRequest(request.status) ? ` + <div class="action-row" style="margin-top: 8px"> + <button class="button small secondary" type="button" data-action="resolve-join" data-approve="true" data-chat-id="${escapeAttribute(chat.id)}" data-request-id="${escapeAttribute(request.id)}">Одобрить</button> + <button class="button small danger" type="button" data-action="resolve-join" data-approve="false" data-chat-id="${escapeAttribute(chat.id)}" data-request-id="${escapeAttribute(request.id)}">Отклонить</button> + </div> + ` : ""} + </div> + `).join("")} + </div> + </div> + + <div class="inspector-block"> + <h3>Топики</h3> + <div class="mini-list"> + ${details.topics.length === 0 ? `<div class="muted">Топиков нет.</div>` : details.topics.map((topic) => ` + <div class="mini-row"> + <div class="cell-primary">${escapeHtml(topic.icon || "")} ${escapeHtml(topic.title)}</div> + <div class="cell-secondary">${topic.messageCount} сообщений · ${topic.isPinned ? "закреплен" : "обычный"} · ${topic.isClosed ? "закрыт" : "открыт"}</div> + </div> + `).join("")} + </div> + </div> + + <div class="inspector-block"> + <h3>Последние сообщения</h3> + <div class="mini-list"> + ${details.recentMessages.length === 0 ? `<div class="muted">Сообщений нет.</div>` : details.recentMessages.map((message) => ` + <div class="mini-row"> + <div class="cell-primary">${escapeHtml(message.sender)} · ${formatDate(message.sentAt)}</div> + <div class="cell-secondary">${message.deletedAt ? "Сообщение удалено" : escapeHtml(shorten(message.text || "медиа-сообщение", 160))}</div> + <div class="cell-secondary">${message.attachments} вложений · ${message.reactions} реакций ${message.hasProtectedContent ? "· protected" : ""}</div> + </div> + `).join("")} + </div> + </div> + + <div class="inspector-block"> + <h3>Модерация чата</h3> + <div class="mini-list"> + ${details.moderationLog.length === 0 ? `<div class="muted">Событий нет.</div>` : details.moderationLog.map((event) => ` + <div class="mini-row"> + <div class="cell-primary">${escapeHtml(event.action)}</div> + <div class="cell-secondary">${formatDate(event.createdAt)} · ${escapeHtml(event.actorDisplayName || "—")}</div> + </div> + `).join("")} + </div> + </div> + `; +} + +function renderMemberPermissions(member) { + const role = normalizeRole(member.role); + return ` + <div class="permission-row" data-member-id="${escapeAttribute(member.userId)}"> + <div class="cell-primary">${escapeHtml(displayName(member.displayName, member.username))}</div> + <div class="cell-secondary">@${escapeHtml(member.username)}${member.isBot ? " · бот" : ""}</div> + <div class="permission-controls"> + <select data-field="role"> + <option value="0" ${role === "Member" ? "selected" : ""}>Member</option> + <option value="1" ${role === "Admin" ? "selected" : ""}>Admin</option> + <option value="2" ${role === "Owner" ? "selected" : ""}>Owner</option> + </select> + ${permissionCheckbox("pin", "Pin", member.canPinMessages)} + ${permissionCheckbox("delete", "Delete", member.canDeleteMessages)} + ${permissionCheckbox("invite", "Invite", member.canInviteUsers)} + ${permissionCheckbox("post", "Post", member.canPostMessages)} + <button class="button small" type="button" data-action="save-member-permissions" data-chat-id="${escapeAttribute(state.selectedChatId)}" data-member-id="${escapeAttribute(member.userId)}">Сохранить</button> + </div> + </div> + `; +} + +function renderAttachments() { + elements.attachmentsCount.textContent = `${state.attachments.length} строк`; + elements.attachmentsTable.innerHTML = state.attachments.length === 0 + ? emptyRow("Вложения по текущему фильтру не найдены.", 7) + : state.attachments.map((attachment) => ` + <tr> + <td> + <div class="cell-primary">${escapeHtml(attachment.fileName)}</div> + <div class="cell-secondary">${escapeHtml(attachment.contentType || "application/octet-stream")} · sort ${attachment.sortOrder}</div> + ${attachment.mediaAlbumId ? `<div class="cell-secondary mono">album ${escapeHtml(attachment.mediaAlbumId)}</div>` : ""} + </td> + <td>${escapeHtml(attachment.chatTitle)}</td> + <td>${escapeHtml(attachment.uploadedBy)}</td> + <td>${formatDate(attachment.uploadedAt)}</td> + <td>${formatBytes(attachment.fileSizeBytes)}</td> + <td> + <div class="action-row"> + ${badge(attachment.exists ? "файл есть" : "нет файла", attachment.exists ? "ok" : "danger")} + ${attachment.isProtected ? badge("protected", "ok") : ""} + </div> + </td> + <td> + <div class="action-row"> + ${attachment.exists ? `<a class="table-link" href="${escapeAttribute(attachment.downloadPath)}" target="_blank" rel="noopener">Скачать</a>` : ""} + <button class="button small danger" type="button" data-action="delete-attachment" data-attachment-id="${escapeAttribute(attachment.id)}" data-file-name="${escapeAttribute(attachment.fileName)}">Удалить</button> + </div> + </td> + </tr> + `).join(""); +} + +function renderModeration() { + elements.moderationCount.textContent = `${state.moderation.length} событий`; + elements.moderationTable.innerHTML = state.moderation.length === 0 + ? emptyRow("Журнал модерации пуст.", 6) + : state.moderation.map((event) => ` + <tr> + <td>${formatDate(event.createdAt)}</td> + <td>${escapeHtml(event.actorDisplayName || "—")}</td> + <td> + <div class="cell-primary">${formatModerationTarget(event.targetType)}</div> + <div class="cell-secondary mono">${escapeHtml(event.targetId || "—")}</div> + </td> + <td>${escapeHtml(event.action)}</td> + <td>${escapeHtml(event.reason || "—")}</td> + <td class="mono">${escapeHtml(event.chatId || "—")}</td> + </tr> + `).join(""); +} + +function renderCompatibility() { + const report = state.compatibility; + if (!report) { + return; + } + + elements.compatibilityCount.textContent = `${report.recentHits.length} последних записей`; + elements.compatibilitySummary.innerHTML = [ + metric("Хиты за 24 часа", report.totalHitsLast24Hours, `${report.hitsWithoutVersionLast24Hours} без версии`), + metric("Хиты за 7 дней", report.totalHitsLast7Days, `${report.hitsWithoutVersionLast7Days} без версии`), + metric("Последний запрос", report.latestHitAt ? formatDate(report.latestHitAt) : "нет данных", "мониторинг обновлений"), + ].join(""); + + elements.updateRiskList.innerHTML = [ + focus(report.hitsWithoutVersionLast24Hours > 0 ? "warn" : "ok", "Без versionCode за 24 часа", `${report.hitsWithoutVersionLast24Hours} обращений.`), + focus(report.hitsWithoutVersionLast7Days > 0 ? "warn" : "ok", "Без versionCode за 7 дней", `${report.hitsWithoutVersionLast7Days} обращений.`), + focus(report.totalHitsLast7Days > 0 ? "ok" : "warn", "Сигнал обновлений", `${report.totalHitsLast7Days} обращений за неделю.`), + ].join(""); + + elements.compatibilityRoutesTable.innerHTML = report.routesLast7Days.length === 0 + ? emptyRow("Данных по маршрутам пока нет.", 4) + : report.routesLast7Days.map((route) => ` + <tr> + <td>${escapeHtml(route.route)}</td> + <td>${route.hitsLast24Hours}</td> + <td>${route.hitsLast7Days}</td> + <td>${route.latestHitAt ? formatDate(route.latestHitAt) : "—"}</td> + </tr> + `).join(""); + + elements.compatibilityVersionsTable.innerHTML = report.versionsLast7Days.length === 0 + ? emptyRow("Данных по версиям пока нет.", 6) + : report.versionsLast7Days.map((version) => ` + <tr> + <td>${escapeHtml(version.clientPlatform || "unknown")}</td> + <td>${version.clientVersionCode ?? "—"}</td> + <td>${escapeHtml(version.clientVersionName || "—")}</td> + <td>${version.hitsLast24Hours}</td> + <td>${version.hitsLast7Days}</td> + <td>${version.latestHitAt ? formatDate(version.latestHitAt) : "—"}</td> + </tr> + `).join(""); + + elements.compatibilityHitsTable.innerHTML = report.recentHits.length === 0 + ? emptyRow("Последних обращений нет.", 6) + : report.recentHits.map((hit) => ` + <tr> + <td>${formatDate(hit.hitAt)}</td> + <td>${escapeHtml(hit.route)}</td> + <td>${escapeHtml(hit.requestPath)}</td> + <td>${escapeHtml(hit.clientPlatform || "—")}</td> + <td>${formatVersion(hit.clientVersionCode, hit.clientVersionName)}</td> + <td>${escapeHtml(hit.remoteIp || "—")}</td> + </tr> + `).join(""); +} + +async function handleDocumentClick(event) { + const nav = event.target.closest("[data-section]"); + if (nav) { + setSection(nav.dataset.section); + return; + } + + const jump = event.target.closest("[data-section-jump]"); + if (jump) { + setSection(jump.dataset.sectionJump); + return; + } + + const chatRow = event.target.closest("tr[data-chat-id]"); + if (chatRow && !event.target.closest("button,a,input,select")) { + await loadChatDetails(chatRow.dataset.chatId); + return; + } + + const button = event.target.closest("[data-action]"); + if (!button) { + return; + } + + const action = button.dataset.action; + try { + if (action === "refresh") { + await refreshAll(); + showToast("Данные обновлены."); + return; + } + + if (action === "open-chat") { + await loadChatDetails(button.dataset.chatId); + return; + } + + if (action === "block-user" || action === "unblock-user") { + await fetchJson(`/admin/api/users/${button.dataset.userId}/${action === "block-user" ? "block" : "unblock"}`, { method: "POST" }); + showToast(action === "block-user" ? "Пользователь заблокирован." : "Пользователь разблокирован."); + await refreshAll(); + return; + } + + if (action === "delete-user") { + if (!window.confirm(`Удалить пользователя @${button.dataset.userName}? Будут затронуты его сообщения, сессии, push-устройства и личные чаты.`)) { + return; + } + await fetchJson(`/admin/api/users/${button.dataset.userId}`, { method: "DELETE" }); + showToast("Пользователь удален."); + await refreshAll(); + return; + } + + if (action === "delete-chat") { + if (!window.confirm(`Удалить чат «${button.dataset.chatTitle}» вместе с сообщениями и вложениями?`)) { + return; + } + await fetchJson(`/admin/api/chats/${button.dataset.chatId}`, { method: "DELETE" }); + if (state.selectedChatId === button.dataset.chatId) { + state.selectedChatId = null; + state.selectedChatDetails = null; + } + showToast("Чат удален."); + await refreshAll(); + return; + } + + if (action === "delete-attachment") { + if (!window.confirm(`Удалить вложение «${button.dataset.fileName}» из базы и файлового хранилища?`)) { + return; + } + await fetchJson(`/admin/api/attachments/${button.dataset.attachmentId}`, { method: "DELETE" }); + showToast("Вложение удалено."); + await refreshAll(); + return; + } + + if (action === "save-chat-settings") { + const ttlRaw = document.getElementById("chatTtlSeconds").value.trim(); + state.selectedChatDetails = await fetchJson(`/admin/api/chats/${button.dataset.chatId}/settings`, { + method: "PUT", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + publicUsername: document.getElementById("chatPublicUsername").value.trim() || null, + topicsEnabled: document.getElementById("chatTopicsEnabled").checked, + hasProtectedContent: document.getElementById("chatProtected").checked, + defaultMessageTtlSeconds: ttlRaw ? Number(ttlRaw) : null, + }), + }); + showToast("Настройки чата сохранены."); + await refreshAll(); + return; + } + + if (action === "save-member-permissions") { + const row = button.closest(".permission-row"); + state.selectedChatDetails = await fetchJson(`/admin/api/chats/${button.dataset.chatId}/members/${button.dataset.memberId}/permissions`, { + method: "PUT", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + role: Number(row.querySelector('[data-field="role"]').value), + canPinMessages: row.querySelector('[data-field="pin"]').checked, + canDeleteMessages: row.querySelector('[data-field="delete"]').checked, + canInviteUsers: row.querySelector('[data-field="invite"]').checked, + canPostMessages: row.querySelector('[data-field="post"]').checked, + }), + }); + showToast("Права участника обновлены."); + await refreshAll(); + return; + } + + if (action === "create-invite") { + state.selectedChatDetails = await fetchJson(`/admin/api/chats/${button.dataset.chatId}/invite-links`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + title: document.getElementById("newInviteTitle").value.trim() || null, + createsJoinRequest: document.getElementById("newInviteRequiresApproval").checked, + }), + }); + showToast("Invite link создан."); + await refreshAll(); + return; + } + + if (action === "revoke-invite") { + state.selectedChatDetails = await fetchJson(`/admin/api/chats/${button.dataset.chatId}/invite-links/${button.dataset.inviteId}`, { + method: "DELETE", + }); + showToast("Invite link отозван."); + await refreshAll(); + return; + } + + if (action === "resolve-join") { + state.selectedChatDetails = await fetchJson(`/admin/api/chats/${button.dataset.chatId}/join-requests/${button.dataset.requestId}`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ approve: button.dataset.approve === "true" }), + }); + showToast(button.dataset.approve === "true" ? "Заявка одобрена." : "Заявка отклонена."); + await refreshAll(); + return; + } + + if (action === "cleanup-expired") { + if (!window.confirm("Очистить все истекшие TTL-сообщения на сервере?")) { + return; + } + const result = await fetchJson("/admin/api/messages/cleanup-expired", { method: "POST" }); + elements.operationResult.textContent = `Удалено сообщений: ${result.deletedMessages}; вложений: ${result.deletedAttachments}.`; + showToast("Очистка TTL-сообщений выполнена."); + await refreshAll(); + } + } catch (error) { + handleError(error); + } +} + +async function fetchJson(url, options = {}, useAuth = true) { + const response = await fetch(url, { + credentials: "same-origin", + headers: { + Accept: "application/json", + ...(options.headers || {}), + }, + ...options, + }); + + if (response.status === 401 && useAuth) { + state.session = { configured: true, authenticated: false, username: null }; + renderSession(); + showLogin("Сессия администратора истекла."); + throw new Error("Сессия администратора истекла."); + } + + if (!response.ok) { + let message = `HTTP ${response.status}`; + try { + message = await response.text(); + } catch { + // Тело ошибки не всегда доступно. + } + throw new Error(message || `HTTP ${response.status}`); + } + + if (response.status === 204) { + return null; + } + + const contentType = response.headers.get("content-type") || ""; + return contentType.includes("application/json") ? response.json() : response.text(); +} + +function handleError(error) { + const message = error instanceof Error ? error.message : String(error); + if (!elements.appView.classList.contains("hidden")) { + elements.noticeBar.textContent = message; + elements.noticeBar.classList.remove("hidden"); + showToast(message); + window.setTimeout(() => elements.noticeBar.classList.add("hidden"), 6000); + return; + } + + showLogin(message); +} + +function showToast(message) { + elements.toast.textContent = message; + elements.toast.classList.remove("hidden"); + window.clearTimeout(showToast.timeoutId); + showToast.timeoutId = window.setTimeout(() => elements.toast.classList.add("hidden"), 3600); +} + +function metric(label, value, note) { + return ` + <article class="metric"> + <div class="metric-label">${escapeHtml(label)}</div> + <div class="metric-value">${escapeHtml(String(value ?? "—"))}</div> + <div class="metric-note">${escapeHtml(note || "")}</div> + </article> + `; +} + +function focus(level, title, text) { + return ` + <div class="focus-item ${level}"> + <div class="cell-primary">${escapeHtml(title)}</div> + <div class="cell-secondary">${escapeHtml(text)}</div> + </div> + `; +} + +function feature(title, value, enabled) { + return ` + <div class="feature-row"> + <span>${escapeHtml(title)}</span> + <strong>${escapeHtml(value)}</strong> + ${badge(enabled ? "активно" : "нет данных", enabled ? "ok" : "warn")} + </div> + `; +} + +function badge(text, tone = "neutral") { + return `<span class="rect-badge ${tone}">${escapeHtml(text)}</span>`; +} + +function permissionCheckbox(field, label, checked) { + return ` + <label class="check-line"> + <input type="checkbox" data-field="${field}" ${checked ? "checked" : ""}> + <span>${escapeHtml(label)}</span> + </label> + `; +} + +function emptyRow(text, colspan) { + return `<tr><td colspan="${colspan}" class="cell-secondary">${escapeHtml(text)}</td></tr>`; +} + +function displayName(displayNameValue, username) { + return displayNameValue && displayNameValue.trim() ? displayNameValue : `@${username}`; +} + +function formatDate(value) { + if (!value) { + return "—"; + } + return new Date(value).toLocaleString("ru-RU"); +} + +function formatDuration(startValue, endValue) { + if (!startValue || !endValue) { + return "—"; + } + + const hours = Math.max(0, Math.round((new Date(endValue) - new Date(startValue)) / 3600000)); + if (hours < 24) { + return `${hours} ч`; + } + + const days = Math.floor(hours / 24); + return `${days} д ${hours % 24} ч`; +} + +function formatBytes(value) { + const number = Number(value || 0); + const units = ["B", "KB", "MB", "GB", "TB"]; + let size = number; + let index = 0; + while (size >= 1024 && index < units.length - 1) { + size /= 1024; + index += 1; + } + return `${size.toFixed(size >= 10 || index === 0 ? 0 : 1)} ${units[index]}`; +} + +function formatVersion(versionCode, versionName) { + if (versionCode == null && !versionName) { + return "—"; + } + if (versionCode == null) { + return escapeHtml(versionName); + } + return escapeHtml(`${versionName || "без имени"} / ${versionCode}`); +} + +function formatChatType(type) { + if (type === "Direct" || type === 0) { + return "Личный"; + } + if (type === "Group" || type === 1) { + return "Группа"; + } + if (type === "Channel" || type === 2) { + return "Канал"; + } + return escapeHtml(String(type || "—")); +} + +function normalizeRole(role) { + if (role === "Owner" || role === 2) { + return "Owner"; + } + if (role === "Admin" || role === 1) { + return "Admin"; + } + return "Member"; +} + +function formatJoinStatus(status) { + if (status === "Approved" || status === 1) { + return "одобрена"; + } + if (status === "Declined" || status === 2) { + return "отклонена"; + } + return "ожидает"; +} + +function isPendingJoinRequest(status) { + return status === "Pending" || status === 0; +} + +function formatModerationTarget(target) { + const map = { + 0: "Чат", + 1: "Сообщение", + 2: "Пользователь", + 3: "Invite link", + 4: "Join request", + 5: "Story", + Chat: "Чат", + Message: "Сообщение", + User: "Пользователь", + InviteLink: "Invite link", + JoinRequest: "Join request", + Story: "Story", + }; + return map[target] || String(target || "—"); +} + +function shorten(value, max) { + const text = String(value || ""); + return text.length <= max ? text : `${text.slice(0, max - 1)}…`; +} + +function escapeHtml(value) { + return String(value) + .replaceAll("&", "&") + .replaceAll("<", "<") + .replaceAll(">", ">") + .replaceAll('"', """) + .replaceAll("'", "'"); +} + +function escapeAttribute(value) { + return escapeHtml(value); +} diff --git a/src/Ikar.Server/wwwroot/admin/index.html b/src/Ikar.Server/wwwroot/admin/index.html new file mode 100644 index 00000000..b4fc34c9 --- /dev/null +++ b/src/Ikar.Server/wwwroot/admin/index.html @@ -0,0 +1,406 @@ +<!doctype html> +<html lang="ru"> +<head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <title>Икар — административная консоль + + + + + + + + + + + + diff --git a/src/Ikar.Server/wwwroot/index.html b/src/Ikar.Server/wwwroot/index.html new file mode 100644 index 00000000..d997e944 --- /dev/null +++ b/src/Ikar.Server/wwwroot/index.html @@ -0,0 +1,59 @@ + + + + + + Икар + + + + + + + + + + diff --git a/src/Ikar.Server/wwwroot/logo.png b/src/Ikar.Server/wwwroot/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..c386a28795f413fb1ee0a1fd6ba67cc2ed17e891 GIT binary patch literal 1097240 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 z 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%0Dh|a`~k^76ca@% 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

d`5bqj` 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 mrOis?08!@HO;MxO%{)I zh<7i_3FHH$ca}{{V?L=uePmc%wWu9CKdLwAAkvAn=kp8xS#~MqTAI&O^*8q{XJo6u z+1};&BsruMIvx*G_h{ZL*%jRukiNyPj) zeE{|aV@ptGf`}2jX+>*xK@o=@u91Y~zF%gr)7kmEaZeF$DyO%+rx^Qr42tvWVp@Hq8oCc$bsX&oJ#hP!a^~YpEA_6ELa`ViO=i)}Cn< ziTvDB5WbUMas_H3-v;-sfLN)Xm4z6N@{?2`(Jqsj(bYbD46>Ker^hLppr5rhE<_WJ z&t3E^Uq!0}mwm{k;`n8#Kh&F8Ryxs&;=7@hN4aQ*^8t_JVe0oxs2&l~Mdxuj$aZ72 z+dU{G{6=Da`ZyoMo*f0U=t>0tK?M3oY{|fP9_vcLvK`dPm6cc6);M`xG*^BQ^1Vl` z>ELzo`w4*!_7YPljSrm`HV;j`G4l%h^KRXd_5- z*eK$(AO#}S0nr*Il#Y)fjq=`Q_Af_y()ix`%~YLw7XABm4mI{^9yhjg-@=U1Fzbmm zglz#f`mQLqidNNPJmfXxPr8C?c3 zw~U+!saIyLyag47VNAZ!7Cx0nJSflYf#Y~uU%VK&q+Ayb2eF>bKjL5P}>3koI38$I4 z)1Mv%^H@N=iFx5D=>h^tnmYBv1wK+c7jh}x0O~6WOyk-*(pIiK|OvpAxwrNGFa&K;ho@2 zFO3zx9p>vz{nD43ogMS9a9TK4+kTbCvKxh+l0mNOY_G3~UYY^pIEbCzTPQY6u#_5B zY~-3H%3daPfEY=x=``ZVk;!`>%npeREDeTUk8NQNGN;D0W8QyK7yZ4{aE6x^1!8y$ zLyl0*@Tsg}l^iHhdp*sNpdcdZZqqN?0LlB#m4@$SVn;^yI(~F}lr7?&^B*sX+lxsc zv30D9K)xWUVf3q!_03>E<8;S;a1;+Wij#-in}k}HiPiyI4i9}7JvKHQE&8)h*tZBV zk*QB7#j1|eAZnPB>L|81p(+`!H}2JvZ{oQqa;i5VMJA?-|%O zw$rk|BTv!Lvr;pm?gxIPA*U})G@>o)6Tg`ni{eO^C=SUH4T@@eT|b{v7%%(Jgo@L2 zBu~JK4CR1^Aw+(0fYm&GocRZ6mE>G?SaPm(SBvFQ3e*#5)FMJ<-F10`S0n@QTfsEb zhnA>sv6!&TQPUqzL#cBb*(K?dA)^Y7AYeK7fK}8LOi1wWVR{b-a4YCpOBjoSL20)q zrU2d6x|QSZ#Vm6(N>yG`?vFF{Jr)=N$4)Jz^)tD`30QP~ci`GBfu)_4V z(cD4k?8&NDqXj%IeT+F`@3ETpyhWJWU8ImchK#>l4wWu z;GLjbkX#Gok`jR4V0xMGc4c8MNnZ^NF~P}6X4f&JLx{U1oCsjhx9u8=NEN@G->Tgauj$0jtlmiGFnrs+jD5(h0WQ#HAE?b%{I&oQ^V4 zStaZSm}9`>s7C7|jIaaNh8*SbF!aE`hFk0l0=s?Z?MfElc`}%^gWQYLoBdXTR`%QN z!D*25rutb&ShEB=RE#KjTxf1~0ZY zT$vg|0wB-mT69%0Zbbav)w`_J1rwV3blwsAX(Et0?qjZW0)m7kw_Jjw5}e2B4!9xm z)c-JRo11s2>|EDP$(v!xHsgU;lb zeEAdcj&rwTb2*|vb~^kp6Im42)VA?mo9r*b_^@BxI%F+%9Avbdzeos{2fN8wxuWLC zMw@Ez0o7PozCLCUD_GU^?^{RA`8aSE-*TEc;%#v%af0i%qBSFtboT(JYtwRwaFi_8 z#r>ybVJ>fW_*3BXz+^?9oniEYY^G@BZOmj_l`!nnsAIF?r>`743o!>|nuUbi&0|bu_2oBK*2(Y zTl>(FD?HA;?@kMVeMi^sAm}6TOI4!}Rm|b%kQOq9v=A&RQKshoj?oe-=P-T{`}(Lv zo(FxuQB*92@omr8pAEa;cTh(2``gtt#lx865}e^-i`mRw&evI;dFgv&TF0lJ$x^m9 z+Ia+c9&!is@`GSN#z$3YWSQSWf@zJPrjfZou(n{7Q4IvC5`%OsqZ{hVAOIm!Kxl>^ zH?aT%Z#7g)CB6l=gKP}Y=iyw5njYz6CtcN&7GX5tJ?m`WOS#^ItxTp_C`zz=8~qLm zMd0AOR)#*24vz#4S2!A~(M(R18rUx}H3EPn8f_hLEog5ih9}DFw1J_Afx*yCcl4vf zSu$hnG2LMAKKLEGvBFc{K;&H4$2cNMc3g)zr~iJ)0yK z`CZAw3vX&XtRm6lhCmx~Dr8pD?;)dWGzc1`I27V)s4Y#JgecffVuVLRg+rVjyXb;4 zp~7LYHcj(lAged#gf#}=iuofpQvA_28 zde)ghr%qBc&5Wz=_&NvkZjo863s}@o9v@9iN2L?3p?e{g_X-J}#J|0ALkk@EDw9DQ zt7E%`zKJkrVTIpA%i`9a`+DVo6uv8*aQHY7ex5Vb?-RYf84LyGd{bAsr!$a7QN`Se-)#^;f!>BtBEc8I z8ca%foN$sPLaRclHyZQy!Q)hU%amPpw==P8mBQ3cwIXBXN_=Dt|u4S(D?b*8zk;osLs1kbmH zH@0NNM}s=(@?P$fJ=X&e8&zY*csjSIW+ZiZM1$DEl|F(Y;fYS(9Q;G{+!*kc>7$ZkVmKGPa8&6Y4ZZ}DbN8^N! z!hA!KmjiQNrO34b^o*Z)=M7@#PRt1{e|Zuos1mP<9nc<~fh3fvB*oY4H$kSj5vmC$@3>G6g18~R-3CEWM*5hq2tUfXb zhd18mVNAKBrS8Fni}q<|W(?h8)rd5+fuK@UJ+EUqIa&08_EC79MECz^fg`bSkK!nV zl~D;3&Rw{{5f9?KH$irTKqe4;+eBSS`JuYu*YGif3NUqc;QCV4@cf*KN@6~&P3bR+ z4>^GEsvX((`4NoC;El`kiB_tbHYgft{iY;mL}VV=NF%leVW>=U2Lm;6@$NJx`--&Qnt#1PyMxZf>G9>ij`0>E8+6&-s zsvgWFk@n+#X?w1l;0wy*^;8X%LV0H>>sf3<7i%!&Qr5#eHgAT0xJM zP}Kfv64yAW<62=lg8 zEJV%X5j}V6Pk=b|wSIw@2cd(W{t8`|)Pq+_;RFt?2@DBHimcyHm=;mrm6(2v{9-H< z5x8{#Ja;*Iq}m`Ngd@V{_6Gz+J#&Uwx1u)#hTep_*WMQS2~w&;fL8=nBa&MWS`gRo z4!1~RnN$IYO1qY?N3n(XXfiGCgbju#@C1E(unY*6S5q9a>cK$vRQBU#Vo)2}c?%*MhXcKH~a4c!SY62hhv5^^yZ#;Sgac2yh6 zT9K^j0k%P3y4B&P-~e8br}TF8!AL8wWEUmxNrTG*Ds|c(h95}^2Ad>72jNi8$9+n9 z#kw4Jl?jOJfsRR))h<7Y&?UBMgR_M-op+qv?MVGl6>!pHRIo{tOvXx*HE@1i139N> z^MxhX=@HCY@T-zk6&n)?62_G}6TQo8LB0-NR)Q%3bR=+N7)Xl<*%xSRa3&=B!DAsT zf8>~wQSi@MzWRTZf6QAlC&jcBUE{D9>Ny|l-dwl*wQayY;#b`HgzB=5_K0$*n=IZ& ztlkW<`pj!|i_L><{0q#C!lpI;uT;ZK+6-*=t#WSx47{@-fZwEyZ0Gpb5iRlZVEBN? zr0M(>;~HG3hZMQM4tZ8gY0x=-pua%)BDQ$={V~VhDe*u4{G+3%Mn-na?S=}H)Q}=r z;gdP? z(C#q<#<9Y=H?J(GpS4{Z(JPW&iGWjsRy^QRk+XHnij@}b@SJ?9!o0kWF?mN(c5F@` z=V6T4r>PgxN@DB9&IUzC1$*=&x{n+inTQvE?1KRI`?!S_ma(tG_-)ap1-4JKnPY8X zf)D37?S^ybIZ2L-sc}Vyx*~glmK7u&WesJsTYU%>K$Q4}|Ag7%pMBG#Rr7%k%$ZfV z;(&>z;huD{nyO zcVXQwwB2JNdtok0Qp1MqXA41wk zMk7H5hE!lJ!UH&q+u)}me8MDlI?Aocfu1pOFUAy2>~tk6P@IyVpfkgBPtHkC&yY68 zP5?P@e*hGn!Q&lZ>xy9n$?WL(%(9{Sq-m(m+gS{Ew8nJkw@P;0YD}rDz8L4 z1s=kuu{43L-a_h+J}g^fZAgHF*n9;=f;k5#rz;^0)6OUA)}GO)RWAL<=Kp#D#zPX7 z3C@p^anF9tfrh9dw0|}3)BeQz>uNoP%)xu55ny@8_*9QRc6I{d@4JKc;G4u)FUF)= zXB`~IG}l7vX*>kzKf-)U)gAP4_<2_{L160#y98Y~LM)Eo&eIT7bOD$gj$|MK{9`a$ zkUT-waK)o|GWC_i!+W>hix8&41Bxo)vr|FP-mlWPMNMs$wQr*c;tc~Jep)&7U%rbthtCPi9^V9=*y zu@oh2zvyZtrXCZnBz$ujpFm&26ygL^SN?87xxzOw$f--Hi#ME8U9cRU6;IdCEsGg3 zzFQ^KxlH$qv$ONJkFdYk-Tq`ZZah({;JBA4u=f(d zL}~!5|M+-DL66*o?$%%9_jY%6fsObwNU)D$EmwlJBYMy`NIP^3vt_{XldWjdf8mS8 zoT&wqFeyW+wRRWejhy_X{H4HQ-cmO*3k;+~{BL1wymna3sz%`%dxx0#j@Bw=hA)j^P zN(ey4%M*JhjTCP%o2T70fBBH;@hLZKWGqa)g7Yr2&b8^{LaX;oUPjTWM-)~>|P2E!bI&5y=!cSpwS=qAWsuijOj8i%i`jko( zVy#54#Gm~6eT#4U1Rpvaxf6~81^+8$TYMEMl>GB=b2{oEHkRL@$lE?~BnE@BPokPW z$S>X)Uid0TQJ^5$I@JLP9#O#JX{>@;<@~B!fO^Wob2B{ypxF;e-6S?gl<+2E8UQn< z0STk)-7eCNT#YP@Y`N#WqC0j>yX{poAzIn?#GWGejiOW$oNw+s2@Gtx7da`h^|Xb5 zRx2`cgIc5RO_KS4nI$9s&#j$fpEOg$KfU zQmD%i4Qj6#DBP*}|U86(k-5H36Ml}c)uV&DA5p~rkYZ#Nq7eCDoG82*kp-bA`*~rW=ss9 z`AZk7$ul&qAbc#5<5AbMAfy@=l}o|d*9>q$Tmk2e?2fWVzR?1`<~ zlO9v{lt7;q)j`I7|*I$`C>1zDd)u^xdK7IYPti5YyM z729mZ({P`J4CSQ|4Y*pGv(2`t;24}_tweqZ58QwRt)c9z@Gc1zGAV_iTbHcushwcc z$2{UH@LWn#6y_l?U{ApD)V2o$E0Da_DX&1$$jsPvfw3R+2@LBYTo$<~=2hUNnRLRH zPD&7D?`Y>29vG~|Qj%O0jkOSpnO2uN9IHnIr3_DtC8Ii{5+V`furb;(lI!PSzf0- zXOk4@S{IXZv^4tJyC5}K`D^JFtsgG9r=T5p`pcpuojo1@&cw_sj=YUmm#V6}GXYF}Gw+DOOxE*V8C!x1D}1+}bOPaS2-+nnznzH=GUACf-kv2%==`=|#$O#n1t=Ti%!~>2`#>|?s zUUBOjd)lr!K6RYQ{*<)vDDLlVbN`bDp`p}wTP`=a4Qa(HfF!IcMlJS5+^pH$ooqus zx1%Y?b|PVBG+}4^F%05|Fon-mo@yiP0hXG&{Ziyy=RnE0X35<0*!eI~$K1YQxe^(J z_@vomg!sQ$HO>}1K5SMaOqQg_Ky(D&HmpLF>oOj^S7KlxKD4YpV_AJ?1MrWSPu@OO%YhIAt+vD zbiX22FJcV!MTreO%2m#!_3DxWoCueWZq})Px$88|k2Ld;Q&i563WX_{3HS60 z^hAd>xQ;SujiIxyZmEbcUXfa00A>xJ9-79l-`_At~DDfF)#sh5Y|3 zk7|#H*b;OEpF{w4#5-gk!!bop=-MRhK%mHYfY%EzID>Q@usK{``d)dxnefu;hAYUw z{>-~79Sop=q!@nhpyj+;vT@1gTTipM1O8#@*EsUw#QDR-zK*R6QuMlMH2dH00=U=-Oz*M!6gd$PA1LQKTMWMqTZ}OJm*j97Tg? zWEOo84B-`t==?uOivV;^8wABexsm!ilJJ8}M~P$5Jfp+3 zt=qX{rB2|PDR+@CcTpq@k7V@`gv%b%4jSrego!JBH|rbzMxg~dNYZCdjk%jfOZuJ> zTrTtAzf$l8y%UrTx7M>7kvWmB8iD~>N>&z{Yl=bT;1k#g+XtatVzfP5I#DsP?u1LY zJNWe=SR9cmS?d0MVfjUw{A~mfmuL#CgM+X}L+aN(kpt+psxVTw&_n}-8+R#GG1?R@ zj$k#fqtay1a0Et$jeDR9-rj|JgD#;-I0OSn-C~(y)GPvA=(t+DEA-=z-FWknqKVm!88W?dc2~sbPHjAL%Es>SgG?A z559J>gnX$XK5xmEgg#lq$WrymL_C|lxJf-MCO6V=;$3qZ7FdV?NrwWPX1ATYF4T%B zvMQ0nUsvgG-P_huQv2^516xeow_gqVGXe3OI z^HzOfYM}CS^+-N~?{0^Xy{j==Z)Osqx~!En^CXXUrDO zEgcr0#Egz6h1*xFR-2e7DO(gOj+!)u?rQpGx83V6&uY^xQq}1Z-}2)i1tpHwrPf{Xh+;)s%WupXylatv7v?Cu`g}U{}}g=tvD~{ z#cfFpt}eF|QjW=&caGdnFqB!GFkFz~%*KiK$4q8bP25vIpJ~}E`!;;*yUt#zw$bq7 zo(#)IH?v+naCyhhZ43b@K=ded=QATh2ji@Li6|2oI)0hfo);2=yF&IV3 zctD4B+&%}Zlx||N z2A<@wg*+O-CFtCb>-<*$LN;e?DTo5pgqRq=-Ccrtt4K@@oddL*fR7NWz`I%D7F5t2 z0-H2{2CX*Gh0~zoDLk!rqK6L{9W!X z)3bXWyHutvuOf)>KS7Pi1l>y`uv$;LHCBRr1Q;!ZJTJ9mq2(nxr=#F%OV+mhhQl;p zLd!_C*t-b=4?RHM!JY-gw;kztp^HAnffL;$BST&6b+Y2oUwh1ifwXjn$UJ#zoVhb(w3i&&5wxokD7Kg%T!nf5< zyNyQNm>yI<4XqI>#h@*ZX+%+`tfpoS7Lgvf`WDw|6!ohMG#skk$Yxn~~p%_u= zHl7BjP3UOqS$Ncz+tQSv4b`=6Wj#4jTVqFD4*ovJ_`-9pR=U7Uy4*X$M>+#A$_wKA z9QEKcW`hPzsvZFnFs+wVkgZPBa`h;iHK6u!h5Z*=A2asI>rvqwn+2xRMb4Og^~9Si z3X~JZ?5=2`)UFvt8Iv`GGL%TP%NX>)bV$wO7E&+iQXhF9DhuKr-BBOP7~5#`y~UJH zG-7I>BNnE}v$n7q(T7kutYlx)m8gFt!R^3e&KgJ8lCmJ8*unthL-;UWu9ez9;qGW;SmKM7v&1^bS(}O=%gag4R5s2AhFWnUrC<=%- zn>|{^AI}ea7>brOEe4)7Sn`crifp~AhM9tr&^6%lg><5pyB69`sAMN3q%_b^AGAPo zQALjBk+a%gvDhjs=Aq<0OA8;cRXux@v8vY>NyoRLwWK%4+L0nEdzE8?gATPSknaUPS#QwYCb>8sf zIl=Ow9R@j(ge?LQLffdPFkHVmf{1C4%cZ27A`nO)UvE0ax+0xE$`33|?OU`P?!7%% z7yH(+Cn`=QMn>c*aIV+Y($Qi{FRT+NF8-;q_`vaBv*>xv;Z|+Gb4kA|YS6r&7F-=I z-zZCgYI<8suPmi!ck60!6*0RR`sQXm#=sglV(s&Z*^P6@7M{n68bnJCFK`r@tE`-s z*d>(6E&f`9UcuS8nVq6m;c^GjM}g(S$GAlQ*;m8OW(nCcRniKngS4V<6@U^a;yFqS zi;nLYk2dn05CFk>${*}@KD(^R}9U~C#YZ{G= zONtZMEgWu|I3_ql5R?XVXu|yXnHFTIR;_>|1%Y-59tJ^}KA|5RNI~oe5YeOXED)!f zo+hfcYN-umr$q&}GqJFIi&dxAdhkNVED$f;hXRZ8*hxZ!Id_<<;|0}}!fW~IbecQQ zNU>0w+Vlv={X+phH(3EAlKX1{qnzt$jRO#4BumuDgSS^XpRMZUC4uQ<(<1N^}YH!wxEJagqr8nw?uPB16^^uO>7lTvruP^0Ctc^)Y(WQ z)_vYu zlxQNSNp!I{({d3t;ed{+)YGq}aDzyK^8W)%7!&Mrl!Qs74V2QD(iZ+`oxc%z1tsC| za2si9ycxpCFes$SW#iz1Z{SN0gsa+4MBFA_jRiV4(d?mn*29E$7!DA1Qm}TXtC6D? zeg?OZLpR=S#TbL+nf#h$hLqriI1ww!>Vs`Z+A*lC zX$#Kc?)Cc?iYniYbv?O=$L|Kl5dzke$dQ6s4p=)BhS}?3vyp>5Lt!7)4`4Cq5w% zbezB`LdM+3KS`>~>9awXW0I|@s9D3*lI3EwJc(Ywd@52VjUMTr2|%$rCCD7P2^6ZM z9tqr`$VGsINQA1Vqc<+Rx&;u}uYi5gycz_gN1AUBCpyl=En1Z<#)w9=dPeNV#*>O{J7JIVeG zjs$d#{?@wsk-bR9Kc>L;!@k(}mSWSGfsT|H@roeKiniW$cjA%QUxk2wz?Ozpjs)4Hw_Ya{kq< z683z!E%M>aHi+Cu@|vY;o5N+oWaDf^wu^1UJ-3Hr_%9a!o_bxk@OWx`e^r}avtoj@ z!ZJIRd`4!xMLlh9NTPl!3T!Z_Cy2LO%_}5T)RoiGH6+r zsjAhbbDZm8@#U?Gqf`n>45pG*k&Z&5rVK(SY{jyj>}qDEgH)PIDmB{DiPrS8TkP8ES30OkCt^>r zI!=vPR5P(nOf&!MJKp#IvG2>;YG$72``m}?zOL&Q&GV5zh(F24ub?5wX=FGA8o7;I zkwFLK+*-c-g?8*d{ec{7jDPgZ;ObWH8MNBlcQIw;2R^Nt3GYE>HDW7H$^>Bn+yxLN zZ^@cD7=TTD&DucdTi3Sp{8K@IBV8e>FgCnx^XHuf_;$+{cbuQvSvTJ+??9G$7Z8KG zwEDK-tSL=j23e4fr;ThybRWQX;;F;Xu0}Ho|F)QN8BzpY8#65CB@^gGMi964TDRsW zX4&1=^xHm>KvyVK>_p&px1eh8+1KHAo!=$*=2Ru0a(mc*9FAyoa5-qL2?LoM4Wh8=S#hbfy$8G_#-uP}CXGu5*> z0~q4vkWX3Z-Ls-?n#jjTk}&H7)-g9%5x;q;T);F_F$#1;#9rb`&G@QTJoE7Hj2!x~ zAH$$_H!%^1MB|YTZpYCOREhuFmkI1t#gu@zXRsp^<2rl)o$TIS6e5%LIBt6!IP8mwKiUhdt!-e&+TkOxTc6r|#3eijP> zFwbAIi}r@!w#>$~aucH)OmQH$1DO=6R?$_4ZQq6Z+lWEIC}HIhnqQ0eDU^AuSu7vi zBtFvHI5>#m*^!X!j_xm4ok$NkddO#e?q5n7f1Ll3@e7-N*~dAF-}aO8yY0$udbGY8 z-CcS*rQ~1!PV)Et`-#guANIW;9vZFsp~GlHNB7z9pxyfRr%y$)PXj&HJ@wW(SHF*S z7{r0bsoXADxvBxIN~+h=oxJFy(Y1C)H27^pDGU6DTn?OI{&p;07C8yL{Xlg&4_8Cp zF%U+;L8?i{nfnu>)udGvLpITAU22@meVu($T0E1xu*Un3e>6IaK5W!}+^J2mojk z;lAeLHvK^-;Mp5;**8HN{{de`phZY&px)dIzy()Sa;Vj`_Mq{6*=i(TNGpC&6s({p zL@AnsqWmZ54zl`|K}mk`&EAH20cWpW3;o4a)3b^2_O1Ldhhv0Mv2nzkHOPj#C(_z) z{4h7*Dr0Oj86~1_3Y@^LupNclCu+{L1~3!i$&v1L5=L$O;#l{R@*G4strK9hn z2Zn!)9>j|1LBaj89#(kb68oaze(RdEZCg1<#)4Aig0A+hJ%^5NdlhUWsZ{V>(_mIF%LM(4Hw?D;bjwOpNSMb5OBYTB)k9 zNbpWId5YM_-XSvdM5R`MC@mj$lKB6m~8R%cVYk&DX>mfx{6wFS~^AjK}-qqnY0)Yj(+(p`}KvJdto#>%e2WFk9 z0Y|E)u(efb1fX&&;vU*DtjHZr5H4f6BeMIlEQQ}Ht&^k4V1&YPHdSz!*FC4~?zDOO z>f7{^4Z;!^P#u(N^|kXzJb~*3s#yHt3ipo=9voFXP^FyfO7K%9MQ++d4C^)3DBqS5 zQ6ezJQi7XOF7~^r0Vk;g6itQ)+Sn0Hz+D7KOvuJ3CTi>Il**1?(J&%^4>Q$k*x^Yf z+}GxH2Jj zcqECwC6qNln=XQi`;PdlE*<;}|2LQqNBNYNMEy+YkSOklEB^ZpWPva!?AZT|Y2@78 zerPIz;v%>4E@b7Z>7x3?RR&IhnBv9@-i~3S#?B;XwD_p9t>J`g-LhxBUZZIIIq=sz z=h32Y*xI;HN63hXV!`eTBher4CWIh1U$OpaxVof|KGRfHccXjfSeas1@Z}4iJVR9V z0AufuU_H6WHdI}*%#!hk`okvH1~`9Id1pPj2tvdn?fnD~X5?Xj}# zNGo?=xO)7bBdTa{GD>~y>DXt%gz}*T<1bVhDx)N65jDEIpH^$h3KsU$*{}9afCSR{ zJbJ_b{(2x*rFMAm{~YzU*8x{YjbEXdOGa=G>AQG)*G?2L?`3FY4!01cOCFtccx=Pm z12DBEJ8A9pNAF%h3a~k5ztb4DQ?>xZ)s`=)>bKr`&9?GRonMIRWkrb5*acva!UTX6 zFv7bOPy?2zl)E?`BRhtFV{3rvKh155SaM?p3*HF!I|s;o1(ZT7;38C5;&7b9u-ntB zp2r9Orq_GvQnVMfl&z=MPrY(c+( zgzZO0wZjaV*) z!=7AWiSGE|$i3)Bkmf=iyQUk}!xekt6-NIgHP7mKSm9|u*(muF`*e^+QKe{F(Y7QUN8z!ua`DY#eRW&)c^io2olIiM|i}bY@ zDYDhfGY8IUh2K|ee4krA!?QS-Uo4a8iIXhia-$z7PCYkdPH&#JUb)WI1&dqGMs-I- z%V?E@jjn;>HPUN?Q(MHYGEwME`lNr8bx?eKptAJii^<~IR9S8ybL122(}#&?MaYPA^9cVJRYUW4R&6JO)` znR!@Y?p<4vv!mtK4aRQd9C~wSuwCt|W;cw4T#WbmDKhpO?3Z2mbwn3y;}uOJ}(aC}QG&_}g(M z40*x1U9H61!l1(T@(%DG4hG}(KKBCehhDBrF2I}K{#VUzpF3^iQDX_68kA_QYx9)q zO4X?5<{Whf)fkLt%37njt>rE$U5KiqKODV$;Sl)=;3i+*O6CC5LzK%#QVUK`|{J?aCH*chIGt_QwuMI7yy!TB zC3+)UVxK_36P$qS@GQUPTF0<$DfcI$Uh3KN>|KTS$n=)h`r6rg_+L1dH=8*VHID{` zLY^BlV~jeuaA~dUdZdZ17$}IZCIUW}YYQy9n{>S9M^)(NW_z@|xvV549v^e6C0TDu zB}{O_i6n_u9=y47?Iigy_&BJC_L9%dmS9In>2#b#Kv)Y zU#uuJR$;=Svww#}=eZu++|iTC9x;2+;$sY9tb~5V883%d`w>)eH3|pnq?YUDS?h`F zY&B&y5p30stw1klZ`l-_=8jZ(?YQK@nSy|kI>=j`8n!C*BvdC@C?baa zn*W%A?FPvvNq0|NQsdOmjy+=zG7tM` z+X3^yv-b$IWRfp$ZM4L%!Wu49VcIi1BUAodK2QY4Cm~y<1r#e7p`(~;7!^kSp7p^M0dUk+8^C}B!Zntb?bpMR?wzl7CjlGbx-wYTje#H@M z#|?&$RVxk7vsW5*Q!rn!%<@9Jo3YBe1(RCX+Ayyva2C59gpSj?l8q+A_cP5;l6cSS*b6)I(7E#s80=T#tG75ZA6 z>{8i8&pz@LCX`)x6i?aflRgnd5me@32=`EXz;?PJgkF)8mVmOqP7Rh%2x)*Dqa-qP;yJ1m+9YewaTo ziTMbWHQNa57q$O0f7|4))k`#aA+ zz|MOx2OwanI4xs z`UfY$?vPgT|BuXKV&(5%@lde1+?+qxM3+iU1!pBA1|ZMxA*CIY5Avx;%za#x#y_dZl66tx6ckoR~#59FS`L{-c(!xo=B~7;kNdz zKv4u|#RYNGdNcVJ=WWDSmmns8L+jdhIJDIZyjg zYR;V89j-}mJaI#p&dF8-;z==p%Ym0|$dj70(#4gIG9B696CW2ksMo7&W{w`7=L^q{ z9)&nbob)7AGeWydUeW~uV_ zkFa+@x;p&6(A~BuvazdsY5GQy6S?}v>3#;zYwj#Rq8gICIsaTiX5(T<+dx64)T1%O zx7AJz6;7IYyYrT$bbiJ;XqV+GlNUvmXu2-Gl|db!v< ztBOwUDL^rK30}a?Pe|5)p2_c5xHMDI1=1*@)yc3NaYNpQ;iIqdB0X&&iueydatqtX zbu!s%o9wTG)Ij0~-gyRKSze5k|vz;uYr-zI<&LJ~Vw%`9^<W;Y z;ALO~Ib`cFo`V%Tfh<5}z|;X%Bv$4kDu%DeLq{VBG-6j6aD|oHh#YR?Xrnj-7qgAbLDrHB3seACo%QgUu@w;^FRXXf57E$3U_U^_CC$|)}^;ARo zAj*vw$QpA%ct|>iECcvx<_Bn%ccWc#6A*+Y>UH|a^QCoNpt)g$N0`I}%fXvPo>i>~ z+D1MQN!{{k8^H9Vm%CRsCy2!E*SE@g^pa%wWUr;LB4 zkk5NpT!hEU1P8A}0ab)>wg?1oh3!Ocpaideiwl5<{%jn;cEAJp3ZOTnzef?n#n4Zo zqCK%|lIuy!@LSbTj+UxG18q)87H&22gUNr&kJ{4@=4mYb{MO}895+9o!o4I#f{+8` z0NWhstmhigE8(R8K@e>=VkLvCiK_rv6)BC+FHF){fC!9I8v>(T&U)a$%p+LTJtYvRcOUoI^VKT9oH&2&(U2npLf@(>aU!v}SD{M-@wS{!`TMl7Es zIa6|oXF8*Wa(PkaXf8iX(niNZ+2G4JiPwXQVv$m~LZf(}xKS##nB-L#Sy#p>qXU0` z>1$hEif>;0Fd(^IsGVx7@LlDE`At~!JCx>krFN>p!|OU8srI{dLss@aeIGb#?qCrfHy!G$z4%#D?G_Yb)`jH4GYT)3X6=9Pbp1hUXq(}u zeGX46C&Op09lIMp9d_){Rs@oTXK8KP1 zOxc|9{`-&5o_=_uumc1gX2cxo*i=q+gJ|FTpz|$To}D$wkM}IPSKlxpdWkn_g5?i3 zjngTP4?^QJ6_t#dtNhZZD-g!YL?QGY3{W;iZbr>}yD0+z&tz#|Bcgx}|`#X>F*)pgLlthws8%rkuZ}Je%H} zyo<(xL3M#f#*UUpU@{%Y$fN~uh;?_v*Q~6e z@}nnU?8pLTKrLD0FzO)vOcE|ZHzSezogwYpvIlL6S!qI|C4aUPLOU%$)D`iiscWd; z&@0N1!kGw>Rsm)h#7K};1d0`HdV1REp+f6;89`#mW>*fIY*``CAqCAXoV`HI+1=^+ns?qR89s@NF1+cZX(oU6D6#ItO zO50TCQPW`n2F>Cby;O}w1Ob26G#4YQHMQb<2VT_9+i6PSq}s^q<_H_c@t7^J2Gh$; z$pP3zhjT3^*;+&l}#b4r%Vj`K%PSTCUA0L?4*_u}~w&tfXonFW&1*MdBA_ldBAk z;=$T{AlGALE9!o(?PbpXFc2NTb~U^1l9IySPE&(s4+X*%z{rGTR?bH|fE1@%QM2Tk z|2NFNeH}!}ZplTSJM8`1uV}#Ts?)J(AR=T4V+#68Q*f;&BK|dcg|9O&1Cvh_{(B;= zBbR7VgP!`1ZrKN8!;S6Z*(GG!oXi%C(;3f#M(<_7uBPKKv3}Z!x4#Be0vcDc;Raja zpx+)H`58HesB*N=b<++4G(JhBZ;RvQe^`X={kY)sXT3nmf z4pp9;199cYKvB}f3?=4u4Bt=OFfFi=ysCU@GL!4rG;OcY^Q88du3v2L)TMhB?sVh* zE~M3Y(9FP^Egfd>N?<2Eh{BN9E!g+?MGWrmHW{mJT{@{H`A}>>b1d#-&s4ref?o_n1f1EQf*NKZ|Yyv1;RGbXnc)F%O*m?SO3ze4Z6^ z)7I?}rq0GsH@rU>+nXs}21)y*;mq=(a~LwrUDXtPFy(orwR0A)XFdVNEOVmZ*Rsk1M(6IN~90ZcK>*do$EOoe$ zA8*k5{Pai5&1f0Kq2r`sIs=%>_qa~uWe*^1)Kh|rBMG{OWyVzW=%eK*4JijU(y+c! z6Zf%u(ue2XttsC~Y*N$%oKqLVKDbl_d#?!#x#7RlnBW$p_t=MGHb*$S)dB$OQeI`F zMA2TmJ0`JP^PYXRJqrwRu!Xb1myvX;Rk|pgxZwiv9lB3J?s`aN zPGAz?!AtBUuUpmZq;j#-eRmKYxCMzP>PS_@n~E#HOjM8`K_ZX`_?()W(hcp;%K)Eq z)HOGJW2?U8XazHhR7u25b>*t@P5L+uuovkd7IWn*QqH?R%UH4|$cvHPOZ=c13?~{Y zXQb)yP>g-?wN=Abu;<|aFjU|Ex?2FDJH7BiKIAI)O{&l;lrKL>?f@cXs%W>wGeK+y-R|3VHMh&<_$zKy)pS zh%L#2+HJ5NF@Y+u+HaRJHNb~OuZ50q{7RZrQs)b_S+S7^$CEw!I-IMQ zf=8P6-+nMIUEnIg~ZE9dk zjOFA*nZ#={RQg-s$V~tA>-!VKZ`RtOl34e<=vit=aTL=UI)##QDIn?9XuuM3pvG#+hik9&Wt zF)dK$Ael3{RRVckLB-CwGYgQfC@^>$l!yoU+OrjnO&eeY$Fc~`OH6dE=RcL)- zBPK<2p8IQ!p3r)HpeN=-S72MRI`+{<(ZNeFADP|CnmFmmtF((vmJLly!=z7@;I*x& zwOA=_In467lKw@}qIuAppck2`Ar4&_G?a?cevh(|TqBxzkaHc`L{NnFBP1L#jA1gK{8?3NoVO({ty6Bngfr(-o@)p=uRJ$R zmlFOn@?AY6syfDo#1M@cRe>o`EMlxdcWKdpaN!oWM);eCZnUAgyz?Wv4Jz3aOQo!}Q6s~CA0W|)zhE?fc6oa{mD+jIH2i1L z-^!H4bwFhek!49dMB$6050o0*f|0vX*Rz{wu)JPGbwVhHu>kWmu|?}8qf!92Sc41r z0rIkXtWHDyRP&-{N$qXR$YYm*L4&8>JpS8GUXClT!za>Gzp`Sb4HCe9tDR9lKOm8w zO3_Zl^R!b=v`BN|xdjW_1oPL1qm+mjgd7X;&D%0l!`{wVMPNz7xV+t0gJt$lYwfpg zy|XSlszTsn3GdQfNno5neX{@R4MiAGGcdATx>-*ZEt)5PgFDY)nVL^oBxngx1BIwI zejNUHJ^&TyWwLGNM|TmRmMk*~zfPE!9Cqej#J^=U73w|iD^e5^^A0V7Vy7qzLfr|I zOfM6KAFIq|ghpj(ge3c;qd|ekOO$6^B8}80^T|%6KQLR!&7oc~TuRHZ$6Z0$$SSh8 z1K|Ka?+~2)VOm0JQ-A~z6)~s-i%f31qS80ZE!NIuXKq8pNA$vwjTC+K=UV}0kMZZv zr=$q8;dm7gMFcO)f^5Qs&^y6Bc`7**O}dwbhSa_aObzBG#GFQO8-8WnP@z&f?{ z`<3S;AQmhhBGs(4zV*Uv7y|T1*~IuE<5_@KLdY={@cqIgH$50-Dy`+0#=pU)69V5_a3mosQF+1-px~&VBb_dPpXHnKH)m$!u!Vh+BhlD@P<0jUyNDB?J!dJ} zkY01F2CyOWpR|~dX+V)@yJSYPx0Nv|Cdv*9^<6tgkJK7cgPIdn0u%xjpyR3NX*Q9V zNNuDrseUZYj*G9n|H(bz{*|P3U2wH#$tYyy%$&Y`eu#C|satB(w#?uR%javz zk;Dn2QHC1!Yrf|IZD3_M+eTd;vZ&f*3Q|#Xcs!YdNQstDVKf_BJv~`fO zIT6DMYb8U<5;*kkEmdqGq1zK@wDRk2O*oC>q3?XbyH;PSqVi=@YA?F)wmopy^q`PU zFj!Ddr5L#);-bH$LFNG0%lbWtR1e0>S_;a@F4z4i6oE>+W$ep<=!WHRnsPmIJ7_L5*4g{Xu8hGqZ}+6iww z>Sq{{0;Q;+)9nJU0jNeL7*b=`gP%k$()mtSTX%_fDLwKj38adj_bL!QI!Ji9^i&w7 zVvQJqjtMmo=VBN^t_ZZh5|KpG{rm5_h_DN&D%7=dY(wr^rG@R21X@0W%>htAlV*l| zWTXHp&~MTE_sW2K5&@@>mvLTCQcpA~)qsJ5WQi!v=;K`@zsa*U5Z6UiPjG;jt8tEa z128}*=eKI$t7wAFC$m#9qi{x0!N)4az_t~LFd+0Gn~eyo9@xhNCtOA(IOs2551HXO z30|U_uEPy`33P$RI0H=|G1iM9=@Jc9!Ode=^VlA4y3hlqX+?XZUs=Zqh8xCF_?O)C zrqUu0K$6Os%PsNy+bwaS@2k}QV6BGrI0GoZc~LgRERRY>Kv$%ASra_qr{Ok0p~xl< zce#H23&}R~Ib=4HZKID*2^a6E>%D zP!?7FOHcjOKV6cSf!GWCd!;nMLBR-5mGEa|O2rE*4Ra;Yal$mo=q>Ysa}(!^iuHVn zboJMq0xfDD5t(2xw7QmC=yu-uJX{HQt97|ecSZBN=HOOu#0|DrQ>a`t;3)3U9)h?q z?ovRY|fOv*Vb`0O>a^JClv<_ zq)(K{HAby_&5P|Fhh8K02FjK;rpCRlmM(BqmgoeXPu!wX3x@=8^70|&qJ+vhfvVDC zUFnoe_z+Nqz+61E7qEkQV{v8AmYDv;&=OaYlI7=pKRUI*^^Q|Ki(@SUIxRGE^{Ms^ zV;$3lCX?@H8rw2wAIBBOy(^X+f!(R{q*m90mL2JaTe&+Iur6mJl>RpWCt(bSB2*IB z6J=Asr?2A$&;P>37_caRJc?liNwuU#fwOd&IE3o3!O!T~;!QLIs+q}6A9GH2ouI7D zM-(YnJ!K-dKWZ;u0k(1El7>b7mvUWfEI9e zIHUlJL}4`q^DkdjihfZ~PCsVKO(pa$8xWuv(RrpeoXuG-1YH zp|K_pux56+oI9MUsh8AW(@kIrC_M~~TjaGaY25HAHLa|VNtS}WMZBW@7E24!>M zSeZ9W;kIr?E%@Aj8AAhs6eBHrIr<5rvI5Z)qJh-30Sg4b;93@jehn|wFK<5Op$lJ^ zpn10y6R@J9BHPqDdSoqHlAAZpJIdIbFB5{x>hVsV#kc`UKwzNodI? zIt!$b{v2-?#%5S>{#n$m83y9V)u0gOJ#)?)+^pR?MTbLF!B|5A@guGnltZ))E6IF5 zq5cN08iR`r;Re=yiI0!~QH04R|D-UOWP>-iDh!#30h2qRP&42z;vzVN5x;8g9F{vw zust1McY?FVBo?0NdMF$v*5|N=0=NLS)c25w$Y+u(wI8-U0+R)d342nA5IlW7CqJ=Y zV2b^XoW$XB0vossd=yGuz)Dy1j;v@BK*vf6NiHIjSJFj=gE3NKKbN5la2esVhI<@) zovYxw#25&<%r+x$))-$(4e~}P|5^~TP2Sf<+Q7iF%*Q-hX`S|W^yY262zpl6BRIXb z24D2RQg}1xBubKI*4(U%sCh}!O4a!<^-lC&+<@u8lBpTqle%zl%7oR)psCD3-EKJ;0*tgM-8dP;eJtHT=EGbo^_H3wDPz3|>r8u_yKBXpUublCg z{ub)kbL-}`uiAXvTGWW>HlHMJuF&T%73lT^4!@p?OB|dkkR6de8k~J2b_NOIY<#ow z9=}!I1Cz@qHN+=|!j)w2ia!C`^^#3U-V5Cyd!2I(j2qLf=MUw!9JGWWp}T!t5&hKD z#Hl~613x`DU}sBw%m}k)Mb{Qy-6wW*>Bl?iqw7R(qQ3vDqiz&_ln-6QH5dSi! zd`KK)O?kYaneDPYNw~kGKN+XBOoZf%DThYxX4dbMksUh>_^^rEg3b;dHYrxCuM+{{ zlL*WkAo|)6X}Vw#+Ew|Uq!iLR7I=njr^zf>5xsZ6E;9+4wUv&|c6WDvX?Dv!@VEaw zy0nPLUNo=a%#QS(HjBKY7cE@aAJJk_V$x)>;^@Lfecu0gIA8dsT*Ga}zL*o=-`G=d z<4y2i-+$3_x>(j?S9#L^=kZWc_igtVznqwzJ#=v9k4cFn{q!V&UV=JI+(2ySGApv! zSS~dVt^=IX*4pIM|Dlc%(m!7!UOnFm=G-DODW_2G!AZGP#0vj+w4;=NLW_zeA?zHY zVYvH%I2Z25B=Ct&6@1Aetadu=6+)KKhi^PdEblF#ONOG6RG>M~SLP_;Az>7D{64o1 zi%so`CEcEuj4u3;no`Bm2QF}2cv5Q*NA?VE%?8tZeQrFen$M9YQqjWQms`)cgD;rs zfIP3cEm-|h^ZeX2cJp(^W~&JBm%FYZb`dNXc@oZKcz?}9rwAI0G_!?pG$N0Ma6$C# z7rfLb06N6wu*ZO?uX&ubr=SlfoMs&#jar7e3AEh>u71dR_0M%Fb18a^l~fnnJ#M@9 z>PVNCU_nTB8X9M9K)&Lq<~`@w`H64~yDEkh$O9%``+#->T0pbEY*nmNz#+_y&~~8o z--<&!f^&?D)F3|y$>vD3f;TEkal-1@pyNl+A6i|Q$VPjmqq~#QURB31szlc5Y7K?+ zKEtytPYL%-Uv<0ZQ7Bvph)dKx6_>f-;E>6ee8&NkaA_D{tqCLSiQ(!Nw9AK)a^yN_ zv@2r6a=d&+d`%8P$yP+FSCBCzjiQa9NzrcWZ!gdC;PEolatEm+t7_%r3#0_7#XZKN ztbtr%?#99o>&J?!{6x0Lddk{vO|=$R9@ZC1=zhup_cssu8N)xH`y>MTc*J6k#*BiX z9L@s#?JVx)x_H9qASywMr{AfX!;C!f3MzD+K<08ueeM(al#2~(ludp*ZKccd)RZvN z2A>b>ONPt56%t{Ma@#M;%Ha$2S{~1$o+h$Wlqos=L8$0m+*b0N$y$JDECwSZQryr4 zfe%hOnQWrgu)yb@IeSn(Q5ytGh!9R?NJ9{H93pOSB;PWMa*|GD1S**NKi%J1V=CQqBPI`ALmfjNyI&xv#5q?~8k zao?W_Qa+lr)zxgo(-;jezjfTD#bZ-pD05N?zT^!1-Dy~&)cD-TY6@6>$kNCDyNV9y zy_%h#5vxnz$guI%WALNH!_2tE-uBm))==mid}%*3FzxtKe8=SB&BX0g{REIy(%6QS zXeC2~s`?)53CFnNn~l=7l0HYtv~WTu#QN?zz@3fLn&(ic^Ik2060dm9pi+an)35>J6X#)Dtc$mee^ubQCMVP40^!^(vkdIPht6@s#KxHdoi=L?br8+l!lY zZNY?RnBw zAyM;65bVuRIeCzhZZpeW8_$7Su34DDqF;3pa`A9g)x{vD6~nHVv`zkpST7Fc9Y)?%RD|SI;`fJf=t}u&s~H!tjn$cA}iT|76J1so*P^NUd`Na0hNpy^~@io z==Cy%Tz5nm$jb5FsVk`wSmp%bZ*ZESo&nW1ne8qI56C;Jn7r-<`_S8cE2}Jp)hI4e z5aEp!1KvwZ(?Y7ilYa_zrGqtgZ-600Rv5sQ@L`U8g8%$s2d>m z{varQfIb%Xx7v7(!BaKI8FD-|3TXl}PY)6tH7I_@jDNOaHs?wpEnu=>LMIsw$t?~d z_F5TXOB?mJ#VdyznX1ZO$uWGFnA6c-|a}8LUkEvIBL$LwY#Ljl9TPIQyn3y~{4R5ZnPh$Cc+(sV0?U95Yr>nn zIV0!daQRrC`m>sR7%*fBEPd@BhkiG^aO&d=$+I`%!iUm!#|J&q_bK&?@^>+zGpQ=3 zVRV%lIHu=#=;P3vLi2X#!W(e-pjYf1-xQL(hw%!cMWd!UO6#Isd73a5Wbe|gx&lJw zssT(>zg1MyENF_-v8!M6a&}t$<&YP!h)aQ=R^mt1=N}kVFr^yoh|qb{q{*>8^5x8x zuHf?;TM6xSGsk>5V&?Cu9rYhSG`2U2cF2}X-^Gn<3(v+^Dw$LnZ8a@%an+hvui!E; z2TK59m>>Qi?xUlmQt}{hc5%$eP3Bay*W^cWe6Qw~mV5@c3HCM`O4co5Tq6hJ%bebr z=@%v~oqIQ^DHpchvU`%4lXKHQ;9BL(WKKAo=VdEoPa8j2O!Y_=P$5$yl)=HbR5qok zuhdTjqQL=ZfDz^a-RLO2Xi+uD(>N7_G~uS1DB&iIH!DMG4F}A|M{gZeTx`ftTmcOd zSOLjq)Z`j+Wni3@AzYlB5`S^bzvyxu4g|6!o~~=$rpd6b#9bXo=yEUmShyNu)Pcy! zLDvK)H4Iy!+5}F;V9?G+?Io-R9nNzmJvI6keId$5|3ct?qGiB?vr3{?ar~FL#|G6L z9@ylEEY9L!e})n|!lM~oD-kjBnZ)x|$ih)0qnGu7Y)=!!aFU*;(LNrvWR!TQ!_0@k z(I6T^9~pCA|l8b=H#+OF9%Hi|5Tuw#$PSM^0bv;ar}!Y`Sk;q2vk z)$T5d*+rvpD2zU41v+xlpQE}bADoEv$3+_}QRa!5hFb zDCW)W4i;3D>^{Ql@_2|I>qCLAo4G zEKw*f2C9K8O(H04u<$c6T_hbmDG{-?RW%8ziaqtn8b9i89n;?1s^!ttlr{Nro#n$n zjFF4P(0tI;jTWLi(rA$lJdDep%nc=aXvFo{*buTe46^5OBtGb~U1>n4f%1}!iDD1% z1{5a*u0?tU2!*4B9UE-mEu;PbKEYNbcS5j({0JmavMh#x1L#QA8P6b10i?6R+Mawf zb|%~eIRUp6lQhURFMQ5{#J ztH-_K*o;u0U1#9eM3>3?AMB?Pq$(HdwLY6prr^^kXD*-MX4 zb^qf6xRmq5kQ-K4K;{kz-8o>_Gyl<{4Qh~|Y@}^MAl5S+&*MbZ=tE~8{4%v)kOHYa zKKNl8SUx3K7{#kGB-nvcyW5e}|3+gmKv39L{KkzRCY)zqc&l*up0Ozxt2;RC=p6K} zja$|)U(wY+xeph@@fWaD!Mlyuos0OZ>Y&vyYbCiiQ7HMl+JRpg_x@Z!W9-Y_SDTO7 zUQ&9Qnl`130>#e$ilvYD9Ukmi#`Ba;==m=DH>TxCVR*m@3zUN1qS5J?k%u$S2S4RV znv1{VyABgp0Q#2=;Ps`LT^Aq99>gY_uub_(UX5luB^u*7 z1xi(sWz&_D81`v?`cTaOAT%BmvfYmQvW`^HkHD7OQZvP? zenx5@Gj`adS>0<2y*OWC?e3BlU7xm24ZlIDUODTCHQW-%$BiF%#F{j!i5KWUD7lca z#Mi|vLHQWg0C%mAZXr?i^StaG;9A^KQMFI~o(8}AJpdAJA@)WCc>fAEne?n>qI?{d z>^@Cz1>$3{99IjPQwCKBoS6g?bP?GMpm@n;*9pEx(1CXs-HLD>mtdt3t|j?@G8#b~ z12~Ff??z_OKntIC!ciRoslEg>zM@@q^=^o&=Up%&rPyAD^l=QoS^WfB zRZ_datJ?`b=m=sj8r;#P>qt-kOI2|^txm+vmQo{r-)?X0obByB?3Cao(B zrQ9n_3d+FToeMTtuwWeHd=E0?!rKEc6KMs}IKI?#+{JAuCIG1_BpKJ`^N7k#5Hm$a zNa}=3@4`b#i^z`xS#F0cpJtI64+_|o+SIXvP`UL#`i* zk)Kt84gHd!4bnsW>N!PZhxQEY{>JMzJfj~0 zU&^hN&}2EdOn__JJ=TWj!!G!4)M-mHo5gl1%)0Oy0BZKluj0NfdL?Hyqr65@O2P3W zM-w(j3v<@kNaD8QgWk?8uxhj~18;mAjag@;7LyM5z-pTA9uQVNgtk1_jDO zopg&EI?*qHGHZ#V{{~a&K7j)lM@C0QD?%XK)1(+4uPYXR5%cMKPI%nJv4+`e6QcXQ zl{4e!l`IEA{%~LO2xT)<^GD056;x`^Scf}|KoIp#oY0$Y4LHpd4K$rqll+llBFZQh zUoM{UckJ+zU5Hs$uUHgsJ~U^=w%98+P3BD&amsNY<78(4-Y*U+9vI0VX3hLT2QN<# z&Ptxd=#$!}tw|~Nriok+a~Vw$QDxaps+v`PMKNXkm9!uIbWkY3+WLN^9GP}WXaNPm}j z#EpiE`hLG3}INLT=S2|teg<*|{@`&F(Dfv-Jk+2$7w*1Y;CNKZ@u;T?WuWR> z|KXzm10%=+s!bcYDIe`F zAL2liRS0~S`?xXt$gGVJc`^*!9*vh}KiSE9cC~@Aowcc2%)~3hm6+h z=0X;N2b-`II(f@x7`G!Vkr+V~%j;^MlvlODGUW3$#%gY1Q)@ri&T@4Kvx0~N@7q=`OYJ7-^d(Gghiei2!^q%#}RM4=G&Yt%a#z^Jk*~^!?p)$Y9a!Mw6q=u)WN!m z-a%ZCH%~(C4Nt~0wjrpl1WElm(FN<~y8$}F*dnbH!?Rx*f1pXhs41elNqt=ecGX?$yXMq%a!B^^ zPcLY1C2QZFZA_bbt@L=v&v)jJszQB0U$?s+;jsWp0Z(su`r{8zm2yw(<$8ndBee8; zd=TEn-$vQlg7fhOW1X-{R1uu2f2lYovsgB7a5PRjC{>iUPQ099@|PU^GUljYuSb&c z%Hl&H6lcQKJN0T2YeM2+5+nLLR&utn4RonlBiU$A!$a5>tCDxxcdbc1Ml(iRylHY! z_8@#R5Y7;Jfewx(;gZ+^`};jp_K_OPt-WqrDydV$apIi?9p(-*`E6)F=Y#*r%KOFB@1hU98~;aDM;xZT zU-UJkduPwHBS_UHjoj-98Gv}dLd1u$t}XT=AvuiDYWEI!f0o<-h3413qQ3m@*%4>L z5-Y;@8Q9ToC}OYl_GOpcFR_oQuOv46su5d96oL4a&j^8qjk zEWYq-Zx}#;Ac`Aw`>SEG>)xJb)^@e#mi~pTV@c}NMfeofEq6Mtg!%n~D44)xsZ*B? z94h6zD7z4Ig5EsXY1mS~TphuWa3z2Wy>_84*9aNK=4eR7$dA3KZxMdI6I#5Zj@$41 zqfD_(^a~swA|sCjMQT!A2Z`*%^u92gfR{-x-l?{1VNh#m7>1@m@DrF;V(eFs7BkAM(`1={ju7~y9-YTqqa($DBMpu6E%W#40?5?Lc;z8A+?tW6vY~E zEF^#%kCYmW)gh!lkjtLl zXGEb|w|EPeBcTHm#sM#jg66xv61~DgJv{_erF9PhY?F891rE}Ey^gey?WUhLwQ48sAEZnu9N7H;0k{L>UF zmJoDD)L}vQJZdaqJQz`SbXvuD^5DjyG4hysb@kIyaRM?kbc%u_^1Vh7j7M?X-I8*z zhjG*IChbx;UFoH<&MhLMmAb2cbyk{L!2QT)lU0mYD)V>nyoa}` z%ulcXm(337d#MtuDE(RXuh*nZ+G+l_H}3o1H~cRga`e2YSR6~$?uwl6SM4P>uyOb( zXlx&RS}nGb4LP}w<(xv8pbC?m| ziir+*HgmB6Zm&%d(OB@PSXxHZj|W~JixpH#Hw@1F8$BcbsDGd7%Rq?36jxkh82IK> z%=F=U{5!2RQpaF8vXfzH~dI zRP+lmj@pLBY};0AjnHOF*scOsmw|=R-@3X1SxUim*JogP?{G_AigS6Gz2<~LkljWq zV{*m$jANnjy>^N!XiMJ)l8n1$OLp zGp&NBTtppV8ak$T?&Wp%xAu4T%a>^Cow#w74~7h?j$7N@Mt)=?K5)5AA3N$Lo!nJg z2SP^g8B%qN4G4rfIKIJDTl5prF8UxFR>U(egAKIfU~K^s!}3dfYpRzGpBc%uJ)`&2 z@bbQ^wOoWmI|hOz-d;J8)mRcuDC^eZrI$1)7puSFa`nF?t9B3|t^)AtN;}_wfRT56 z)TM~@%G208YD6(9i^9G30u`r|I7Q&Wq(^LNurq6n&I-GZmzh^TL!Mca+A!iQt= zmX?miRS~Q^bt}2+T$AuvVeQ=gniqyU2w}#GbIMzI!xg(0v=}Ai8_=5KVTRYHbr5|x zI^bmV8iaAwWmhyPa7)+5Cpg1#W@O9PlvOk2@f8s{y0d>EEM1T4(e2k4)@6n%Pw%%d z!P(HRL&YFzWi&A3-_h$MoKSkdy;Ilcz!H3XrE(F4YC86ZhFo0|Fx@7oy3pxes_0$X zlGFKaaj)6KcW1y7Ag`A{j3|#k4F6xUp$AWeggV5*oLxL`??`_=ViG*LKdF-_k#Q}0 zzs29$F;>F1y{l_pUDsh%f@$}HZn2zPwG>=LM6(J831VEtM3vE+euQ~~dxv9_Ck9db zF=68^+i@O$M#asjhg+v9jW+Nb9BIf7ADlJ38`i}URoK%#a!X3s<))%UX{fI%t`~_! ziiS&e2rHNiC`tV)+XUw_(D8|Y7w0wmiLzVgUx6ZUl-&9XzPn&OLVi{X>C@?URB|qA zN?lxeestmCJ%A5$DtpZxQK5Zi zj#UU4T)Hx1hL)F#bs^K%DRlZLF~!IBl=#!&}+?84UnKce0QuBof*9+tU=Nx=vR zf)k=q8GQs5K}1kQC19*tQ9$d^YJtRRLK_(cB*-8XkUB7^HPlv6+X96$&p~NxpQ05R z0uikWNl-~7kpDWD=l#APwkm3JbMHC(tiAWzYe9of*wdWA_Y*Zr2lrVgEw&z7Xg%b* z)Ox5i1G}hrlaIvpXq0)hyQnJ30b)<&%@%u<*Uiv3C`0QgW3I8R($Z0*L0&mfzfsBh zW?8jn?OguYQ)%DiUC;LM?2M416E=n+YQ|6G%Ufq z-9^E5+&vTttQgml+_D@Tg>~{8LB1ITeJ@3YWp^L+3&q{JGvFr?Miv+6Xs6N4=gLkv z@W&>k1uB)gbG%l*t2$ccRBGh7(yNhX##x=kZ^_MzJK;I->TJWiA4B@b&n`xD=w(6w z=oC#g2YOnXOV3N5N9xx&@GTX)`_0Uz20c}F3Ziy^8j+2!2U8OfI2j(L}-9O|y=61{WUl0sW~;YH%MXS{)yJ?~9xrmjZFPSw8G zS5>J$cy@WJ3>6mri|b}63wfEYVy_WRa(AbHL~O^w5@Lz_Ua6B*8;I?JM)EEnxy8lv zb{7|K8oI*_8^lp8#^Jn{f!J5@33!}1r&n)dthP=v-fyj&^Q+7e(9N+d<1vcSn!AU12`yb`u{UOCP7H^g2LHkqJ8Lq!RDlyvr2V zv*xvZGR{Y+VnIB}7wIqLtPpCj4uR@P9PB1hjc0D1dyAG+j$Nn$K?+D5GR}D2Org!Q zM>UJ?ig0Vui+v)y!C@_9y^#7qHzm_s@)>t6tESqGhMFl>)ifqB?z{r@0Z1j^ zN)x2U8TzI_ll%(ew^7b@@g)m`gCQZZc}6-pPrraJIH2KP#+>)3EAONZjpSN2BII_T zE@}*a%sD1}y^8f5DX~61XOMi31lom0;(AGDAANizR47?D$Ft08>fiB$yZ#tJQ3%tb zPYxKcvex5p3nDNaxC%8`cc@N4i57Ig#>kZjGzgUecsh|_Nq%AFA8B|8Ox;!*&`LS( z5-FEPtmZgTQR~GoRu+tPte*4vaZfo1%w|>TpYJ%48n4gTLOM%7u(yMJ%6R5- z`+1J4zxNvbhQPno&yi{2@pDmDj|Hnv?zqGp4y0K2z;pOthY8mZ^fL1yq2jdfR@ygu zgR2H%e$^Vt7A`s8hU5m9)mJSE;{g}|O7K?XdS6Rg+-qwrvsae!GHc&c3u&N4%vAnZ z?rspW&Ash_ds}jIg1h!+0}fzAfQBZ%?rEPpe^TVeFIr%Is7S+XUL<(j<>843m-NJs zLf~bCLaCOhpMTvQz&ZQIuF%qKp?|qVBH5%joVdq+?$-PyIu7vbhct6?s)B)WaN8EL z&Uj1ku4|7T#F{y7^%cA4E1$$9+HV!Je*{|565e1LFz?#8E)BqeCi{n@b*JFNdG+&* zNlo?Bf~m2$X$8+GPR;g~Yb9)R-MB9=*-PT=AvUe~YQoxPQUWa&^|KI3-v={wV6>Uk zuzztsfRv?_R;}5mIi)G}RJDglJXK214p+}go-)6$nLE7r?~JIc18ejR7dQ$}Lg@Hz zeEhb03^go#Bwf+>;dW0=l>z5~&Fr#x+DezkMf3KEwoJ_I<4vv!nYgJ=ju|#a?ecK# z_+m`!G8PovW-8fD3GUPn)mH?fFg()*<*Z($);OvA-o~F{C!LYayT)KHdMuRAGXlM= z*BLyB%%L!EoQu~rht3E5?2gfr5~LO+gf+??`H$s}B&V*vNuCS6{i@-XX^D^Q4xIQx z_XmJ2qj={@*VJ?8~xpm|KgG-$HGd*U`uXfnCNyA5nd)JWHu9NbS{8qF1k(e#_d zF_({EwUz(vwlpy6Ho}dEEoqXV{)7|GPO=LGmvq5@(*0Nm(cYMY`E5WKdMWT2V1nx= z_?xZZGQuw~y*Mk`KRCKX?q_-2zuQD(m~sud*$C;Zzy3V>) z_%OEwbbFKvtjtNn+>NBeyyzLT zHCa`bVDxO~Lv`^Mjik6e?PPH4>M^W6Lv2R|Vi+A;|0kAe=r@ca@-@ROR|5@Agw? zmz71pbY!Zi)1Y)!>*}62M4A;JMC?rpE$R6K3)3|bc$tA~u^{j^2)pH$X{_L_V1b!( zS5$;W{$^md&{(Erzr1Io#8msXHQMNolVTuBd@u)|Bnk`c`vbBpWfI! zcZbj*a<&69;ZOPoKKRF^$NX!fSg&-QdQw|ZJ6|zR>NNT*;Z$l&(WJu%2l~`q>OE6! z1$cQ2BLbKqdC8r1(KuBv z>Z9}KLnt@|Hy6n-LxBmwFb^3=d9|Ijpz2~dBplbmGfKSkNiMr$1#V3_E7$FUjaPbX zywjOHWJ5T{bj?G7V?v|MJx)fMlYrW|vglCbNEU)5u#l_<%MFQz4agkK&m<2e;S%Od z;oc$$r^L~66azyGJ@yd1bbfGCc+r-nJnfJ@6sk2ak!b+A76B8jD{A^VZ6 z2g3Cm!O@5mcp6|3ek`-+#~w_9N?MBKvlz{{l9B=0_YPhfI!g~AQ}Y2B#lq<<*jDZX z8V`-t`#lOy0)Z|HV*|%4E)NmGrS$(8<*i4AjX&YGlvsWHUR%m6T!7xmXH-aiES(qL z#9r8%CX`%{DiXU`au?HeFCeNx2*rpfieN5vd6aqj>9tEeh;MFd8dO1{rRs%ben~Pa zJ+$_#^-ag1{MLk$;eI-8#dbN1EnF?uwPcjf&GD9`vVK5DC`Jc3jaEu_#93^8l+9kf zT7gIl$JmGmICqTba6hA8_@R)q9UmBi(t!izwK1syyJJEBaeojDpyzI2EZWc5Qf^y$ z;#2V*WObsTN|H|!?keI5oraoUUY;3adpaTn!Z5OFs5C~Q7yx|Fuup~z0t%#IxOa#< z2%RXs1%@@W1+o!awlq5}uF{7KtthbPM>ZAZ$S$;kd{=dVq~s}w#WSR*1#eB1r4Q+s z08N$Ew;}4<+z8T;ElA#`)0BWZYn2t+V<>I85~&mbKiuiwyPV+`vRIIqVg;gr=WbBO z59jS2S;MFXV6VyroLz){ih3alu}CMa=A4PZNh~TtnPDsHikkqaPX!iv>ogTLdIQK} zhO0;(CcE(`kh0UNCXXLl1c( zoWmk$MGZNQWQE*9MolzL+*ngzVUO)`Z|jre!PL^lUcGeV*`(%In}c7QGM9`Z?-krK z57%Byg@Dpp>4vFRC`>mNsOJCR;AqCMIgsG>jL9x06Vny!wq}zA_cTra=Im~!D`QSl z(V|Mr8}V_pqizO_Q09}fs1sD~!t-|gv!lbZ_uZf zd5UZ%UHZ-ysP-K!P2FK$d7`4KE_}OmcR2seyKd>_7=foELv>cQBBpn|MZnm$) zNPPNYBzfu%hew9?A?6Ew99Up~)*bWquj95&>`E)}FjMkOJWTD2JkS~W)79p#I$ zl}ic!MJ?{gZc-jWGTA4;Y-+4Y{W2qny@Z7kDA~t&9?V2R$K9p_oMTqHl)M^n8D


^yVPk!J>y8R6?ViP%#y%|Fb3n68l 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

X& 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

P1s)m_Fjl25H)gt{wDC7&Z z(ne%I(>dfWK_P*CzAw|7|61mENXCU-YdIH7V^jEexwx)S)5zk1m8X4G0TG>WPn7)? zsZLg7k%Y!$xQv@D(tma1)@AWsR1RbjjqqesO|N~meL=P9H=SoZYY_xC&>k0x#^>;_ z1v)K$t~aE`c5{)Cny!91vm)-{MD)U_;Yu7Pnx5BgOot<{nX>yiRqDO9_x~SHX95>x zz5V}0LB$1BCJ;#6mr+^N0&ZLp5OM1QI++WKfLrO6rLICEh{)m~?ucGX7V|QcCE6ki zg2*C^rdBt#t0Dtv_m>HS6_CjM-{-;mf7zAPLtz&ft$@IsN+5s z3)KDKPuhK43jjE|n}b+H(YIEHODZAqV3S?qyb&Gwfz#hM1&#`UGS3pXSAAU_ zb$wcV`__i7#=kJh_SunJ*!+VGCnA+RM1_oxu`6k!3cpxn113ll79y4ys zLUz-22?5Ar#fjvs^)a?3{vI`%m4~`+DI$Eiex8Q^m@M4o4@MtsvG#9!L3tM(J6T`Z zfpz)(S-Ye+IkNJd(Fs_H%^jSiR7$wOU5RD`++8^{PiYXUJt66&&A*S%9*z=|Ldk2$ zg4m|!Q~a@kpdM8_>zJ!bp76G<1jkJ*&{kJ&gIH@h6uc2|s7DPm-c2}?6e182cjCQ6HK8sJcK8i55eH+=({n=koR zrW0@(Fs7A3qDFCNql9)NH`BGDe)}16pT_Yc$zlj@o_lEKFpCXG?D98kB%PaExO+f; z^l=8^hT!iZ4syBr4Itf)ju@0E?LCp5fYj;qJnq>ae^lKUZWPA`^dnttSlGJM z=27!TEIFENzCt4nD<->i{7qH$eRXDKVC+e~ZRh8|gtk8#=BWPsbipod8O9GBo|kDr z{>EdKXs5__Ch8|U*11sgj`qifCeV;_iWbsYSrfJ7{2{y%ro|ipL=p*!t27702bwJC zKW20#dVkBSZ6BDb_JB6qrmTA6Xp53LdsCg8J)C|yvjJohWN#82c)-*S^?uE_IoV%^ zjye*P0xA+%02X{@op+sKTlPiV?)cViznwRZH{L3JAz8^i&zhEgrGttM z8J8|tHBK%csPUNSP?O1CKy7LfPAK8>q?8R`L?of9lutquLkN6ck?Ujc@INlVq1a^} zHAbqExWAhqBM&|webC_>zN0$pv$-=z4V9bL5ARK=_7x#fYhnZ2#?|^1>BjooIjMq` zjz6EUk1@Rd#Fd=7WvQPHtStLnR zp<`kY@M@}WE2S;KZ<&-R*}amF2gHf(k%QSKaB=SI91ooyomjZi9 z7nGxbtvNhKh@wqPI~UrUPEWK`CDId__L3%omki`s3Vb?OcyTpR7E}omLa31>Dyi1` z?}(n9fjqFO@!M&L=vB0!$j!%VjCI?&qKUfG+0*8k&Ni)^jUrb>zwbb{7sOqqX8F|?d`wL>{YeR zos}OTi#rVQ_F-`Doz{RVTUqvgIZhp9OE>l;guwgM zc&o@mNP2jpGW{Zr1;|}!0c;Rp^(k07w}Jr~^odDebN4hK_DdWVh3>>_xblUqsE5htCz+SuZhBvp9^o{m_|m0@2M@gy=ik%agm>;@VDhcu z7&Y|Jgy`iEjmf>DBLd%DyY6zcBRbhN?xE2U?(CS2%nYgbYjoDFcI5n-CV>MOk6!C< zQm(!mV@pO(&k;mW;8z=WN~=sQ27L=&wLF%+V|O`kanf96nFN_Gq}KpdBi4DT0pJ=J zk#GBWu1u=MR^Jm2lpk?4bEE*tYn(vIj|WVrQh1dv2p*hy5a`AkjXLCE**{hqFDQ z&Sko;*y*tSRA^70w6`C#lDPAW+qR1c`oW5I$-6lz$p75bdzWiwfq}e+my`^R4_l`& z$O#)R^!Wsq2(Ju@nu3NgFF8-R!oabek-6|zIW`j9)=@t&J4A+=eBk!4j-Vt4x{+4P z3KL5k>L4rK;cK&CW7)e#MxHI&K+*zCk0l~@8=};%2W}BIRSftiE$!xEb~QaM+mwwQ z#7%6uAm2)yZj;RkXNZ#PA;~kD-Z$oIpOcMNVL!UR<9uI?b;8W6#3I$jRr&1XzP9-+K_{s0%3$|sXt?-cFwb!O0864IL}zNA2sD8NY!)YSQr_R7;~1O3|mSKX2S z71iCETbblh8Oew(@N?!J@SDnH9jxZsvhi?=93=_HFYvSvh*VXlIqh-3j`FdHfGv;> zFvkQ1@gw<@%2 z^1!m@{b}05z-1?r&%BOSabA*kj-ofVljg40fV(CaSHB#w64_6TjAD_(N>&|s-5mi@ zL?v+5a#Xe3rWji;#9X!ikGXYFzOUR)~uHu%M4quTggaM!c0|0dL%nc1xF_l9P5O@nhl|5Qu&raJw+ zZs?_*jG_Q`CB5Um@^Drv_a9K^_C^UE;Wd7BL(2WyKJPfv^|G}^cJBv0Qz*2HD-XqH z()5M)0x%N2eCDmzk--{}-XWuhIKi5A$gj9f{1?D*bmuOdczP`ga2Zoa%jFH?iK2Y; znCef7-7W-Fenkg%&J||f7Hjmzfq>aJ^4UtP1fKNPe7Gk_MV2e%IG+>xdD$kCSn!%T zg0f#5*wWG>RSN0v6d%)p+x*%nW)~TJC~!;odc6#!uWe(Ygw@u)MdRdFH5oC_QZzqG z19gY4`0$1vI2uh1*)fF5=Yt?g(i!2Gc?AnTB~w$74Hhyz{D?C>&f?)^p zA$+GFqMlSi_Ig16zy)2aK5G{q9$r|-R?R(!#G7QBx*3Q{eC^fh>F4YuwZ6s3$a4dx zd-N!$+nwq!#2KmtJzI2((tiPkOaNAa#igYbJ<7A<8icQp;yG2Z0#afus&3Iv$OZ93 z*#$*EXD?bHS&nF-&Q>T19Esa4iF{6j=ou;0HhK63MLn-IAi+?)gebOP%ur)-Zco;1 z37bP>_0%k{wXS>Nx(q*+M8z%-YRTLaZ;Wp>Vr>!JAmmZ~WE0w4+hxQGh%h+iDSh*$ z=3jpu^t2h|`_A0L{u!`JV7;tB06@(JmT8@F<5zgY>R~+R76hv;EkV=We2S_W9M!Kq z*Cg_1uFYk71X{KW48Fn+22aSGP^mok$=i$<#l7kt_L2IN1K4`2s3KGN^J9k!~(B3drBOM{NVFKg$5sawc z??57_yt#Vj`70G?B;ZTM%!`P^(zunhSYSKS9EmS#%ap+?8ZYDM(9MMxSmE@*?CDy^ z4Zf$gU)^}e&NhbcA@m8pd}a@f+dO`qnJbt6%f$_u=2ohUf$j%`{~gfKXNq$d!U@*r z6GuNVwb;-`-)2NC8vNTJtC6Bm<;Xt;AzgbR#&)l0IGGr6bohwFCQ1Dgnzeukx%3uG$3tslY`Y7Uii&7VszpN^3YQ$r!K#yUVQ$Kl1tytoWAYbYipuJ?Fa-QGjndX-n`xryIQz~O)Csv zk(~oUft*SZkBBdIg;>}?_;-?>Y%=IowUfj1)LIv>%8~umT9; z9jU6$4?L_IFLb#HT-9Jx&A&Q6vUg3JUzTK_t{Gd9GmT4yPPpmV@Iq^qsCc!< z3oW5{-Ct{(w6p&@M{W2Nh_SO04CxIaxyb)aG6v*3FV&B?32F3ZSuP2PR7`Dz84tgl z4{~LDom4h2ZJ_a_b&kpAsT0V&@msd(A(AcEED4Nklt4id^ink;O@iiml8&S5KBb?e zS$Je(V1ln{u6}_ucctnZYT=r& zQ3ZjhAs<$uNfJLkgcHnLK}e8d=fs&NHEwK2Yr^vq>C-XxfZ2Ic(jL%Gn#e*tfMFlwq$4?5KHw`kaf z&<8P|8t(=$;ws!`mHxIcOyQExLcDU?xrP=mg9O2KJSuz$^*5Nxsw-W2Kzr;*U2V0BOtm+WlZ#T2 z!Aoru04UlQgD2&*ZR1D+sC0mZ=CH)0#$qGq3N0WuN1RF58?Em^mP<1J>}1^9aojl3 zv$?kmk8-Fgu`n{z!LayIUVK_smnQ_d7N-}_x{~4_IXv24ySY^#^Zj|VLYBe0w;3|zPP1KICL1UHWRn!I=OhXrv6Ghk#m*mFFVIDwvG<_B z;`z}V+&)q!-;S_VPt-66Nz;d*KV}w5G#q{0RY4DEapG1we*9(DnkwV?WeWBlk~hOt zzCy?&q_4n8At}IJvj%k|aSu#r{;SF&Q?pPgSdicrsyL5 z(8W5QKvk_{@qOkU<2NWWPQhX?!Dv0A^daI28;@Fmk2nrl~JReSyb@72p0z^eIGZulU*)sYyg}T*9m(s(A zrV8~}MsW(2-+OKQBWk4RTWR-wiQaUJB2MbpfrS3zt$xpaj=SDh^Ipux=8%K!m4VqN zkycsK_s#W~s<>v9rb>4&r|noe3xmY_TD3^EqBP<=pW7xD8o2Z3!Ijow2M7iO79n&S z(vkB#Cw0jTdO?0|FEHncUB{iI)saU~Z8}7)X9K~}r}?jH)z=>LD);;x!G`qHFp4B@ z&de_l-mGv*@RA`X+xK7SZEeeHwEOdw+W`a>PLCFLe`+3Fw@?pV9$CdO?+j%v9#OqnML=qxN{FC$796E3L z8{hDJQQB>5{G;^G8wTt6UmO}7UWw}y`_Qhek4bMU|6wU+Q=DTrQ>wVyll1KA_^9iz zS$t^Am=jH8B4ivFqO-c*1Hzd{`ty%o6f&cSs2VK|i(J4moJL!z{xZ=j%gQCXr_dgz%{NR($WPFqJb{5$vmP<+-lqTBZn1V1XK$c3Rtj5#>Vg#~ z4H}JD(NX_hNVU7r@ezGP=0n9!qc89*K|6fJd+tl}3!@LD44Oj<1*U1eE?P1N8JY#Q zOtvXoL_;1!s$0v1?g(P0fD`BSmVB3wII)}gkB(z*O4K1)1+KW?Je{Fhf{?HXiLfpJ z3qzjvkQs=GES+^`Z}1PABF*`36qHKo)?u1TFcP$bFA_*%*z_6a@=W>| za;)stLbF_!!?bU?84CZLV8B7J08K}o)7r+r_E*E?^=tdez$80*#!o{Zj-#zDv^O5| zVtZ57^hG%i&@NVcjXUX`asyQSh!;ZzQx-Um-Mm4dQJA#)L{Pdw5)f_RH)2MrCB5jI zAu5S&N=b6@Sm)*MbI(>6*+u}1w4CvV_>VhM%svCP6W(4T<9Xt^kWQlugX7QL!>dZ@ z#kPKfLDh5c8zcnE1U2jg?Z^8Yj-`WD4Qu|Kp*iLB$Jg%n>`#7`6@4%m9-kAt?*V|R z1v`II$=^yGPc*edx%jIX?YCO`dtWvw9n|%2BY>E()w6Lzso`-)$4Sp}|EG43d)snP zD3qzJPX;|77WZpo__IbMz1i>=mG%1I&SyrO(ji^jcV4bY^cZe6agDugi`@z6^RzrI z#>|`${}mtofAmJ%A%dKK{F(Lrjsqu^YRB!!k?ugl|Mh`xa*>4Cks6AxX zv6S@(p=b!vE<0cceo8H$0!pj}p8{I(+o?^cy?V*rEM!f>j%8&OIm>2MN^_ehTR%X! z8kf8(KUsZ2XteB&xZ%S41B_AJKkkX|(MnCzKHW{-+&csXnj7t>5V!@57*8TA6eHG) zI0wIO#_i54) zS^i3YP1)bj5&4U^luh0!qyptcyGwpsCWYk@!~H4{|bf3(Cc zG;Jzew$9929oLU~v&XtcqG|bCaQfRRy^2pqtSs;TZI0yW2%1AIF<(>LMwB;2MBka! z%zbkcsIjOZJdHa6__LJ8CmmUi2Dt1fo(W|P_2o)R)*F7(gX z?TTpWpR`X7A?I6rY`8gGTM^p0lUy8ZCtju`%&$C94Dl}-s&XfJJdd{sYxH_bteI{K zK(F+`NW6Mt?E=;T1AJW)sBplw7+j&qZAZ)cB%eyJJ^zV*s!Hmx=6NS_y*&e5Cr@11 zCff*|W!vYk%M1pOe6G3t%j8FU|78tq?Ej1Z!{_0ArB}T4RA7EP@0s`{rc={k3r#;by3x= zbtt?S7yHM>b4n===_6AL4Z2 zGOuQDnwb0U$41=DA((B+JdhH7z=yk-f3u--^)k%|x*eRySL!=!?z`S>Sb9>Qh>n0l z&^!*=y6aX$dHWH@mdjZYC!|ET}%5_lq9B2f%#{IRRLVd1_cj7?Gm! z-ROzRv=n#b3G-Ubt^U6+fTR#kgBBSM#)kLk)g+N{5=TTijPcIjL;HIC2tj4lC7&pG z6OlOhWR&J!MNSliFe#n3g2&k+e!#Aj7yd=lRm@Z~8r^vl1Lz+G30`+Ar=v=WI;*0( zlwb50&9;^$C2I?h4PPEeOdGH)X7159+4g6ac_nR&8Q$FQ=XFoxZ1KY6BHzkv1X{42r6dwcjTkJknPGgv3%Uw@5F52G?a{XQ`0lQ~NIRm3 zxP&`+@yj2vmp;bL>Y*uReN)1=x&$mcqOD6ClcQ&zRpEZ#SvyC=cuoq8&tZik>Jv=0 z(EbS9o=&F(w8k)!k3s;ZACbFT`{PukS-AQ#mH62!eIz3h3n!pDPI%0&b=U}SuoGPa zawG(Y5AR98>^b#CEx+j2H$rG|FDqjj;r~FqW!@y8j0U*+OG8tN^ z?k$U4<}$L2%-(M&f;yz?=%^MQz>=5ICEODQcNiEYE{!h8kC7GMuS^aCA_WzqWXO&6 z`7L*|6;+4MckQFx&|O-~jQhuZQdS;Km~(GwS-MK283|~EoRhXWdN_z0$DrVl7qDCZ zMoA!pq|`WqFcENiP0IRY*bF^1{G&@Jo^30Pzy0-@_4jXFI`MV;Pfj%_ z`akR3RhxKj>ZJ1XuO40F`Vmx(;Sl_Rw=m;;NuGJInEIL3!LS^rrQ~Gf^*VCD`JWB_ zbo*OCnP)Cu1>*+8kwAC-zgU9R>?lt4(83l|Qgnb+HNu3R`53SUBO7IXa~C<(h=BX# z_B8(OqlYDdx1=AYQNI`Hf=9EN`w?GLNRpa$W{KlCb$H9@@FeEp$tuRq4uBvKb(Atb zZh&?9;$qDVsOmW$^cr;@gH*Qu#5FjvlvfZt=@WqRQ%r2;Z2g&Z}Im>zNUj4ykA?>t2~#P;G|47S@Fq_`RIJr$-KKe=&B z_}-9c8M* z_m~9GP*cd$F+t(%UJTCm+Of4~8 zRD7Y!AEX^WoEM`1Ql&Xk_$n5T@EgFe^p>gYMO{C5`sPzCR@q0sFErKIcVm_^10lm{ zs^6Fy1O16`DziPsc#Kl!O2^K03QPngM;xiJVf;WAJob2;wzs7!+oc_7QMJBieN{-; zVUNliq+dBhqb6Dm8U1VSxeB+~oPf?@%pgvYR&%|MBe2?oq~v;V)kAZY%Aw z?z|M=9^AM!p}tqs`ejSKIv1AEoq>>1ep~(~IN3{ZGPcqwX@n0Kca*^N)@L1an;&z& zyoF&v2%rt&r@Ucb9zl|<3SvF`I4+3`os`hzpTQ)kNAN_LEpI6w*N|X+{I(Vr_o>Naf%|!P>mv@(j8rmIf>G3_toDa z6y2o$QGz%8*1!Y8G16t+vd!~8YAH4cu4jx~Ir=g&?)C+xMf zwgNkKciFy{E!M+rF6?gfz7st!Zan*|otMc12v0gzmVQRqbXslstZ`U>Q_f{BhkY-x zb1>EnUus`pmppUo^xhSRs6z-QBWwHz*}B#>;6F>)(DckkCq$bUG5V^Z?KO4QaxtM@ z7DH`nk^zI5n}b$c@)CS8Nh$fFEsQXlmVqIY;5>Kg%INF3u#u>op@n$FW&qZRq2MDXc zezUG3y~=z>;WYEXuGwcRzV5oB9`Qw4I*8lh#s|J@_uL<6mT|11>{Mv+#KH>~4r{%l z@^`R&*kW^q4tdf%!!$Y1O9CBhyJa!_p|Qa~iT{vLjtmE#2UjL~8;-SoJGAXUzsdz7 zZxTR1_7f8@**=>96Dq!My-K(B3>a#PQu&+=QxFXY0*LDw@5XmIdttHBuSAUB??OUp z->wYfui=Jz{&lRr^L}ZC!?#(X8Lwot_t7{$JpX)qT-SLtFSVY=^_@42FG{avna1^v zZX|vA1x{>APh5!mMp7Dv=5|>Uy-2{hZCAZ$>0rZ%4%;5h7tzF5YA=+@s|;iPRceD3 z>G6Z1qt9s``c{k->Tm5fhGu+Xl~uF2>o5WwCs1-lu}z0zdO3%TkW8t!a}EaZ3Ax|R zuWXpjO;OBaCBKW1_6F7pK^}!3Gb+;OFy10M&?_(@_gs6rIb&>}I0luw7?ve@xc6{W zbrpl2RXv4cK1}5l1uuwka3$d%0n%!nOskz}fBls;%+gx5WCZLb@(LeHoc5Gs9{rtUX?SPc=@V_>2lfA0{*Aav6xlE_89XSjf zkJ)rrBO=dVzVf;T-;PSW+X{0`PhL`z zO*8bgGYF1M(FOJ?I9udQNml%U)B80~hkl3gsg@@4%T}>*}Q3-28xdKha<3 zK?ytlWWxRCP&e8pO9GB%6U^RiA{>Ypk}n&SEj5$nBiN^A54JYt7%-}9GT#_6CyuH1 z(uiorv#}%_3l}8fKsL~9RwjB+wdCBcv=EgHr@hbyl%=JMMZ6$VUH}$F60K0)1>zKd zMPi-A4`>whHqYmV9;OLpm$AF=vLnay5|RT$-F|F7+Hnd3ETTz9rx*3nZOU@KoaSSi zdBb)@&|pW+fR+<;3IcjCKOvk`qMyv&B@$@GO`~3R;#zj%y0`6Z;i*H) zKo?eg-cWF5P^?M!8?E8Sy!eb#!}HSg`2WjlxcY3xj%>)bfq|o1$26YrN_IfzQdZjW zIN8|d*>$^fec$f>4^5gj@;Q<;q{8YT&`@EuAc8CXv`2-A-4Erv+&xYAL;&2zJjLZi zY4hDCJjD$m$yrFyddH*YygFb6cXMw?{^q^*C=wc+=aytKAY+tY!cLD$|KYS27)34A z6lrU6By1DAGhwJ2Uaw(evlze1-O1n^#p=Te%v-vowOeP9zg3$e1Ujv&i0G%uM)?MV z;w*XNvdW2mv26FU=B3GD`Wgx-2m!P5mts93gH#1!ll#s^aljA;kS+7iV2yNHSn$!% z<0T5S^U5oqnn1c!(5$G_u^~IfdP$@Y13)kkvsIsUtZUDe^;mb6@>y}`4i-$q0HO${Z*5P#y zSO`W##!JK2EZbeE^fsj9!!E&^!K>E+^x2V|mMq^Tsi^ zvz{-w_w3DktEwv-DiW>F1y#3PbA4ib?%Fw^^o7w7YpWhk;JsF2WnwUayPw$IJBLlDv45xT&VP&7O!E z;B&-Mr#7ER?(+r*?@5!UeiLnC`b`W7NY&Y-oLor>7~_A+gfflJ0R9JkRBzzP3SozJ zcr8GT8pmhWxIU6U4eSUXj-st+@Go`Z?z9|&8jKGG23 z!%khwm_#@Aj|~q@n_SQkQ1bHFnhlYYJuH7#0)0<>y7UV?TC*h-zu zY$O;HVj*NHwFMIYNQUrSHXB1r)K_HpvTDBOpSX7olv7NU6|m1waEWF$+;T?#5DK9x z7l^9Q@IWkH|IUEffy9@?m#_5e(~sH7m6YPdQlXW%JrDwUOTKh8L^&@$oOS+F2D&#&f{t~LG=bO!f;UocU~-}i zragw?29qhtrzmr@+TnLsE(sKI3;#)K^fKs3ZgA{CV~K)NkfR??xer&9sH08pYfV_b z6rhu!lMjkwrb-QSrRMY!6B1c|r05D8L=YA!4hA=Rof_SM)8iKF=DenjtPdI~O@Ea- zPI3F=6ekR{tC7G$G7{CI?cnsr#ke8+CJmNELT)3;wvc)gIo|xnYz84ATWFWYD0YKq z6!$Vb%oq}<#?D})?q-8B<5Yr=Y_;Y|gBiPf^vDhL8%buWm!#mCi(ZpVOwrsRCI7t?!mhAY%byJZsyCv1q|r?4l|7NuDXZ0p|L#gz(|nZSO-e*Owy2J z(qIL0}s|WBvjuj9$#;X_jye_n=qZt`nyPA zR+Mb+$T1Q7wReWW3jYRt%n9|&d@40&b8Uav;@Gv`c;8rI{PT9Vc`>mck#hpPO z;iR~2x%I}+!A+XsvbvY0(w_)~WfK0ao zhF5lhVHvZWrah^$;i)J+I*B;K&7!j4tieR6?&-AN{qJ8+t<76$=DZq_HGn}59}G99 z^Pd+J%FHsNe-gLdZ{$W!6yklPoD9}6TBpymLtU><(;zFNmsg;>$;iD$Q7tBIRw?rY z_m@nAV65yT(khCTPugB1<=iTR7wD%bnTl#$iWwUY!$mrSBW0^z5gcqjPWTnDiz$7% z!0D$0437ky+=RAWXdK+TXD<<^-L+3Ah+Y;Esc<&TQW2EF|L!l5fXmyY^VOI!9!8x`_8Fiz`wRHB+|68>YTZT`r zh$(AKk(4T!?LGQ6Hxz@1RVAH|?Baeq>3|hZ&|nL|!(5#4A_84k@g8-IpK7~{zo2N^ z$c(7ZluDjxrBbKU{8^M^ZJsrAd%39T(cbVA=BknEjT)36*%TxEzcQptQOGDkX7{|o z87b*9Gg$#(IEqDv3Mmr)6hJX1O;T$)SGy&L?1m(%q5gpL0*2CgD~MgIj6ei_JRMmW z;qHtq7!SbBx>?0NZD*J1V(SQl`iH1$|A|EluzZaD;7g1enS+~ijw+MLDQ*(4*@+v* zHkd057~HtCw$6N*MdB11mQHGi;kqdXVk$AhhLJQ~Br!7=-MtieH~pCFYS3rSGdl_QMHuZ+$sGc z34f^Gpu~rSpGXE=lBxonLn{?7MGe>oIo&Z#`JipS>(#k??otUHf!PAZ&9}^no`-bS zdl&tbrb$?+qc}C}`|@QaQI4$CbGE2N|hwvZno7Q~IY<*QD+lOpB;IOWwndp3xPEYIZ_*U}}~E zu*4H4xSJRQaqt7XbO+KNxxPYg8RHbXKMV&o^TYiPr26b)D@V^e@u%@_;?T{P2sm(30tdcC50*7%#%YeK`u1bQv}pyYCD zZ*9M6>0@U6_S*;VeE$3|_e&q&z44Rr>pzx1KlRy`t#3C(Rws@cis{&X`?ER*35?xv z*!~U1T~mkze-j(lakzE?B3c6`{0lC(9Sn$KUa4}x%jurUv9TLR?z6Kio8R2K!@TpK zG*eN;K5=Zbst?Ga!+1(RZnNe{!{`0g5$;u6rCa*^)l1Rw^+#E1YX6)?fVHAr^1r@% z_sIjh_bI)~*a8DZyt6p;i%zi3Gn%GFWj1UQSY;P-8YX8S@$!( zv!qD_k1X{9q&ScAJbAZ;(m@gzdT9*evFE(H$$74BDFe?)t&vQ+a{reuV+xPAX>$3I zUCV7Fy=Xy3*9+rgMbQF=*Syr6OkYSHHWuw=gfxH&(D$aO4|xRn;4>=128Dc@t*>I3 z6^X{t;X#23az4hD5e1W&K58h)Zc7i@4J=~QCv3oL4@%>26m1N+JBz&9W=rNSL?oJf z91~Ixh*OL%AcPi^Vjcu%s&kb{g-^(Oo7TUjOh&iqVDbNe4 zGyXgeE1uXj=Lz60hB8UVxZ07!Rpt8uPBhMF_q>_;V1R2T&2BHkSON9YP4QezsWn%5 zia|%9bcE-qAGi~%{Kc-`%XD_-#9lHD@#j|ejpR_pn0%9q%wft@=O}U(5x$d`$bd-P z+ZD6vCDD)3)NbMvr6eSL6w`2(luoSZLNLdWVQ_>@&sA3SEDrRD-vDHizy+0$lgz6n_k*rnM|ue(UNyb#sqMcmpVISmTmKxcf-VRm{f|KB zsUno@E8ejF=wq%vZTs?q&hk#^x@gaKPDcHJ6^F|+(wE_T8^9GT zcgy!-m@;$}af48JqKe0ZjMF4-K0F^@G9yg=cFuRb)~{m7xhs~cY4$^dbB9{GFo4Io z`s}^b{TjFOQF!}%RJR&QWa?k-)%Nu(nRyL2MxSWPBeTOVc3XBh z7|&-tb2WZx)YfyXNjP>>ueJ zIktZEcWg;gcKiM+Y+RjG4l^dM7FXCY_w3X}0osJ33jH3`;X~$9Nht7;P5fB%gTQ2? zw;DDRG{w#JC14!;?MU_30e0h3%*`v$CNUjMT{8QG9&Uo)J>8UYO8ft88?3U$iFilD zi|t{IE#WTI`*Dcy*J2Sf5L|>uECf>QFPLS8E<`APRp-++FmJh>E4Af)P@cjTpAq0v zqY%6HdkoaiNz#@L6$xfNtGr@;zG#VjK7UvhvOoLE9A1MR3(-ZEe&i@8)oJHkLrL?; z<=?YTeGsSKn_|tJ6G?)UIdlHWA z<=djZs;{9u8FquQLHJ*%?)JKGFcf{GTEZVUIh4JL_Sclypepi<0EEx=%3NY<@ffn z4NoZydb@XoupA*_hZT zBg29@@gMQ#s0lnadFK=z)b}~ zwPm3#*sYzSLa(UnbDF4y#lz(AnzM(m4K%1S%~j#^ZqCKPrJ<~OF@>iprRr&}wIr-W z5_{VeR-uq_`JdSNWb8e#3FJenbo~O&mim)dg6zke_A|Xb%aGxAaGy=R5DG7o?NLCg zofZ_YjZLc!{}hz)3&~bl%|d)&%Ljo5EQwth_aU86$P!`FCuGBiuTZZ>Ex6_3BfUeP z_~)fBJUg6>zZg%{zgXYx9_Lc(H+Y7XZesEA=B*#zaClK~oNWBD^beu4z#(8O?pK(k0eMX&U8se0h%SylSg`}&653&7Auu0wMJU)Tg4a*%1|l! zysV!ffMee4wuzCi9AKxsy^}uKd0^kBvDfBSUjLpez6LA6HPgqmx5!hG!$;J+lye}R zEy5~WEAu`H%h_c4a+V&@o;9;hOyzF zdjwSn8m#;m^^zMb2R#mttv?DVB@^phBS#Sk=&I#`cAmf|!^Yh<-)(%HmBRRky6-Mt zt%dY!m6itZYqZv!DH+@)vJpeN&IZEBJ-ZAGnTzx^^wDcrdzCii98UpwvBDsK)+rNf z+rh8Bms7aQes6SC?v-To@iV{6K6lBFjlEc{vQ>}cNs%*rSJ0qfb?-|S-vbyozmsEf znGU16QsZJsVYh0F>H0b4LuFyVu0D^PdsJUTrLxD*mw;_OqT~yv<2krHQ52 zLA(dN%4{m*+nw?r7ZWCQk~332#ASpK_yTnLw6-DFBqimD|J$+Z?429k#?Rz&jB|CF zUdWu-0|Taf7&r=&!P&M95`&ZFfoa;oDre1QtoLzDV!?68#iZE0aSTJ_$;RD9IRue5 z`$~0)#~Nxd1}t5@w&ScJ+qytwpT4lQ1Xf)-97OF6VFUU2N*X6{x(sx^w4>RsoTNq< zTO&b9o#O3FrZ4q*`u{9FNf#tvpwO3NNRWh<2baRO=2MP-kwue&^(a~9n8@mgd$7F~ ziq)0N*IK(@FeOP;abmo2JZ5VkOVwri4tc9LS4&gW{f`&di;GD2A6#rXI(!CeXLGKQ zEg(m`EgA7)Jcgowfq~Rp(lT;jD~7_=o^5HoUzE1|2(x9oE4O{|3r#^3Dl%pUd9$z~ z1UV4_8z$QH90W2EcjFy7bRB?7+^qOxVLS}UxDOyVME$pWEndF*{W+t(PU%}oDz3ic zz4y58X!M3PI~mToPb&S`z4Mt5j;j%FF{1e#sbZ+hFdl@og@#$k77w3P?4)_`g5{Bv zU31hL#Pw2EtrKVsrnZD1ra-xtu>G9xNG0HkTLw9+!W$d|Y zLYTZJx3`2B&k|66>1ri7qjn<%3EDsnlVjqOq^)**cra?IKtn=ZS2J|I>r)n@wd$f* z0$stov%I{UU%WPbr{TzMZ__F6sk7~?ZXX${vg}7bv2^q%QpefZxtle=>7CdaZ1Ont zXIS^pCLp;0X(YdJq7gAO&$~GjzI6THvA}@>x_Cj-DzHTV1*z2*m}4+wR(clF%8_4E zcA2Y|sv~0VI>vq5+Sj$~x=|nhF#gXXqXko2x_;^UXzRlW&7QiJ==Y5c#!64)JMm@l z-44e8bbT2=yj$Bkebz&h(E~M1MZim^;|^fQIjV0`kADlUH8`VwNl%l8;pKScHRmmn z!>a2m1qltFJXmH)$;<*7Zk|bl_k2^n_qc}-Fmallt)Dxyz!!HgZQqneGsjsa<7azJ zbxxgKtg#7}$O+LGe&uSZA*H1ulVj(0rL9 z#SDQ?OQ6L)NR~8t?2I)dh4WDv_eY3DG! z@<8SQVi|q*ku(G$;gC4;A!3ihfg#6NJzMP_!-GhilIFK49#+)3%yoX#k-oaxHebB6 z%o5En6|Pv_V0%x{uduD}&Z;zJS(v9XSBbiMOJ>T(2xbfHFFG|ug`5l{iWAAEPu4Le zuW*I%4D^LD7Yp4sZ`K3_=5t)_J$^jQR})jOv^Tve zo_hf?lk$7Q&l_+>?l*tzBV%W5#ya3~49*d}2xb$Tl|rs;&Q7Q<7WiD$z6AtfuPzxf zy?l`F2Yr>ZX6%ey9-N54&cb_nAK13KC#!P5*FICDPUcZF z+6Cz@>03grq5H))+Y9?s2Az>k1I*hFd#2Edr2J?!oq8%^@c|dhEU_M;Y&gFuc1_b_ zNs70#w;_Y12>F-sW0*UwVzAe`2P-)^DAIsnIKc4spS)11oH-6Sy(TFJ!N3Y^jyN5- zcKoo8~DX9S1tv{?6%7|sZ!ajaerf3!+U|!YS@Q^=6`6hiC86O zRlq1~RpDh5#3dBmu%;ER7yZHJ4b2<$1#VR#EA9jYF3a^!8kFHl4I8#8a;0Zu$e2-x z0K7-w)>__2|87l#eJC};3HBoWg(>BN4(mu1U7%z zqyOsZv@{dCe~{3HYb5t7>qkP)H2p?W196v@n+`Z>ubLR{D@B9p{ECp+{Ue7)-pM5f zd$poz62yn0!yzZV$C)Ml`Y4b7!N5h3cMSzK zIX(&WViXV%XJlnwsRCD!(;L1cmlcyX8E+Id?88W!C_HHLB8kvS%a*BRdn^t*kV-C4 z2sZZ-5B*>Akmkwwe0njXsLH&5c?41q0?ui}*kPw57xG3|lc8!9S7{w%8`O}2TXFQUMu#TXk$mbL2Rs9n=}9mjH9#GriUG53Jg9I zJw`P8_tj=0P2=}s_(@X_qR3L#pE&C}o>-E9)GXs41gn!r%r6PihraY;^?1_@_A;Mk zSa4bjH|?L&*Bz&}e zao!oo*>65ZRUaO`eB?qk1Lx_pJl(9Bg=BFK)+&fgECj~F4ip9Z%vV!t%Fz)a3}01F z5xasy>+)RTsgYcWftKJPRAJ?q@%m}hw2LWHjtHXLIXXiuWn=Tmk9Nz64b&?GB$9oa z=V{MO@t2|HIc@0;Fs#mN-piLdbD87CJmNPTJ5DY zbL5jUJ-M}v@p|`SvFcNd35q0R#)o>3GFi@Ejp0VIGI%Vd_A$zreWc#`<|>s{f_A?u z8SBlIrv2yj?tkfB)sf`1mhF zPA)qcImAly)q+g#0?Q|%r#|lY(|{qS8^^r6NIPZe(tdwv`~5MrkJo?!ftCXnFP*z{ z!Hn*jFV;QwsBdrXyw`s3ao36UC!Sq%pMEHE-S59MJi&o&XDw{YQu?$-Qy4B(YjIZQ zW8&UTs>51GlR++jtbv+~G$+%XjhmXrd zJ$!pd@0nfc#)ML|vA*5M;`LiQUu!tO({*I$Pi@IRq_0XXuFhlQ3(4zajv68jh70jQ z6<3>v8OB-|#%9sQMJ4;Cl(|lydN*@pyNu{s;C_*1!!@-$kk_%K4*;jSKv!WI;=zh? zIMi{}dv?-5i{!Z#ApzWI;!`+b6UX82+s4tdm1sG9>FlI6MebtM_)f_F_9J#SOUXti zKKN`FHk}NR(%1D+EI1_Le2Wurp?jOYVbzkGY1^##qXkrQKEep$S~v*wXUKWnmXK*M z30@Ln0uNc0oG?%mzBzsjM`uSC@%s<~G>&V?l^KA=XPm;1z4!nNv&#}Gl|_{+xyX?Y zp@Buh;OnpYFmeNqqM)Ia^^@u%nk0Z$NsranSAhg_7BT7#SmD+sd(Ldyh$IPOkR*^4 z+*h(|uxRBsr2v;xWZ;o#3WC|xD9o7lW~niK;K$^0Fd{$~`okIzUmy%tu#zAP%Z;0$ zg>+{6i3xiKTZ>*7_M4|33vrbkiS|Qf_7%@A!)w8lDTSaX6t*-kHUqRN5FV}KB?xQG zV^1+bLBYCv<{T=ejHvIaXGKB^`$G_p9Fsuj>ig%e{9{l%U~wnUV-ihu}Bo`*e|K@Xi7N0c9L21G!1e4#x7J;Ykxo8=EZZd<%&dF6C0zih%x2fUD_ zu#_ilIa}AKdT~j;aC3MrU81GXy5TDK*KVnLgDyh9UY;9AsKb?xADBH)%uAS97W5u zCG(_=NFk`3r=DEBZfOD*9T%-L!gdRrN)dA?(77VUgA_$gAz~P14aj-G&!B|j)Otyb za_pP2OZ#-~1Lzhq19s*;;*-!h7Vy0iE82#n0E+1X;=C2>92qi>B3}kMH3!7Vfy`$e zV4<0)@Wq~^4&uTwU5-A(HDQhG)>ZCMZy2fCh+!e)F=UW98#|V>f$aAOxq<8V7r?`y z&Y*$KsL7I*g$8$WH@0za^^_@Rce1xpCC?GVK8cOy(|faHLJRurGEeoQK`Z`zk?yf~ zj)z$?%J1EZL8`=EFra+Wv~~)NjoepZlKjQ$-aTQxF{DoY>eienk;5VYu1DJ6tCRRm zDWH~AW^e}fmnkfx5~rR7WUoPx;XU$<=T~mW736Z;A{Zf&Sm&!3=!)~$1JWb5uW^M~ zN&r-_`Fd>eFdi;`$FM!0c8pX$XT5Tc+{ka1L}k3rZ3ffz?3mCCCbGHdDB})Oyw?gP z(Pq`UHSLdVn)|`zh`4*D{}RndIo>Ct0MbT`S1(d0i@=i=o`;%B;eeBVt=Mb-H1w5> zC03z<3?vkZmHY&P6yP4UW_-ZK+5h7LD0CpLx#|+0#|!uFDUS}w@8@oA)ih3~TZ3wh zurgPfFj0KY-dC34$Ll>iPC3aH?L9kPY48Dw(i{l?7jszRj=}Xj&69-n@R$KmRo@RC zWxb$lNV)N1Tez{W@pWTE{2%pg6L1f`vTu80vcvCwvA@T6zux`Cv*SNqZyKvSZ!p_- z+rx{Q0|F!Uc6Mt2(AbR~?wtLZR zbe>jlIw|%)7AuHVg};?W?WlkQ(zOK>q7y1s?FD7k2V&Rk*Y+9OD`}hv)W(fnJ_2`m z5Rtf_C=WjrI>r;nJ*i*SZR0troXAUYS;~nzFM~cRw}H*BRjW!1R2gr{gHt~k)=wyV z7FZ~$_3tVS#=e>2WTiQRAO2`zEy7Z!88}oDFyW5l^+Un1E*TCEi7wF*omWheo2^hD zMN@+G11oQk!B;bAS0I)8kHWOt&5TC4`p&lZN10)kMGJS4tMq$qG*fydns1vvy_oc6P$3H$E3nAI z>?oqqhGkfC^wwRL4q3VaPK*k4I2{!Z3KY}{>@*cJq7b|9fwoP?mof~rI_^+1r=UaTM; zv*QBcmjOJRtXU^)PLRrlGFu$fcHRClIg+y6zx_(!yV?3sh%5O2j*kOrZKo@;D1?f_ z+`8>V*-$C^@JuByiHiR{;TON~Cl3bp9y1xLS=5YkMaAwob_P|GUri2zOwVvOXOqAX z#Q8k+(+{g$`i*Jd9tJ7!tzzgLX8&^lQ2c`J0W>gLY>(8Kc>2f=%Df>u<|`l)E53fY|paS>+Tg6;>xzL6)Cs?WlT59vB8d zF~ixqLEPcoyKFk^t-DVe+s+umUpzPVFa5pU7#3R?XO~EG=a6ToA7qYpC*x;bck7cp zeT%0q%#LycbufgsExNp`)&eM3(Vpm(!b7^uBDqp(CRg9sg)>P}(m0PPqvXa)CL+J& zCGzjmzp&GPp)??KaRRdGHH4EwGZ1Ry+=?_q`Yx{#SZmIm85--oci_@ZZc*;ZY1%(} zt6j+b9xJmIPRz$~*X$)!E>hh+sUBAC+Z)khVZbPukRor5+dMgCV9jkbPXYOs{Q_{i zfg;_m*eV3%Lt-Zh|DUsvySwJl(fo>&;@ZaE`s5-2e>qAAuwNb zyu%d1wsdo+&YS64J3scc^P)vAq~WxG7?EJ3(W`HcII0mnY!;+G{H_z{LV z^Jdw=rozk2R5S)P+tO(#gtdkJ>A)-A`kay&i_CmIBL!j)qY9IO!cVO>bghrxXRSJb zZ-_sOrszbp--BB=P^Tr`x=ACM;c+{0=7^8if^9?~ml>Wow;3le_^LtxW~3da#abu5 zrif?zKsC`rzX$*UJd~f;k zAZX9E|C(L)9oZF1Dyg4pm#(I3s#Q->zthjrhjp;Dj&1C$lYFEnp~bC6lEts1Qr|-S z(Hngl8Hh}*IMI0)ZbpreJc{6RiU+fFLXj#vWXA4*D(>bZL=2`9v;_+EJZje3e5+ayqVqok-!G zT0lYf?v~Y%LMHhvvaxH*8KeljDoVMoO@hhoF)b)wphakb?jmvNPI3Z@U2~yj2ynV2@A;Gu#SJx$+z0^& zZ^4@=9S>Oi*S8(CoI0@SM*7oVpV$rF?&u!;bNaCf-*jX-ra$==;oARr483jsgvpS% z7_DTuy(w|Ez7uy&s)kVRXQ@E#niMe{R*o^b6gi(2k%)p3NLc6?W%L?I6E3=qd{y36 zyj*{u!p*Z}2X>AP?LU|3~oWBr*lPF&>H*ye>-zVkkv{*SZCf%MEYPH1T*y} z<{cn=1^epqKUb#l7nPF}thlYm9!?Ny;%53WY_y}8e({dU1XfNFJD?Uqm_#3k4o%9n zP3}3R*1`EXZmgDvj;fvlq&`vt0 zsTX14p(E)ocB3MQ>Umw4q2TjEsS?A}i(|9gqNLvkXp(Eacs!mN+-3n?K<@8vxhlDl zgW7$COcs&N!gThkXmQ*ZP(m^3r1TbUa;fl@oe5UXa%!Ht7Hs&8k<}VO8ujKe%Vy!IP9Af9aEmM@a zh+4Hd)9>FCBfnPGhoHthcZCT-t)>7pj2%@EzK2t0#}Hd zPwleo0Yi##Q2s_te*U-7*r|WEy}ezbO7%wj&Hv>+aaU%_EaXd3Chk$hG(to|5~i@q z)9}%fd9k^w2T`~?@iEz+)%=dgL~%2<^r5=aF8k^Bt&1}GaUCr$3RlP|M8ecarLkTBV9cqW)a zjs%rr%PZ`gCluw;@iZWXeabIoo0)A-^B_-H&z&TfTpJcsV?$oN!6umXDK}$XR`?go`0|qLw zdLc0=3|YBpWrq`N67j`ZQFGi^ViYqEjTf2kaH(O*r!JbgDfW{NPCPjAen|qLVHuJCiqs7c!JwxLMAJs?x zyLRaKkhyN?{lUi_zvc9IqzzU5vS#R7`hV7$tA0xvjObi5+HdQ*t4_1A`x^CIZSWXRAJHsu+jN@t&mV?6;sO(!hKO9)oJp|-eU`P(bRe+*Tslx%` zi2BcjMKAOwoi@ThQ+xXUbjaFOgl??rRGFm?=klvs;a9N;RASsOX=TkZnD=gKZ?ck1 zrxyKhe|z@hANMi1(F3$fF}x7rn3tGbV6RC@EbJs_d{Aj0Qe6GETdX&1sq+{#(%BSg z{MWyN1K_E7<30h*rj!W7q!y}yeBFf`P_~9)PvhU#$#+{dlar$FUTLx=zTFOX97d`T#>R6P`db#C5h~=d24TWAIL( z&5Y;8MWg-F|4tTjf|??05#5|{Sk5xx!gMr+!>(;We=r~;alsnYbUZGQjeXf#Y32v*LK--l-+(BE>epaE%9Up_P;Zs&>sX<%uaqH087xqLm zWWkq@83LCz~NJad(U*; z5p^pyozbB??B)UEbBe33N0F}$o1pZF15%*9y}PeZoRK(MJ1gFHDOVEGzEdICXyIBf zP&d*;g~Ty4#m0o%b)ZrL(fDFN;IgNpf`Vzm`lLMcqi>6-O^_L3hO83QLkR}vFv=IA z8UL$Ic8%}aE-YO-#P4KYzUk*>uDdbxuXMBHU^UQ8mxM4ECfNRuUuU|xZ)nrtCqwpw z|9fLpsqd(s+Y@t)*lcX){pF;mxLu}-?*XO`t10p!c~kw@lb1(qJuDPsEE};TGUr^n z@#LulB1)|S0U3EVkZt?~R4q4Mp_=Nr!dmFx!56rwqLnv8f&vUnRxl*On0Fv>MH*w* zj;zT_jmsL-bNk`#Tc~LE$QhF+tq;(Y6#L=iQ#Iz+lY2qE?gb-Q7XAfp?VH+d>WEBJ zHJ6r@_>>Bsq5E{9YjxOO>fI)a-kO7va0S`%#Po=s+f%&*TTY(Y>MoXIKr>iJOq+Xu zOMs+!QcG2Kp>gW*R${L79}cbdl~0l1WGirC{9>)`Yr840UUb%XKRV=ySxt;T0aHfY ziw~Pxhz~{war-LHam<`mh_c-I=&+ZSXezR_2*WTJe7accSy0ksduVl;DR0TH<*0D1 z0WKxR?(OwTe1N@b+sUa8>ZoQJR4c0|UnS}tT2>51!a3)+KVfC@&5c?-pEG`PAE&#D zjmqQ80+tT9)0-NAQXqEP6(4L`i0i@X%vO&Ql4wxbh$FZ{I;zJAw6hsHpjvCIo|Zt4 z@l?Tfog2G%k(zNxl2Boxal&EBdv+<4J%=iV`0(B{w}y}M(Q%9J~T_yz?#N$a+sIq zB`h{tPC_x9d6QtrqSMvbXo`dgC*+h+K730Re@s6nmsa8Y&$s#^Q9a3Wj}N`t9^t=6O*T0|%$a&%S|v0sHa_Q(o_!rP{&y#$aby z`U_^vJe3zYdW!uvp%|!L{&r|M5Qv3DdKGotX8Oa_p><>VFUS=sU7dsRcCF9bTULO} zGT3QV4aTiPfG13gJ}WF?XN4K|QvANnjpZWpSF$BG0NJ5(wz3)RIXMAd(Ij3clZt>p z(S19_5LT3E)A8!k$6fZzWB2BEPDZ8Rkx;o+|9D?TK*A^C7Q5%wO(lpYc^009FzniBYD1VK2Qz_-=B;4 zhh#737JafeI5n_A$4)0$&U>U=E%~wegJLFbk`S_Do?h^s&8?r#aPF?gnC@Cq`4DF- z>A7=qR+uhBatp@!hyDK4y?1>X7hoMs6bxadL7gD^VcUaHz$vC%SHmAACl!TnjSm*t z7t3XS5?@OFO9gP3)lz^WSdOrQKladn+I;ev=dV9boU8KqNJ_*x+ySmqqKF~sSYZ1o z{sb7L+gzIZ+ZV8H9_T(z)cJ0X5C^jUB5Jmj`SDg#im0#OM=aPVr!E0VAXsHU?r`$L zztw$yL&HeGJY$IS?D(!jz_P|qdgmy_L|WOhZCJ;voHJ9^?aim?w~9T>a1lfzDr5+8 z;^1wD=Vt@SsFJV$=+BDGC?|EAXz5Rb31Mx+iWo>4!nl+>FjPX0ksq@Z95CBftY z|4uwQgxw~uq%?2xS{WcUYr-UMh>}hSRhCfnC7Ofn6a-m1&+GlVsfKJxmw7Q zv+v+N&ngEMNl(iJsrd}oJOcE2(xqe0ZAf%wRpz%#VCYCr9E%e>d3rMR)}(AK9M8e(#x8*{z;V zZKkm)-Zvz2vEN)?ph)}OD3g74fvxoy@&7fDUagnwl0U*T5YP|-1v_O)e!SZL+}*sU z_8L4QYQCvu?yb!=oP(ae|BFFEiKQO}w3v0MXOE+Yx@Aq*A?=((x=(1W0cR;FdGH`u ztv;@RM}_PUZ3K^<`mgqQQEZAJiohH<&3-+W0lepNN7&vJ7R__T@1wyxk_y za9Q?3-guVK%TALE{S|1{+*Exk!*Qj;klC)Fm}xr#4NR13Kj|P&hr0e-Vonbq4UVgX zt`H?E1s7B;@XoY&y6|oE2I@lbWu<^pN)Yo#rE+@)H|8K_<_eYMPaO3Rp87G~^5O`3 z(2?#1zy13TFFLajsZEJuXp})V(^*?hhnBrhXT>D2?SX1W)7QlrJ66*H|UeKsk8mh>=C?V*@saK3?ESvdCMlLEk-O+ ztTfm16weDDk>~mVK@Ynj-aZlI7FmUGTYz~*S>=uCKkOWUC?*)UUBaeaC&>-_Gx)(0 z9>{a?Rum%P2G&0?ekF0zx&pGuXZGnYKGH@Pw(p~10u*yvCmdv57fI!Cpz z2Jjw#R44*Onm{*`sYE2nW*wmefd<>dh!?<58N}f?EK)XZB0*da>=xBiOPIW!YdQ)g zvKfznPih=cW!ZzWh^qi=e8n7Xnp=BwJX9HKb5KHY(n*F6^GA~HDyd*(6I0NLxq^&+ zsbn=Ou_k$q1S@>cQtUebx6bm7badGu87xpri9f35#Fw1Rm@$5-m8U%c)4onRm+ak( zsoQ(KOq*b>q$tfgg21c}`?^&Cp=~ESpX#QNmn$M%62m_h`?OV!OK+1b|M#%yGEAot zAX4nquKbQpgMuqys0Y3bG7pzJQUW;XCV6D1&C2~m;6_3kNpnK>=uA2}X_sysUS2WL z-xOX}geRQn;wO;zXWsUclh(guI;0> zx`rwNdpO{5`r9rdmg1%cN5)LW?ci=HplUAD9-y57ZhPrMG@>K9WLzmG=c&h#^;){> z{`vO*aRG2J*7YR5d3k@cC+x_ZZ{JoBCn^G7ojBndb9SO zUx0)%$R$v_@v%;LNK*n$Aur5AQ`EI;%l zzOVn__?!UBsc&!Vkq5ns)k~i!ukNJ2bpp`>X~eEBiVdnPSUs3o2cB7BS)xM!Q`$D8 zoDKgbJQXz)?sj1f=e^s50)Iq8>H_!u9J1^x^b8&xdXStTX1)4ali z9O8|xIo6xh_F>W8UdmMDEaS^rAjFNxpqt~p;OLV!qU_ft_sw?iQ5xL5lmd>jGJpG% zj0)D_l<$wcVhg1~QZ?!TGl*0|7 zC##!6a;ByAB#!HuQ%-FvIMUP{tszM6A5E@YoTS6~l2jSbO(CG1%jorYMqnE>$azKu})S;tI5~A+Z^UH$iZ3kWsuzR`jbd zL1l+CQC^NoVMr@Bfl7>2s+U6fGT+0|s-$Ni$ajYSg)cZUgQU9c1v}I1v`Gx#WFR+# z?Cwg6>@jBMl$GFX1w49qtGbJ1?cZ=rYX`wileJ7_BECwd#7;lgUpe)n_{co6culQQ zM|mD#iZauW6?SS(0=dGOt(L{t+w=E@dj)6xlJ!uyNU(c*PW3qkw|hHdRYIQ7b30p_ z3fv2tS!#+qEHxy?Xl?A`OI*vl;G2k_dGGoac>hap-deFb9!sS~r|t9AzV10a6e?P^ zvm_<)|Nfp++P%jcXO9u$RaPXl3+@LH?l4jiXO^8}f_kwL-+P1Bel9lDNc}lx6?> znE<=si^6|`mIg%V8pE*ixhM958Q6mzSZypIieR8T5O-Q8NEXL0F6enatZb_o2kmcN zX{Ayq{~iy?;P~J*b7{J{Ma3bW!;Y1)xp?ltnm|$W(2(ALCCSg9X>&BF54w%#Vd%CV zwhm^J4+oLl_k)xGtv=9rph-mNt<{XrWW>yTHB&BbWPhV6uSc|#Lr7V96E}5i7jbWx zs6K!7%UT^k2~)H>n0pho!b6&N48(&h{jhh<+kBO5p{1K$4vKZXlE}eHeJLzqOXR(A zvxPH=wGyd;gm_6Z&vd=$xUwF61*2HCM@wL@r^N2GHd;x7H`>QPs;HkT*)4`22CSh{ zPvku<0YHd&Tymn*TUCnV6^Z$L{1}eJBk1fxeJqylqE1w{r`${)3-hvQ#SMUubJ8VI zfXm2uI;zRuPSctudS}j8FZ!;2g{Am0W$tbLh842&Uj4xn`IwROq-HfQ!meO?k;$Zhv*)k2o%-3tFm73o~J4~H+@H|ho^e7?!$ zHEdrLg6b6$AD8H@dVP#*VIfE;$x%kZ%QSmbFG`-0IlnyN7*}EPOgrM6e~NV*NwkRn z9g7oE5*jgzA+>6G;@GWQ(p81dV*%no#xsu@ z^`GSdC9d?P?9( zx#71m&ZWHTa12sD}N9r`IGy2rd+*5GbM2fRo3(0ygNb}gu^kIN&h5uvy&U*cN74O zj@Oi9uXHO_Gor2hGM?Wirfy`luCsdjK4uu4dRd{3-#$)EAsN2e?BW$h}A)R~{Y+WIi`eg_jHs2AT{4@277G{1yGX zZoUs9cDJy*u39Pj?(|>f;WQ#-&putWzg> zdE01=f5Gooai=R)l4gpA%C47tZzs=6*9C~XxT@HP#LZ!58edtbQqRgUs|$obLVJnH z)1e~Gf4P@Lznx;L{=cE3gt)Pevuph> z?M~g@X3Oj=*4;iMX?*GadWas&!{@z6!s3Znzx&I=zuqpl)$4-{*)d~P11Ca*SQ`|d zPK$3?w6#fM^r!N}3HMA3YtCUIRX6QAHK89No}D;eE;^9Uc7}UF1_>jXs3(jFu=UoV zMLeNMi8ow-*Sz7Vp{=3%GJi-fAYeZOQl1Iizbh(v(r8ArZ0OnnN^aELSn>t!>)5cl zDH|fPhb~wbN1`Zuv*#lyT7qCes{(42KDfuXyhxTxo*kfAuAi%iF|X@ox2UXxO#}hp zA5Pn=x>Q_nT*j;7Pa#CvtgRu*0nIt}mM-<|zM?++Lb3*qP0HmfN17VAY%RSRC$#i7 zIad22h2*r@sw4ka@s$mpgXZhWMSX@mE4sgfGtG%Udp~6jhB!I0Ez3Zt+=uzkQ)82FhK>QQmGbGAOH;1 zCT~zrFW481Eh_0VvnesTeMhH@opQwbQANeBWy_Y)%x)_`T|e}6sJh#yv90;bS~9-N z^i|ulNdduW`OqjSnwp*kdn#_dbP5(o(M7U2;4(LLwcKPd+zQ{voc+TI8C7I=_s9d4 z8HcW|=#5Vw>fvvToq3I08h-kh1oo^Qd~>_@1Z(!>H&%w~RaS5W|C*k&kCAXZTT(#xP5%fNsTmYxDntj#iJhMGPi z`dbH&2d3lPYm7-Tvkl%eRn*-V_tu?}sRae1t@eMji{l(0EzlRetnp8T0LEfpp+ ziOG{B3ovbGF%eKWw#g%u-^}ae59T#UI?uC!m}4cant`>FqA1A*8Ju--`Z~k6)QQg( zS6h~JZas+k41r7G{|y`3%bv!? z^?%4NwUtDXxUJY2Y76e%S%ce(6bPij$~_7g_Kg=B*s&(KZrG&hEAIfwOjp07Ik*0% zOvuQ}osiT0%P&V|1QkDJ?WkSm=XY%oW}U)#kYtXJ5nX1whR{I(8Va1@tQQ-(b?k&2 z(i3x1AuSdw87jcx3BUtyD2fd0-r@05`0zx&pO$7a8vPAk%@Xcte|-YfUDwBjPUbKX zvzBMVMuaDzeK?g~2QnH2`Qe^sZ*-E;Z}9WqtVXKxbH|ZN;B+7pdH2Z-?o!A?-(?#C zBcuo@AfxO4Bq(;De+eDxPZMn*DxskUEEJ0Re+ z_Q;&&$5A9Nk{e^G^09g;VzKS6t#P~ISmwGFfbCLjgvK63)|))*a5t zJ*KrEQXU*>?P1q}7CsSJfY_UdUD{_2|6BF~+r<>;dnDaHVyY_h+O{sAwsKpacVqNL zH5c+-dSD%u_@|v5%5Or_s@PHTO)L^7z-Ioj&7Kl~Sbm9?NM<&pFl|E`_Bs z4~=TWkW72xqOsWDbd*pbUK3^qfswOI$^ME;mmE3uX+_420M5YL-dIY&Io~d97BKj7 zgFyTT%&!{CZ9Pozf~b?Ec;Ob*QR2z#fP!;Vq-vd~TmvzR;AKt{S0O2Flw(mU9JZnF zu>=19{7Zl(95Gho5rvz5@>C-j5%v_mGu*&m+GO%z$k~WbKu%xbeRgEC>h8a-Sb=pz4Y~mMl5>IYBWIfM& z(h#bt&eRzy_+vNUAw0#^7OX%kbJ9VoXAzs82`z*j$Mjt%{mTq7YVk6 zxN_4vma%z_(nFHep^xH?a6r6!*$t;{&G-~al}N8}w+QN)s7qdDzrWXIX8DR45!O>Y z3v!#XTfx5j?{I&K%-oU}zzW$IjcZE!Lt~R(S~_1#HYobUNC!+XNg(`N%J(JyWP%BN zEJM0Yqq+*$Hv3uflrQ)`u&1Xrjf@I&Lw9%L?Tbvgtwk=8e+qk3;ftMvOd)NP-`nf0 zbg|C&NQp|9FA)4S0z1i{jM##NYF|($0xW-T)C3_N*?sddxI!S8#0CCZ8~4r-osjHmjKl)J4zM z(yH}+4_s>Dt;GA}<&ITP^k6uSvGby%HMB=s%4i1PGq2%n*USaEru zBMch+ybeeZ66f^uD)ns7G%8&Zka5$>6%r0ZrDu=l-gU=* zC+I#krS2+^?GfkAhG7wDF!!?9+9!Wy{bNSZG`*a^atn$bEYHmL3Q_Qniy{|U~E!J%$cSjen94iKp{lmttu+enjj{eR?=Pm)w9 zmA-Nqxr7bS%^$kL4Iy5}%m3~g7Lc9x8UhT+=4iE^>AKy2wkWrWoO@DP zIF81-H4T1a8tPU?SP}sQKFzhmbh4DJA0I1iZpWm; zELvs)r%j$L$#_h+7m2g{GG9!v@o4kQf6%Z<_t%#Vz0bD9mr$#*+SNZMrY;dKz)8qb z9*!z+7koy`^|$WUQp0TCXF;-&Fr#`E(?OPB@N7}W{Um;}Ix2A%q1ENDx2=g;T6@om z@DZ8Dld)3C^gcpQCTZJANJNJ#K_ZZCN*gC-^@I6Gxt++a_06lMU^Z389qv%zO#R7!J9mAlDbh_p7nS_OlX*1MLNLw=$eNUC zot^WNq4NcxZ1Nz8gm{$8kFx}e;S1L^yGSEdSfO%SNprIJ6hOLap5JP-#)yL+&y+G? z>m=17Yc$1D8NBS4qP5@L`n|$c;ZbtJT|$*8(J)Ek81d4+FxNHE&=aD8iw{XTUfC;` zsyS?}NZdpfl@t0jyz>QWEGO`xyLmC!U~%~WvvKd3k5`RS?`XCxCDv??N?t^^VVE&= zcQ;iN&P~j*V*Sl1yUgadR;wm!H;chMjL*p=(dlaqx1xNHNYIJDPii2EGN~+q0uyd$ zbtEI=MS5fu$)^utt?9sM?)Uephxdg&YErhCKGn6t$62LsdMw z6P+J{-JDlSqI3PB!&RWtS|g+>W!4@kl!$a+6Xk^22fqA!26p{JvN66kDVH{j&a)mP zYF~9hPi(KwamXj-$>(m3@4B_Vu+{B~EfWu#63+ei0)Cw7SvG0nANsWQA2TP416PJD-JCTQ)>(XM?s&{-j zdHw%!0j5u1?qAV$M#wUzQhJM=t%RNzRq7U5%pi>d%vh-Og;M_6Y6m|p4z!F-B0vWX z`qQR8vSx%ZV+{fi@95cWIdyYEXIHtl;r0x>!kJOe3H3=(0ca77b4LQxBmoY}f4RxK zxF<=?4w@fc(DSUyHpg3gAw0p@f?0-r!hzNw<4!otmdwMP zuFidZ$E;F5Af#s43HHktpii?O*Z?NHIPLYGs|N#Pk-37irg@qkX15k;m{0f_-njQP z=b}zm?8A_PAZLj>6<%lUGXqo9)ns-AHv6GP00N(IpGxucz+CtB{!g9U)YqIAJ6+S& z2#~B_E;NT8I0B`5GIKIrwR_JG5j9o^DwBDDSISMMX=)%AG34m1=5l$}IUQ>WEq_Q& zO=U>4tF}y=f4RC$cd<--_I&>NNaN7+Wa!^_3TJzUUE8G1j`l%}sUAEaz4U<(IX07T z1Nn$Fg%=UnE=?q|oc0ZuFwY4ii`C-;qN4{ZbJQ@*5=TY#6s;g>EFEDuoR~z5Qu%{J zRR5EQUtw%u$(>iccn3JMkZ*-&Lo7vE8wXAaQzio~aTt!>`zrpJ3h8WDO! zn2&0e?qWq^!`YKjerSqmZt=t(o>>vQMeTmNYpszxw~HRZ{ob&I)os}CXXZNkgq4@u zVaBUZn9HYXQXqPAuL<3{tB)KfRPO6J5R|pTEhR+vX_;+X!i>fViKGX)#Z9-qYb=+% zlpz|eml(m3&}_Ige%h|@7H;NpD~~&roYXVUDuYGle*L_C-Iwm(=D4uAU*`1&gI%B< z>Mtd|KMhBZ%ab5QAd3)2YnYL9R@rhAB zlSw=w>h)o(@qT0hFBm4i{0Wjif8nDI}$I zb|o=UK^N1eewO;hF^R1_=d;Ap;&G}us0>Zsdvl*5U+;M}HJm;Mm0IEjjq!G8XSmm9 zZP`!mulP=jv$8%`_+9&%P%KRUls5g>aaKeA=JHpbf_rnp^B7xP{rQyKxEnVDHm8|>q}o-YB%jQ_Zf^C681 z(T@&Zm+8rk@*2%wK8KoLdakB>hZOH1C4>8-RR5-cS&BW-5+#r&osjofh_>`W5})89 zh*AvWrT06qY9pkKYc#%PU6NV7UZg-x&)u?NmN^LhU{iYgZJURes(UMH}({ z7`uLUnWp7TSBHc9=eq;WIBG56XvxAM@|4@{yk)2i$U12KT7g5_C-Y5U_2$;;D+8n# zt2572i+qkEhMTER#$bVi&u?C-KAQy{(=#ze<;T#)ZE%+HDiD#m1a2n1DB(C`boYyN zS&IS(KV#!czEMM^#tI;!QsIa8Zm0Z{;H?=LI;v!a141E@PKC@hPvNe}VH4uKjyXyl zYiHGM_#!$^ZjTpj@4L4r>Gguy#dMww9OD?d;F7!Q>$1ejw4JGGKp8P4a2lb?A=!OQ z^7QG%yw<5X%iDz8%Ed2rQU!|S^iU{RM25y8J7$A+wc0&)FA5~wC1d*+WwhG<;WVem zs?DyV|6J3SWn-tx|LbipYf)@;I4v8ee)nyi?mPCoZl~8Thhm*RPw@7;`XTdfMbuQ|$|Sq7!$P`R3+WG}8M{j~WQ|P^ZzVVA*)kK9IB5 zwsFSRBroiZONbD1o}G&IJrap?Le0joa@}1Wb;DR5EfP*$G7tWO6uxH|BLKQTPUr@S zm#Xu_C+#NWtTOz3u{t9)Hnr53rxG`jUZlEe6xjYZ(^ob|56_;F`nHg9_xs>xKhPa7 zs$3qMHHL&^My16HMN6YhxTNwDkWTcTDHtU>Pz3%dTH~`az;&`5*Q{m^M8r`NHOh6*90|RmD%Uz{E7#e*cz|HNcb|?hpD~m-ogn*?zHBRP_&gcQlME?xUAT z+rX>Cy&(3$$rxr$OG*QxH<=b2_9H^K<`Y-9_2OEuG?Bb;Q)T{*&dFr~OT-YyD4S?~ zrzM%#iY(^;`GD&|GS=MBvNRVC)%-e6f7l%S_`8MD(}C=%>tDr8y2x)sBvl{SacyFE z!WFE~h9;{1P_qjX6z5JN7ZYj#{Icdgy{i3z6_02Tfk%7tIDF6&rKG>*Gi6sv?igf& zw%Td;x6F3_QS8NFst7h&?g=E?lN6fJT$JBkw&|S2!WChp5 zDU+{%D@z9mc9=Q@mvbHfo+?KaxVJ7gtYSa}YAZ~pX%BUfdP7x{Ah3iw08bRCc^JDO zay`XX7Fs9`gG~P*QzoZ7HsInVfHtzJaUF%V@8V_SPE9TDnZfaPadp{O?$?~=s-}_@ zZH4CA3r2rv%(IQmBWZn8r+eI2KwM{k_}l@ppd-Kj^4(?0VJJ&hFGy)rNxV z2_OF$e=)q%rs)ONNVu?S_9`SD%8W6LU>3UtaNc3Cl?9p8dWQ=phEX9Aw$ir`+g2z+ zOr9T)K(shKLV1>8KIUBGOBlb*T=98O&@5opF_SEM!+boQTF$Dn`fDwoS4TAVX?K`+ zD4ca^A`>1s+EV}`B1G#P0>%kDt+k5hyynebP0^Zne|cRuTEIaV2&9iPf`c9RS$)IV zU5~ysyx+kmUsNOTO+akc9!Oa%@`5%FBrp~lD<+)1?{BdmfGRp)J$t3;Md9-3Y8V22 zc#To!Kj-Q*I>V?;|JI5_B&Trh3k5I9!cKqqr}Jvc+=S*!lCeA@cY3KSmQc7?xq3KS3!o3iaY1DI?=p&joFC65#|I8)IT ztHE5whTyB!`3CcTQi3t}u1Z9M?m1PI|5`Z(FVe2_L;wtGLY-s{VV?dK`dlGjP>XR2 za|1AGmGYB~L&PFugrNfn!k}Vjaik{Pu(9!iuBNW2Z-hvOX_u^NQTdW-iDw$foSMqK7CWPCQ3@8!kc2<`jORp{F1l3UJl5EFSV^fsCu^JmzZ z{_!~T$1kv^IatThPXWVbmSx%VBFnHLx@?~=wOt?3b9iVY`#@=!N}dsUF8Q3fO6dSichb6+wq4S}PWas*{P!yYrWT`9d-Mf)`LiptmfygnJCNQ% zwI`!!I~#93`H~wD5I(7`)3kos0>b#O39l-wp~AumxRPBz579yoxd$X}RnYiCtIgW$ zZ){B(c;pimwiI@YtDR{s=tA)Ep5m?>1{sGXbiby};d?6*4dT@kc6H3S+N+1tH@>D> zdVS!KHIn$^+-|g3cAMj@UekhOus%gr5} z5AzE?$2t`81av5q0yaQ$CY<1!EWmH>DThcQseDo?7Giw#fCPHEy0tJ0398LV@H zu(2laA@!%Xeg-0~b&1A}(MKPG@(wQSuI`BpU#2Rg^RCpQp=avLq#+{HhshLqgna&- zy{(sZ6fUevNI*D87n!&9e=4IaTC*f^iX@$yhokXVwUBrrUr4~JqSov5Vz<<&KQ3}T z-35>2qL+7+(?YE$&S<;YAEvpvE3@|HE>HcU@8pmFZagdaxO0|`;y=xXRR#rdujzQF zDSTOxDEh-jGHx+Fw5Eg-u7m0IK(`#Gev%(~rCqG1aiE-<;>HsB5UnF-@{IlqL6HeB zClS>judWD1pGkrOPl4%)s5ZKCW?<~Ghn8mqblbfTB|#3jd9XScI>c&U+$c`Hm{uuK z!X|N69o=}aP~$u+YWrT#Wrt`sDqZ6+AUBCBTju=aKD)Xt)o~c*f}Yq+>;U%SwoFrI zh>P0jznA=beVmm&inLnIy}}8~u}r3lEwPJ>K>^I=8p3BC6DXU zIWK|7)T)lR1Zv9^yG@3Vaqc~>s7Lin`KEjdt*ntUDf1#4lhk9Bkx=2r7s-qSHnSgi z<8W?eJp+_c2a6r98cR!xJjKM|s{@YWu8GkMZq$;;2pka$e73GJW{gnYCnyy-8Ht&6 zY&x%K-TkbZP)XYv1$@Y$o2*Bjb|~}3C7L5Wp|-BCKMMP0$ZwBt>(AP&2@$g|7j4m5 zSONxO|?ht(~@6!t60WowbSA(_O}Dh#*&>z`q#T@JU(P)Ed-^9rP{R@2=7A#h$w zs57b8f7_}(8jqSZL~N0u&Yv-pHxdJDI-cZht?BfDhu%Qn1Fj3;BY=pKcGImKrtTmf z&!eVZrD!@2-yjqXxD4&bDKIJQX5K?tQ6*>nW1mh|*+1UW6|B_1+s@s{%RN%LOP*)% z`c6F!cqSEdOuuL6Q;`0c<%9qF!PfVFIm~VqdB#H#2vf+vz4XBXtCk5Q3)&h|FDunj zuDZG{uhrz?-ed^M%Fgu%aj0*I4+wfTbNw=>A1q3%kFT1&G+aDS;ttSk0(KeO7aO;} zylZR5dJ>Usak~R8OJXdGUr*l1xuiri)$`i*OaIgV%x~Lh!1U}3prk5-hbgKr{&R>4 zi@_Y$M70;Chvuz6B{2Blc0i98Q3I?aL&EP%IlQ(I^FJ|sjq;*l#>_Rwlj5hHG)cVa zXZ~Daa<{YJ7?u|P9U=*GaC<+(3cQFu+6(gpgLuL2XBzo7w3#TCTl4k`EmT6!3(c1r zs2ZjQq&XzRJ;INIx992|T9&T)shZ9Y-ar+cE~ zC5>{;nNl6*mF9ip^8SFE7bn3D9n7r;OX8^~myQ`V&7q((j4 zUfJJ@(OjdxnXE?fQ$hKY@PpyfuPxI+Ho)LiB&0 zERl9tk`7OFrTd!Up$j$G)VfJM^tEY`Qw!pw#}x~kZS$S-oa|8hN>YL8 zt5r+n`VW{_qNA6`E0MMm-$X{GAUD#^po{T)({5-ZAN9_Hl`VO#^vxv@DxEE93$Svk zw4nuGNUIMYGwpSPY7Um<1-*|Ful6k|IT`3)aCPYy{%#+P`kVn&$EC6@c*wK}#&jPl zJvp6%r(nIaZSi{NBQe$No7&2)8^#~C-ZbrgG75A^ZqG8j3A-{J66>Q5>I?H~QxdNo z)=wWO5sKryY2$Ux&p!QajrNi4kr?-ZH{zx*EeVR9LMrX^o}K$~hySTRbP{G3^RJeM z##yZ|pt_K~qQGRuUN~rMjr06K&eg}{XVE}B#JfK0~$}hOEKV|v(mV&=0NkSL6)vF^iOB5U1bLx^T2>j(`2*ao>Dr`bY(AUjg}pDe;Uf zRuiyMlQf6ZWs7Z(o ze&gD~v0{k(;}=Rq#S~^jlw$eG!nn7^$+^pCtT(Y@rD3%CX=Ax&H|E<8YLSf~GCFnY zRDZ`{3_>kg1y%X+ZX!~jz-0?#UnkqF@oVw&cJc{Jn9;{O?hecvhed_(#QHNK9!lv) z?RtP*Q?Owhdw|7VXdn5A=lXXJ?B@3m13aj%lTmVJFB$HBKAu|J|De~UROIUr1j#i2 z@Qw!x8C#mIf|E#;KqQ!W>xKv!sU3Z>`Q`Q?1uM}EWMX#3irZo+uZQr@FyKHF19bsb z){Xg7*oeH)gCiyr@FY0WBP!B=z17^ddxy+&RH-JayzSN)zo#bP1DzH57pWK6oGQnE zUn}oSmjvRZz*Q}Qt_(iV-Ydg=4V~Lc>|kyL2aR8o7rFq6#k-Ve587VPB=n#kHZF2f z@6o>yXgN7inZIp5B1S^3wQaWyyLOC*fm-I8`;Y(Q0$8Ywji7#TYwDM~m3MVOPG{jM zpSDl>wb)KqSdauMliRe3$f3Ev?XNSRof~9{n|KlPoWu@fI2b0#M8-fIR#^KO2FW+b zrzgZoAeX5;@E+Ns%756s>{b511*-*t0*9ED3U|Z;Z(O-u9ZI-VZj5-kfD5&Om(^5@ ze=Ny@_}ECcfFOg~%-e8_H(%f4&TJ;8+w1-yfc?=lqvras{YmPaU z>Nk@b%!zSonE>V>R`8%9%1M~R091B1=`ibqyOf)xgh9D$?2&R)`hSpyP%#QsidDuk zmOm#c#i2yVi};PJR~k0Hki=l0A^xnhc9$mjn* zlq8i_UPnBTMVJj2lUL0-Sm~%e;ztz_!kN<>Y{+&UV4Qp88@zwd+_Hc&i(W=;Y1_q< z8Z!%Jj2Zpi&({#dIRf&5W_*!O}N$sYj%TGxfJ1TR9FZnartN2{C;IZ1g-f+kW+9TS2! z+kEEq*$=xflr7wQ)0P8&!bqP4FRfB{>|T^eeG4RMuvO>Ct;@&DFa6>QS39w4Tg20J ziE!d`w5<8pFO6@CXy8l1%Q4N`%#1@A3;cyZRIG?3x@N0qJ5O8sAo=X&>eO3?$47)e zL_*%QS=*4<@HOB^0WU}spQKTX%cd=a%2;?kK#q#TRYeaCt&2}-o$mDH~ zbSc~BiI_;~zVirn=H+)c1*%iXl&wuv&OrSml z^BnEm1ID}H3GgT5r%si=3*5w`X_~t2HUayX(^%blr)l)mVKOp+XMzHmu~}Gf>OQVh z84ITCJ7oMhMO2K1m*;p5x=yl8Ja3551ffGWd;sN5rbqUA);m=`JOMVuYqZ z;^d=(jIfmd4DWtB1Loj*FpXg7Z;Y=NPCfio@lMA9^N@UO#cr#zi@D?P=iqodmRZU6 z5?Bb4)2iEMsu$O2NAUrbG&n4b1L2m9)|gWLzOp8xI``MJ9$0F;4tii==<#EH~;-4Ws7xZr!HGeTJ*aK72%O-j?ObXm@ z%xn!C!2qisi;*oZ_ExIMVkD;0Lp~*`6?;_7@10uKU^BcsWn&aKl2e2m9Z08mU$&hp z>(_|ja|a?%I{f{Ng_uC3Ap1ms57jyMY^Brt)IT1seje{3a{b^ zkl_o~vnusXrVpNxjw!wFFZ0g!p0NN{darwvqa3s%gwFFfxa2Ex`$j29nGl1^!zxg1 zo*XMUhe0GHmQvNIaYw-G)1HBm&*0G*y>Fv-xpIi!`Keu(!CLhWA3@##89)0hBT(*d z;fqP1=`tACJ7MH$(k>bYq<$3b0$O=GAITB*Ip3G>f_ST)kszu_hgo%)$MORR=y^k7 z78ozmrfdo_=wG;+z~Gb3&FCeo=jgOk`2LCLokeGl)Q|*L5RK3UoZXUY={V5FurDf1 z7b_Ny6fhQ}Ai1LSZvoi}pYTvn=_Tssdwxm4&sCr+EGjr4!pnX6&a!YLJ1<)U;dT5dYY=GZhjrr-0R63KFCf|rq(GoL^k0?W@S7Nsi!{A zc)0COb`qKX|1Vdh5^?s44TPH%n}DN(ceg@&{z#oaP_ni^bBSVD1N}g+?Y65_XmlyBx0d zIXJV4d#(){ZzBFR?Mgy^!j<U{W{=u4#yBS75XHQ})dt5osF z8`(_T?sp#)x}RTdrw=|~wWb{Lw+NMV^vY%KCUW7Rrxix{5ErYdEV~Pyy}xBzSVA`+ z>nz1RNaueg3-hZ|tOV8hXFEHs;;ekMq3!SgYryYbX65`BKc44*Ij$+}7nhIHE`Qhb zAK$pR*pIfH6TYGL@?X!RMK}&G+%*NXiq(RgK+?`KnTCnvUQE+-{DXoz&-Hpgvt&MN`G$)k~VF-4Sb{E2SGtOm0iQ6wf;c4OV1?!pfSfu zzOJ;Wd4OGSW#t~sF)lO-s5!gfU{h;MSG0NCnBvF{(a<2xJ+s|UV^6eN9ssRsV4{Fo z>fOl>5mQGWt?cqL{e@+U^nm!TFt+B=@NUB|4(K`1upKCT_z9){Md>YJ!j7H~8GIX^ zqV(63t_6d=ZtU?1wRC^C(oVI=cQdN3dES8;>MZofTioReOv|90hnDT$Y?@Iv;*r}3Gm_O-# zQ%|e54SjC40GqZs{-|Yh_D)(X?6hD;?&y&v>c~my)5T@~mgfD-xZ>Oe>YfQkZ`Buj z@o>`kpG&@a7b+0dqn0W`CN9_f?5?UDm0In79RN6970SUk1q)^ejpot?M&^S)a)3<5IlShDSeLnsOZ@g1MgElDLsz38K)OMx_dcyMz( zuRe@Q82O0OW-69BRoM_-|Q)Xf9N!%V|Eco~zc_y->qGhOhWIN!sW zqthKO?f;LOo#mz~33db$G($E-E&zxp%ho;nz#F7vc#Ic7!XQ@ii?%f|F5tn+*9{v%fYpqC_BV z(F_&7=4{8*u9zNgIETGnMtrbqcAAe8v+n@S8Kw`kSnndmix+@C6|7E&fa;P`fANu`#J|yed4g*&mrMQX91XT=aMd;Z@vr8 zs?m*VkT!qnTLXGPSQ(@&*3mKmLwJl{5y9&GNSO|NvJ@6vUvuxp&Us^S|A^l2uzBf! zCeMmo2v-Ew_lHrjR<{3)d*n!x46|IR+G?8p*mUi3dXZfX>?tYjM40XePjjWx8Uf@= zea%O39Si*?l(3?Y0w6^S!EFyd7_+`USzun+4lJYvDb#&l-YiOW{20{*4wt96^pQZi zQO`ZzXX}$QPCY^*IIJTX?jB#AcZ2KFYRjC^e>(k)%>hZ0^w*R9Eyt;+tQ13Qz8g6M z1q9y%i#)SpX4z#!B?wS;A5MXu;a@UC?C$Mb8jDpXoFJhkQE6duD;xI?WnRIF5u>{9 zW{6mh*jcxI;Qo{J05pl|Ul3=0@8wEV-Bg1!nD)Dg2{Q^2Qv|{V`{HKrml}w*xrYN& z4z66jw|-YX@z}iPLt(Y@%48~o3otA(!+K`qq;Nxf+|tT5_X%n!DC9{pjp1^{I-ID;LXBo7aV)KSQeHeSaINHkDP6)eht%FZc*@NBe>}YjT$5+^JuWCH zh=5=W2xUhwAfQ-*F(dmXS_qAbimZZKEt{<*HL}VUb`{V;L7>zy+PZWR3W6+=O^c2* zKXob~A<=%Pt(e%3FjDxR`!e(YwDTE@Bzg0`&vT!9&pqedWK5r9(>Z%XC-s=6{uRFH z7lX445CAb#g zTMP}w6PAwW4?KnC1VU}Pv3vuV0SP>{7MiEIxL9FJo}mQ(z0Y5Zit;FzEUIX@*2n3* z!v{dN342IUt+g>6rw)!)UpmqT1##LH-%aphVCDC z0r3zNvEj>xJ%sZDXXzYK{V+*fDlqoYsm8VA7GNR-9t86j1Yh9fUIBxkYWTTj!2kD4 zAH>#EV%U=bqKs*_VzY9AJmK2N{+N`0uv>iS4FfBb1H3Sbo_91}dTg#V2wc zTd+myN}Pm13>7buOb~isDVhKPu{LkrCONmVipaW6J`FNeqt(ogEbI}yPP7XWu?|N@ zGlDz-bfb0ser7=!30sQA0jyL%>p6Igh zT`<@@SBVNGv!6=)J1?W8MaXe3!#XjQx!W3ur9T| z=WzYx7c+kVWeWa$jgNRavf7BVDGH7l34%Rk;`$Y!q}1L;F@jv`t{#;4sK)s&jc7Wg zy@|jbr(4_H=+~U2TNPi?u2>JbvLmlsjEOaXCs6nz>h#==$838fO#x;Ooa^`*oK^bo zRS-zxg6cb0@{^Re@;L@SKDdoH-j)YT21-?NJOTx!uM2W(DD`F{ev@rz?76!SWn?9` zI}zBvpd{zuf4w&pdPv~_5aK^akklcKnJ-$1iUbSc3z}~ZtEi`#IdpA_U*XYVcW8O~ zzl+rEH?V?De{8X7i24ebJLn5$-~#JC4HlZc<`WB@e+#?FO_WFGPE72HP1IPHoXK=0E&}QXn>$A`yQ=G#*7hP!i-orP< z@0RV=eGjX$NnPf@b&dSp7+DWB!keHGwRkvh!gKD(q#HfbZ#xFyW74grX&=vUKBM z?ryz%`(|9`KL_N`T~qd{N2etwkUmIpM>m;P5Gghhp5gvAv`?yMLZ!h1UNnNln<7ngGY@Bjn^%({5ov;kr|7t&&R&qQjCt)PgvTgKt<5{ zWd-U=LSax9nYP`Dq3&lC_5>nQc_kL|WF;(JXwx({!UPqxJ)HJfpvfE}k=NsBV**9} zzNq|6JQJKJ(fH&1j|2na*HE}n=-!T66>%)Y#C{-@i4yp_>*w^9YgK1tLHa8tLHZ39 z8qND(`!pw&wF-=^G%#lQQq0>exYx)onUK=4lc}b=h^c^<2o4k;J)aSs)8mft6jGs` zRf{I<+Jy-b6#AhILehz>nU)e=Cj~b5-(;QhfH_vWrST^Gkh8Hkt2k}^0e=k`kBs>s zx~N>D0vHMX9Nqw65b3j8rVsYU0tG`;z)gaqtT7zj1!oSBSIlY*{KnsKf zSW|c3#s0;8@GOBxGeR_Uccd?vJ&;>Twb=WgNK$-fF4AiX$o*csuR&e)-3b(;ZqAVP zEIb2NG7=6VGB98c7}2?~hG4ciL~*r4e{^->_lc^EEkL}<81#2`L>6v)+bFwpa=e5M zV>CTMVc1fwH{yOAFOCHhLY<2A|Soje){N(AymNEtV6 z#7e>-Q3pLY%nvh+{);h4K%QR%$?}@rj>Uql#Q0H21ZYEu62p`)-sg)Ba2c~x;Ll9G zu>%!@B+U5poXYZ#)LL4W?!bOgHdEu!Q*Xf4or$Pn(ZKC!dIeqk;D9~Xc& zdh>~y!Js@PCeS!+=YG#-p*8`T%3B&QH}X>?(Xd0rM*M?2LmNk|y&kCCSclFUn4j|> zTrzN@`eYNeMW{7_s)s4-#v2;{22g)BFp{e-)?bHEPZbjX4QA=6gc|_SVtN%d56~t+ z`UU|{*I}XY9PIP3g^XH2@XrVuBUv1B>3%D9gMw@vKd=HL7B`&?2sScI#)aaCb~Uz| z^(8Oiz1Giw-@tV-1_EH| zz1_m;#ZGHTvni(uZ*cwioNP|rkTRRZA^7?=V8Ud-GqNOTb$kHChpkI(k0gyI63w@vep4U|DAQ3CU zxmQi@D4Y1(IvWYazP?E|bP%URbY*eD@Iz)&8}OxMGN^~xiCGX$NcP3%XMLk&=}zVO zkPJk~JCpeaHf0s_gt)EZjIDtM%tC7k*rDn_5vW7-`-X~|3f{2MYz_R;5?GXC{Tpmr( zs9IN6Rj?d7IKo~aVY|h2^6wGEat8k?5yDtc?y7?M1{)l$^t8o@O5@ytYtbjsBro zaSP6Y=)ah`t&nf%)_va6QUXliLV;9GVOh-Bw3_FOjbWNb{LN^ zt8g-W18XCIHVgxh!U?9415Nru6~?s>Y&ZQOWq;b#eG4t>R2~2`7R59}+r?rX{}A%c zJ`9#5+!z0dzTvLOtVZ5}ow?;;;q*?`o@_(C!Q52GG#yJHL>?z0#6%QLd=X2-gkfOB zBV43|n$s7kO1{Zm;fV(SoC9Gv#7LCPGET2dCloY>55f2mjjK-fCa-syWhreuZ;CdV zDs4j5eofQq>3f7@a`vw#tJavE!lUu_fU)!X672y{IVglZbrMIomqAMAfkwjBLaT$QU58*#uaZkPm@4%4pXhq3D zpel87{1sCMp{iB-mMSM78=3yPJD8H}VdZBPQ@LEmR-&R!bGDD+5?VP*HV6x?9?;Fv zXr#j;Oi0YWGC56Y!J%?JicmslGn;R+$;kJPW1s=edu1J z86Qgd(ZOF4-jR0@-~{}t6(g`1Tfp$njN7qt%qZ>*q|Yg*C*;+!Pk3(HZ|jE`;PIf? zw@G$!h-b-L362GEG2m_L0pwvrPzG|CKvg?>U%98mRRv;a-J_yv?$s1aY_j1s{WjxY zt6ZdKIwa3diQB0mvylW%Vr@q(9Z-G>;YMb!=b(26Pteq%HI-z0jcJ?0Nz#(y3@E-B zKETMLRNwkzv>QML>xRmr0^$b{D6{!=^iF7YbG(MHoi1Q?y7NWf!J1Fg7%)6XgA={4 z%vl$b-5Td;NKP#3{F+y@Dww7X;#fA&6Y51>UW*N=P(!NA;Wq}5mYn)_7c#^p7FUl zHNx^SaTtICv{rDQV^x{&nQW~Pv(W~m{eaI#(z&4yFzIFByy*a9m{#6-Wd*1Uvv<*S zUy3)u{1nvO7JO}*0*@M{PCh#1?2~XB16MH)hCEewofG^M^%kB#Rv9fa;yO?SRqTg2 z5bX{ly%31NAAkvfPHy4`Ir?3B(}| zYfYe(2b+7oqw>7c;UH11<=yVvwe_{n+ARh$!#6X~nXF%pK^wstJ7FAz0OFEXXsW_A zx)F3?rm(^1{#=bK(Kg~!whpjoE@Qb)=6%&B(QfXb9y;;khtX`pWL4b8a&VANfPj!; zV-bgL!sUr}^;3e=HHxN*cleJc4EURI#T)EIF!DsQLl%07!w}Qd;a5DFst8`6 z4k$|iKmz@XcDxnp?F!rpKwTKPYKG=`An{uyg32&0$@EpYUM_)tpBW+vNVZ@(gYg3b z_eoH|G8nG|Ta9RGIN@-HPdC8Goj!;&W-Aee=7Dg{D!HRNCJSZ=_n1e|$Mxgm0D!{T z08Joj@*q3l?2=$MlUnL3yb4qaH=iR#aYh$uobAQ&=+Uiag;|OWoN{p&FXAHjc0*QmlI{w+n$BTdmLyv%wZXA|DAgI=_ z&<7wF0X7E?j^l_oln#$wJ}+E5Uh74-IwL3fV$OD}Wng&LwE4y|o>PCn2aTq^qU zh`Z_Is7&!lJKFc4MUJdnMm<6*Fh;3>BMk)jL?MU((0;(p&q#0Z8Ww{w2%osgEKVq1 zn}rXt@4{S*oQd2Vd`#m?pigYf{ z`|9#(mmaI0G6AQ9?jLRzG2Q4UW!7utcO`-a?NBFQij6$9aAH%%SP}tBe)N z93e-Dx-+}`K0Fn4YT)2XtEul0DNgw)l8l#Ti>zh)Z$q)o6bJJUt;tJt`nE1r5QPEhLPXFZzPn zK=)q%{`2lc&1}ll;-(KFGp8UT{`ATI&2+UbWZ9xc0h5lxK%25@fFlWAPHz;lLw%)) zejX&?Z>kg*;aWU8zq_XcM52TGWP=POGdz?F?jBN+xG?1hxHKensFLvo(pj7D4X87; zEGp!Qal0xo8xK4UV^>8SyxQiX|wSpC_`Ewr)ao_)vv}=V>byYzbcONq+cOU&J?X|2eu7{CItkmflOGY&Oz@q!yFunJfnGw$Y5-1Wfn z_p`~au2F?sLn=1h2+F)HPyy7D*El@@G@2Qn4c#|FbkBD`Ps$E6_RoK(8xXT+0uh6c zaeMc`|I%_S@X1Db25Mi!X&$_l?)i^?;`}CI5iFRIR7`0S*$?(fPMkjxoIiOy$kxDI+D%vJ8S2eHfw|nXu$f=hCThO&mx5t5^SxU}TMC<1k?ytu)4B9;7NLO) zwgNm{L|Hs%FeCc5e0N!I?awGG-b@Z_NWzt7j5W)WNHIN>} zW~6P1E^4Y{7);kVp~EP?&5w3SY@Q&uz*$ibmZxcMM+jKoRy9s8+ax!}zt`SM-JY96x&~1IG8pxWkMP`)?ckQWx#P z?Kw>{n;x z_p@<=y>&9gGc}4Nh}MXzy)lVF8FCPShQ;tU)L&%ebc!m&^DAxz@+Ha1haxKO2sy|C>wpg zW^L!sYx!TGhvEehm5@FXqX3@Ma5~VK5BmWt$P+JbIdp2}W+(Y>6NrJ57|4}GQ|N*~ zqI9Dt4{Ss?4#pl}h2F>+VuP6H1V>z35+NXF;v4|63>l$@j7%pn2unRKFIacJe*Rh} z%&s91Kt3a<<2)0k(vx-PY7{LnC26h$-C_PM~W_Ev?F*y00 zR_-R#`->(to%&x{vFRmr|0p5@r?+;{t4aL^Bj%Abv~jPRx`tKKjG|H1!`HlR(q?L@ zR)%lzLg_ooT|qetRhRC*@2a3N5VlP38C-gI>0qw10({;_7-fxtHV!*<9*Acj^~F|* z&J3({##X1DUu~hXn(sk1^;oXCh!k{ zh`BdZm(cE;e}(^I5RNWi?%*SX8-|9JQ4NL6kM{E^$Hfz}c0;tDJ@WKYcLJ z1i4ZM%uPm+BOr2H5B6eqs&Sf!sxfYQE4CDNG%XMMmE=t*oqLw3Rw1~}JE?!#I}qEO z3qxNXIy`rBhJAarH{kF*^WTi&QOe&-;kkvG*h)GWP}{}9)`j6EOrcUmVLJ7&;ZhO< z+DE~{@Y)18x^x?NA@nmM0#yD`B-4B~3FJR<6|)~A9O49ly^rz=4h6WzWUO>{n74tZ z!VUH(VZ0D)Hpshp{nbmdyQJhq;%UJN!Ab;U%4Hc%`MBXDWfy=Wf$yZ7H=1B%7Jz~y z(S29O`zTv++OynJEuGtobF^_E84sb3t1g7p{*(fmz66t|Qt8d}vBL22X1nTM`8QXd zYNOKzUKTVU5^v2z8bHtxt8_cp9%nV1>2_lF>ZO~}gwK;15i0G@B5hU$5X`qPf*JKu zQnejVnK|G8?@&{Yn=(mkH-pY3SRRzcg8D(51V%|(c>qv~8+rti2w7M*xT%PAuuqEh zqtE?6#2;&+ON6?N#zTcYT~VcZyk`DLCxjn0zL;#OTE+U{!F9Cp8dXw23GT$7XNr9w zPZcz{fl~Kr6r!|w04RLqvCCsE?IP@RsBh%E3CApkff)35(69mh6C-JT_}$Ngc_LjR6lv8Pw! zCU)6x{cr{Yk+iXORs!6F9+OIHj@en?PJ)gJG3-i2fSGDBVHugpER*;#?lS8=oyJ>> zr_Lm+6KFXH9UWwEo)o)K0C@87*t+(KY&@?a-n+so4AnEv(#Pw~R|LX>2ie?IwZ3pq zXQlqiLObDK-8Yr_k3EIc#9g=ip!QiH4yrxqYAnQQI&(ma$ErX(6M>Z1jeDG63KcDG zgk$Jp{^zC`uCxgm>Utzqz3rolisC8bgmiCOQFAyBfHg1x5|TC#*l_zOs5G4&YK}AJ zZwAGH{a%?t)%P0!BLe0Ha0w*>Kot%g1{0kCD4;)HJb{(k;+`gW0*xusPtr#mh5OJ@ z?-E!Rpu9kdiSCn%h$GbG!q>yU<2s?k2NzPbt4bR%bMi#HZm2FnKnO+$S{`btKM^kA z1%JQ4-3Da`iLOrL=}Y0tRZId*kpYPT=Pu@sfR>*Uo}BqN9qbB2(aH-WUTh!yA; z`j%lpZQW*rvjwoa_FY<7o7HLrb_6Xgnid;SCPQ70LIEi*c_t8H7KR+^>T>(oWVB*{ z9cmjTevSg|G%Qra!xN11bJR8#<|V7$Xu2C1A()i7jwzO!dglKyPv^qZjHEBpVtQ71 z=t^rAf&2TuoBV#Y;xA8^tL8I*_RtM9O+SvH$t5`^y$I!oiBBG6Eg_ z0}>jLy|x9!-e2LewH)(p;pBpp`WomofJY#)!B#Sj@|7y!HWbElarNTg11U$_ZK8*< z4Wm(5f))Kl`%t~TJtLD2r2_^5@JN5l0jx*EsqL|?S0QyFt~6750huX4d52Ajdak5?6>hQA#NAnR32--qV-KOwc$;tyvJZD?j!)%3FsJyaAeikZCbA(y`pTS@uAZ zh0{-NJCo!~hYNTIXi1%oKh2)hv(>nXn|B>*O{B-R*D=mkWtBEiZ*DoE* zCq}5iK<0d&zTrYfL^(IpqK-zkbz(TZH(scdnI{+sTn@4bGwBb?B5NN8YXpS`3eF+R%qqo(*=H)FDA|O{sBHRZW&HH{>D$W;^V$nEq}0Av$^YyRyKrS;4)eD=H_6G6sr%pP)=S!Oy~$kyA)u7?Q?D>10UBTc`^=<}qQ zAPeD#QU9dqfIMMM29s$kM_V{!yJ3oj(pYm)!_`tHX>h#i>=Pabi4v zYn1K42iprje7YaV26}UXbuyx-BYIJlAK7saW9v$(w8SHdc7 z6ozCl=kD}&1zrjQ4BrgWl-I5fr~#&{#0g>76B4KY^Sc8f3rJNzaR!K>y5AQ+8H6)c z7i$OmI)k474z%?~{WbFYRsTaT`yVIqy~g-huIwuKs%=f9PKA(nUhwobh@?1y6>!Lb zNi#qNA{oU40jyb$_h|MZ(ESrUP!49hgQ&rJFwtfDKP~`7q@yU~S);`?m<^E*n-r%h z%o^S(8ksk8gMl#7wz9LuyyG=(Kr^59eY$@;%~%H^E;&#AKjg@HJ(A$DH!s)kwB(~wYiRNc&!>PB><)n07H1XsQ(2)tCh?amxhdRm{ zmR;y7a6WOjDLX;dN^tS1KuaNN)^mPp%N!8N2-G#Q#k4@F@yl3I)3hD3S%Pm)cT5q= zI&@-!q>rn+?!zVt(@REAiA^|InyH4`PR?+Ezv*ZFjCcu{1>=}mTRa+;?M}A|_ctDi z9+~cd;yXe{J5?hPb-S0;$Qh@MZ1-I-BBN-Gc@f52u~M)va3+=$x)sPpt2iM(F#@f{ zne(i*8EAcCt|X?-SW=+{wAQ>u^f51W;Y0>?9Rqn=QqXJxeS@hyNL)_FzUZD|SPu$0 ztY1p~#!!<{vXx<-NkeHkr<2d3SM(mVh>DLFv|@M}5?ne*01Tq6?hkXbj;z^E+G(6% zPUCiXkvu^v-vFo4ALB%@cw=Z=;210%nph6<#<;NVNWMHp z2LSH&*@5XG__=?92{hC1RekUATU?P_WsU3xW=tIf0nVw+KfgxM%FUnG0+GO02(rf7 zL+mP$FKMoAn_yr>YVG4!-JjBzHt>3PA>faLGRyIuSzbiOntg_r#%D?%SRv`dH{jeb z9FkAK5OOmjya}!ZMPcqH1SWI)WR~-hBD>__cz2FL(5_baUE2zcA+O zW~yMW{EQ;7*IZn{MX>oBqLpAE+S*LDKM&~{{X&ziUrc4Z#T~^4F7D66G&mtP2?pSW zDqP~%QRHW8wbDu*X{y($AQUvUD5Q4il!KL6jzr{DwRf5PhAIM2On$j!9OWkCBkhW& zwgLnn5Uh<*>WJ%+Rzur`CSbL-v!=uaL$m~k-Is7K#HLq{+q2AJTncvHG6(@knt(Ym z{xFCg-XWdNghe0(jmj-ftWD4SbXenq3#?=unf|@W@^jN)(Becl3JsH1h_V!DkNrbc zL2NnMSNSb5@6N>aYU7zbGxZ|0wvMy-4b9mKsmU>TyO_g`Pyirw{-^yK_|u&F?+0VXEj z^PZv_g%j&&f-zq+EE`9&!o-cJ!E|O)6Cy3_|K{L;P4Ki+0oE4=n_}CIktaTg?Ggln z?VQ>1%<<_0tz8oLF9cVJK}$2my9NcpaDDJd>M1?1)~GIzh?Pk#kU(N|ofe=BJ`9|T zC%()nok>eIWU;X!z*=<+kxId{o(7HU?}om zh6Nv?ORnMFpYk>+p=Twz{lOMKmLYn9AaZzOW;=ZFy~hB^ zaQdC@>8t@`1egKy38)8}()f246?gxhaIV@@zF_aXf|CwnN2kfzOpuNJ^JIkuURchqC zA7N-=mF76UB6C;PY@}&1@(biWujiY!tCA5ro~^F|*?mXOP@uA+zPMmEl56F6K&TVw zSfGj*LzH4O(Hke*3EEf#af5Xj36nR`&Fe@ZN4jA*$u#EJjtFt)D z?*=yLKUW!<4aZO0uQrn7s;IVtDmmE-|2k9W*T5=}K$-6(rj|dV9IptJ25M^ICY|Q) zG6Tw9Ia{WUrU*82<{3~GE18BMr9Lp|0tUXDlMygEP&}##e*)oSZGKIawsVv`b*fSI zooXYhT5SAwQzet>(P?&E=!o|FCfu=zjG<;9rzETVQ8+KWK*iOnRaF$dcjko;mJbMp zkP{Li2^!ULjO7LeqhQFIqmAzbxwp>w(dRxpp4{69=izH zq$y#iu(#l9l9=BPPd)^;+Fn2D{2$+DE-DgZLgcNgv*!IKNL$W=*q2rT4pT(@`j%nOTt=u9uz9-^nWYpR57K%*> zY!(Qr(eU`anKRUvj25>9QOlTP0qm>-=ZFicgPEgv2(`@PVmQ+feaUJoGpkg3JpsDc zJB$x-<O~PGI3s43k0a58KM?l3Pw%v^%)iJ&xFHIb4rcyOX_+l1jYjASP3BmrM&9=ME~G@*q2pi?BS9z? z45S0fpdLXWSN;;oA>^8 ziV9|J)#Yw#sscoUcErjr3c$CyR-eHd7t!B`iicxo1EE{_kaU*#*Citl7 zhy_eh^vWjzlYI!Wg)V!$0)Z=?HNJ^IkbKrUX^g*jCJ4Q7a6%*~NSFi_j~9nzD^GZM z+FRL(mD0CE<4vA;$MG7ON!2Zy9|eaUgqANGE8}I&+2UY4FU7%K;6YFBU?do*Dj9{3 z;3+skyCh+$lW0#ns`9t z&3sYM-4-~S-=}$yuWw=#lK(Bi%7Ac1Fzp5pm~fO)BqDpdOU1*nMQ*4QNCHO*OtU)m zpEpX2 zm(-oV%hS{-F}Eq`gBC?s+Uv4)Wg)UC+>>DaB6m$do+GgUk>m>f>a?fz+?zdx`kEPr47#sn`T!6{Z?xT!g^Q31oqjuf;0u*fIN0w*#TGUTL1 zO`&9=>5451d=Gpr{1k`*TCX(nP(gBB!f7U)VZZ`!65(;LZJ0{RSMHja z|MuJENzeR1{doA;pXyC8(;~A|*-{5*7#Ez(b6)(d=o8HHBGE2U94YbB$1^}*0O>19PQSyGAnH5z1k`9WFf18M z01t2$XgdTJh8#AHRKD8Lif^XcVp0MsFb!Bk8wjhA4iv01;4ReqdxB#@Y7whY_&jOd zhZ#E^ooF?ZMsJ~!;}s&sV3ff1eJbAQ@opdZ^C@3Ae) zbd^1rAEj~(w;&Q1@S%2;H$C=IaGStvdhS7}G^J52~Nev4=}j_~Peo$p7`n=f#ie*EpGP{XSo|L@&J&S6cPq-9!*4{tIs&^24DX>@4G z|669hbg^OX@^iI!x}UE}d96&DZu%;5B%=t#XKBViQ`7K zyN`O%AV`xyr(VE3{qwXi zJhGmFvr8QgvN*=D?#Xu@dtfZOPJW#iJ4m?^H`AO8gVt7)f`XX2e!_Yk($AOljS!$=m+1 zR0{bj8o=lK!e4=sd?^wH+V_lH1Hbi~tm)H*T=W*SJPW#+lE$kYm;<<3UU=z-EeyWd;T-xq@HyZ&;aVo7p%~8 z&{k^oPUo$%$o#?G&z|4;Py1L|6HG(nE6QcTTlaPvXVg>FDqn516`X~BR;Wr3I#J6s z>&1m(rXk!-n_`9=Fgz0h5DZ;p$l!!!gm4GJ<{(0c>Oq!%sH#n1P?#)V2PXXpzvIxI z*Wt>2e03|#?gLF?4+X3rHT*gXO;h8!5=dtF>hibCE0W>ZrkkBrSWY)=liX)6l2DcT zc?6BOg(K8S7bW4NR$1s<=#LM$AyXP+fsfJM3ERdv)2#*)uOiIX@Uiic7cvqYv(1{_wq=&xf@L17zEhwz>Ix%O>`K)6 z;O@Y09)Sh66EHM=xT1vF%9TS0S4&#YmanG7KYscoj{a=q;r^GbF8S2Sf}7*e+t6Re zvRjOb-XwT^yLcd%)vMfPz2NIC(Jk1KM2mDLy7t~vbOei=|Aqf#+ zs9eXpGs8WbWONm*t^iD44mN|P84#g4wZu8!atDc@v2d9z&%HvB#K6Wuae_nAoxe+R z?h;z3Xh*eH)S$AAphzPw2b3$jqP-dN5^{>?m%+8$3BnMAg*mS zg0XjkY>R^)i@jjO4pk~Zo(>Oe4(!uFe{1vog>XxFxPx-5T3-!6>vpouGK^+a!+mg4 zM+C9u>;Tt>InXx(QaFC>-oUFkm5U1YOVDlH%pbCWqeBfFdFP`=%NGN0LGwQR^^5Dw zWSu@shw00i?WrYvn#@3KW<&EGWMYe==g(vnBi}+128l)!6=k5(yk4^k>X#>iJ*1La z-g2(8HbwXZh1Vx&ue@lCOINP>sKqFs@yY#w?}S-;1MJVBjcGpfKs#c4eAY!S>pbo!0Pb(DF_K~%ZC zCWY5xa+}~_oPK4DT(a!QfqfL7K+f1ee?i1AxQN56?T!T~91Eu)!fIfiwsiq?NO+qw zO6g59n%}r86wY%i8{mS-i4m^h%h=LNZehoO8@O{Tb4A}Q8A$1S$q-xC^_`jhRJJZo zxYuWiP3OT1Q3990{ZeCAYN6@M>pE;_5N$$-eHVjnpLsDt*SJh@`m*3ONHOa=cVF+3 zp21|&a?YmCJu&W_x_m?t+$}X*+)jDLWr7u$-@Xig%ud5l)%ETnw$etQ#aUc98#K3B zO;xi~WRo)+gG&^IS@~(NO6n}K%T|{c>$eHSF0e$;NgMFo&K-P-5Xq+aMjt(HSM8f` zjj^Fv4l&bpTq%-_YxV^4o0VL)^ugz5Edw@Xbu_HV4&TWy19Q!tS)>uLS{A~@D3M*A z+_LlOYF6bk{8JcTVO@u6Pq#7@*>viy65qbq*)JfxDJX@I00JhgER-`Ahh-xdiBNwIqEX z;_Uqn%DBv#wj_a~8P2CN zhNc6z7_-E9+2IYoc~Pco+KYXlYr&keZloXITslpBGhA%PDsYJDGBV%JV@eJJ)ArfF zR$T*0|Idg=B;SFRR8u<*g$K65Ot}neIV68lKQ26RB0k*%B)zbwZy_S6hC#=tZ51>p zXBE~BJXSDV%^OIbrt(JA_5X1J67%2IkKvWpmrvCVnxk29Wi|Yf9u-2 zqc!zvYNU=ieC@rsgT>kdNv5vhvoRpg&`}sR-TPx6*oE9y(=Ul(h|N*HO}CU`Jvfc+ zTT5B_*F8&E>YPAWVA2T@uH1O{#^8p#yp66$vni&*IM|_;yWRyHchTqMrvwF}Bi1e0 zzj@n+^1dNs;f1xwLfui*YhVsLZR+ywv}WAP>o=NVw%GetKU(=_tLJ;81il}>;mzHZ zp*NSDaxCa`Q~g<}U6Cvcwy@axR&(G6lA2Yr;JKUPnu_?+ik!C=mR=2B4Kea7i-iAr z?}hq|kJ*xZJGE>zIY9q$1B-f?UY~%tc;R0)HFagFXiD8mb7s4LUjERdaP-P-yKHMN zPc+NY1T9`3tC#6hdQ~SMk+Qvgy0w+1+!Zc;i!A$J+ho=*n(@yP{Z(dNxpYRV;tf_> zq`mpXd6U<5FSW&*%hc5tFVh)cwrrI>uK5$?<08A6$p1g8tqN7W>r?OLUGLF!&{N%> z7+hqDsX%p0)a8#gmMqb!KhxzHBhX$}F|{L0iH4LI2>r4pm|{k{YdbS5el??P)~zh` zMd-tv>T*Of09*LEuqeh?;mW}*l>%kns%Xc0;tMjJP-H7}rwQ4>PwJ}SB`UOU32HHd zdc-9N_Rd(_|3x^b-~ZXCca!M{e5lgV-B<~9pBT>DrIuj!K?32Qg?j9M%2D{XNHOUE za-2nK?SC|LHLvIH8olA6Cn0u-WUU8e|dOrOekw2*G5VY(YewCNecX;OJGY`SeZE6a$+mY)>^DD3(>p;PC?rLlWq4 z3p{PQU<_S#U4^l*juxN+<0L_b-3f%Mgu5belza3i4M#m|STV7nir#EGTnf|>L5G~X zfeVn;WUlg}+*=Xou$|Fv;Q0@u7=P~6v_!H>&#ggr7x1a+XKEA2^FA9yF5wIg30bpXNS$L_JS%TM4&(Ffvoaa`;VfChfIIH>QSpH=6!PQ$JUFe|JYK=cgcATHkWI+zh`Eqr->Uhq0P7r0FmVF>V5mH8yez`YqAve( zR@TJf>}d-#Z3BbNtQ^U8q3s8?!9)&&QV>mh+d*C?G5$pezzsEr|aFwM0xizoHx z>7;0>v2yM8+Cj!ahJpgV7y20*X~sXqg>#-2;}T)8VPNHWv3?~I%*zD+M_H9b?^L>| zD!zf4dgYzFOl>+K2%57ZH3urgK-D*?a?-I-y}aMFCOq|XopIV1L$Ng7#WhzuINK1< zchfIUA4sm>lr~s}tqg54-8X9nV8~D+3h+`$mPw2tS9-C7b4Wl*AUdQTvJ+^+w+{pE zaZ@$nC-%a$>E1Ru;UN4Nx31w$(;k160V`4N&r%y+!^`tZIVZy&w)UDp;Ijj3R+x+Jd4`6iJxwG!SN} zGU^s%$UPh(M*Y2;QMmko&_a`wwaKCvR!{(r;CBgG5yBUsDJO`z9J-cO1wV-aJIG@f za;>j^RwsXUSV$4U8#HQdG>a3NpRiFeeHC(?8RCcH2!&Y=%MC*ExtEEUNw*eL+A^@e zx-eLofu3*!dj$~;EJG2PpoWJ7l`iQtPw)Ek_r0#V41zk3$H?l$j1quTnD#Vq@AX)? z5@qqdAdSKyK$1tvF>Dj40HB3Jq&TCUIT`)eB#Uu+359GNnw|cJbNe^vJ=>iJP${rwg$ti%e0u;UVrsLrHOtg#A4Hp zUc%EXrkRNTM#2Kek!ic2Rq4e!i)0cZ1IGl;HMC&!Fd;__BOqV&derGG!8nMjf|cOd zjhe7l^Ec|A*&lsgXdD_l(yUf;_oz7Xy0b@-gzhKFvrEpzE z4OXJnL>du5tKF*=7mMd7GH2apLoqk9$8$b??$1enPW%f439ZP;fBybbYG#`vQw{s`aKv*5sWIc)JLai;R6l1vcV>P%S{41r%lUQePz`N> z5z;fJ%aJZ~)G|LSm{)bpB~N?Kjd*UzoIUs;#j#=I0O8jm{7?Ev)7Wo2KkUB!OXr(M z;k)XKctD(#f7M>N+H{@Kj!#&4mHIldCdbPR*SZy&V6;?8U@wf$29r zYOcMd4Qc1Snk&&o->B5YaDc7Iiw{bV#P+nzCSix?cWg&sU30^{%OmaGAd``8YQJn+4YB(G!ibsQ~HW^yNaZS1Ry6$a9&*iT9N7Hu>ivDCi`+Vulg^?N4 z&ewK-_;o&i<5@rQPRm^WXzPk4YxTqQ-37TDmN^!vE_mk+`6~uh2L!|Fy$MCd-Z?>i z%|5Ueu&wjs9)zui6dt^lHCoi5HnKp`c6NnTX-LwpbC((`hx_by#&V5?TaIk+@ct9Ke4_1r zr!(9lJJr8s;g?iN{0|ysUat_A#8tILwa7PLJp&_*ly! z<<`=g+M+0uT-4RJp9QpmDk0V`cedwmt-m@g z?S&r$Mjqj(wp($uPkn(H*m{N7=$f&gH)8BOKEBn4AIV2ooYGhx1|psFc%o4nqUCrb zQup&1{5lv{8blv9Q2l6uwz%f1mL+7<)#zcqZKLu zKL3X|2NGMa7%2>#*Cm}bsj1E1!V=!R5SgEgJl`wNFcg!J?Rv55aIn~MST$#hnQsd; zMEL0L{UBf%f|SZ()dAsfN^n%nGo$2fNua#_Kz4(ntFe=f+Q{m;L3KgtS0s39g--Oh zkvgYMs*1N=4wM8YefG@R%HGs zdVclP$??k{rtKMf-e}N!QQIV)6Dn`BjC%L_?VI$f_tkstj;Wh} z_Fl%A^M5#VQ(g19)2}D*EJbLg9(+Q@ut81l(oJMMUZ(b$+TuK2@tND#lnGtGU70EHobKgz{3l~? z>;e4%uc+guOQ9hQ4I5N!H057d|7g(R_T50w-)_%NB>(5LjNh-#rkQ2s-U3&?!(`@0 zQMrQ?XGCf!47Ur-H&MiQXTBMq-;ptzJiEU`b=b4+_nq4g4QSMatcTI8i)_O{$~t2| z#c3DUdpb*pxpVPzs`_`wJLQ)}n%C6TnZOJt@1CelvxR+zLIVpoHC1C)p*NQ9$i+KH zmXFWX&)XvW|M6BZaye7CTy4c*Y4^Pf(FKWDWPWz#OTH85>YcRUB>tU$> z8Tk>Q*67S7>>qI69IqKo(2P3y`_8S?dpzr$|1;=$zW#UDu2c1YjQp`Z(`B}a0&8Hvo=UwDSTz4Yt!RpTel9i zVt`XFcTY@2BTEq+6QW8TKGPucsA`wroj!}RALGcuBavKK&-w0I$%Ru6U?Yj>1W89< ztYn+UiW+xb!$dfx`pICoNg_E;Dw{fVI%^4>OmrVP1Ff$+&sZ174{Hq~H=gJL!NasY zZABB@&@n4E9IBDRp)rLW#{WRJQF&Ujh$sBYha_v1WjWp5p;}ude#xYLz=*%107UT! zf4+#1d!+-D`VC1qwP|z88qL_NU6WVP`XbJ!);9C zAfu14mRA0=`#LPm_Tv86H}RHnm(uoNjMZ+VBL-*;ksg9AaFnyM97F^&y&I!smmOCBTCL^K~{Nn6WrDNcTO=p6qu*PaT~J1Uh9B zDD$%ok4FT#%ZWFYs`IiflK-UjN{swNj9hCs?e~^K39nEpD+>yi5(0plC&4_lY!bX3 z)FF!SRMVweFNJBQOA*=z6u-Zz+#My%d&xQL25y6?-rvI;mVWxTWlIh&xJLO~*O=k8 z&uutS=X2k14}0agCgwAWYVLQE6erike$r76=K?zPX?1qwMGbsAFJmpBl#7FkssTVg?S7x+`IHZ12Q(=D*@#y|Zw#Qp+7r?E^gg zHdK5y;+Omnd~oRyONAqmG;kJ+V}ru>H1r!Hzb6(avVZdWFM?VSmPOTyMBzrf2au`j zsliD)xR<_Hvq0o9@@AC-pU~>m3PUdt@GygLnNEr#qUo1E8kA z8JTD%iSR)YBj3Sd6YI;*DyjnAd3E}7?De6VXEnBJihA8nn#?~$c%R9sSB<>>XZ(P- zDqqpKv=oKg;uUUz9T$5iQf9Kd=J$(coTu3{<()I*&v(Ww5{7UqGjDR7tlU%x?!yK) z*OrjT5j!D#5~UUZ^B@I)7#tkcJB6++)ea*&71X^ zua5|wEvT%y*>Olr^%6fmY^@Qk6jp>=9!(uu-l@a$;KhQVhxmj@;Ru z`RmkV=Cn!XnUT4UdiAZ8K7hAslE0;jz3J?;?U6X#yK~D$^XZvOyZ+^nu{HCz+6=pE zi}bus4fxmfwVyGs6<8%Z*ZJvSvYy$J3wHvuqm@Ux>gJW1bNfVh56=4?H?x0g_#*4m z^Orur6L2rXa-T3VI26`q0$!Wl3+_zk)SPa{AJ=B{W*aQ649H*0|Ipxya2C+QEoAfPWvh*|^nWuRrV|EFOaL z25r3=wmOV)T+(n5;Vh?A{^x65KU}%i38i@|@33D&bSBch3w@(%%$&=o`(H76Froy$ zz$Z>-y|{$7(Y*L`f)A0?z9pwScP^}ib4n-OaWtMXZaL>6aUXFnTO7gp4W~dz_q|2F zc_5h3N0Sz9RO-v5l;@0pcq4DzIHVv$oZ~fBwMz@c{r!PaLIsNwZv?Z?F5P@La1Wxq zme;-4J{Cp#TO&FnfYBKl^+mWcl5r(@*1|{i;459enZNpc1}2nYoyL?Z+cE1(F1 z;)FuLC|VXsbYil^}t< z>xsYbKkui#ZEvd~=bY#4VePfo;#GT-RlpH#WC+kSb~9CZyD0Nh0w9TBJr{A#8xs-Z z^QGc&$*aw{TnHdm?e9nmgy|< z)g-L@=bLJ}%n^{%hCzlkJ$K|XvOsMKe<`@JD8`5Um+DZenFf~64$~PQTwTs3MH^Gn z&5)$f#}?f*37gAYs-0FT-K|A^W8e?{kzn85HCFuo`MXOZs+>VV!cla%1rvz_a$p3Pm9-ibEzZb?1{ktG{+X&;L(=Tw!+{a_ANWJKJRdKi9;2;cPc}=}^02&<`!9F!>$s^=5nFj& z+UKj>{cv0}U!%eaO(-FkCK269@Cyw#?pqj6PXVK&8w~h1eDC#F-b@~yToDgHN(J!_~&D}}olOEe?PcG!<>UBuRx|DyzvIsf#( z5rfmk|0bJP)}5CmU`}oHtlrB&)i+wz`0cbmaP(M}gni-s>DN;nuH`GcnE>v8?Phud zI8er$=R2gF@EMpdcjSsHr7r|ChvfCcGmP&VI7@tvX=^NoRYohg1-^^Sj8b->l4iX2 zxY`TPHdoW&kmVs4{%zh|o@-{DyFU^IAobg|j)lYRNliP=8+GrNd1hRFJJ|luc}vkR z=cny0r$mP1f3K02z!LGY zwXWGQ#`93^)8Mo+)Pk2JvtVf3_01)DwdtCJTIAhA=zsAez7-#w(%SS2?*8ik;{pK7 zK$!p{P?--Ed9j*@*kOZn@-srIZAM4=83>E(PC85cWk<0@9_ZgZb`+uaR+Dg(pQ*&C zc*m!ZjuGK(o+kQ%-Q`1Nu}sFgG8V0HcurdmvdwG6$!y+izk`Eo+oMtPpytVwq^SY| zf?AY$Z*Eup2r4SSkdll167ptpP>EZEXx~;IT?1)()gMfNM?iXgcOlmPyNSbQ$4C1m z@MhKADq$_5%!{FPM@9|4LoFEt$fu^TS+bcL_}32MLf;`G0+;5r@3n{UHx+8|hM6~D z@?E~h71I&DJP_EjJOEYMJdW>JVR!RD4MqZ>RE0rf7WFEXy0~U{@2y_*9T*x?bndi- zUF-zR)ZC4D8IH?Kb#;bm)XAv(Fnn-)kFJQM1+sQP@)BtDl!uZ?9`8|-?#d!!%XQ*t zq7Pjfk1~76Crk_$rGJBpJ$k6-3h`0S3jd;XYXfiNQJ+n z=11c)j7?(;b6gKC%iiB%_AnW$@Nil9uQyl+OU0Y13#pqK`=1@Qh%NEFw#*O!sKIqH z(kv{=IFSJIcq<})Bw!HHG`DUV5jSL^3+b?$1i;^M7}9mIKjOsgp;|{>VJ9GVOK^C~ z5|2PX9~A(V5`!Y(mv}S)eMZobCOr#+_ef@eCYE*fk$Z*a3z>t*ZfF}>+tyXJHMyay z%7(I}HqyLI_OXb^+wJ-sKoAJ>X}Gj#_=fz!8Z5hG4Go^?Sy2^iBj2q^{CQVIa7>_X z($pWwCSIC+28&& z4&l3-JK!YiOL*=jDU-D~x1zGzKCtEdSeQV3Uv__{FO}1OJl5hkJql{CSjX;YZ{GtC z(EMvU+b(RcQ`Rc&>Lg}yW7At?Qml7tGJLmj0dM&$G9b1Ja&Ah zF=#MG(Wi{}Rn7@&lh4AqP7k5=UavFVLmUtL>JB5{l+JmGqL-L|Z}BAqGzk-)B$7-(X{ zm@4*1JbZE-jq(3r??~{{#rYS3dy`)a#d0uL3js_(xe)si8N1SUVc&S6Q+fxDae}ES zwyo`4<-lAwLj6m$)|R?3pN;nkg(ay4?N-s$UqXd_$Cz zz$~KII4xkTvb4@8VvWc+_~8GF)=Gi;0MM@CF@5sVlSCMqCh(XK$G1W_F9YJJ42&bO zQu?!cN~bD(`-j*Y>YTTw=&%AD+KljtCMy^w_Jr{Zq$)ora*&k%m(DLBum~)zJ9Q~K z{t)#`=+dhkZI^7O>A$5JT95)Zp<^e*ye%wi&bEr`lOWC-Irwj>&660ph zh@`a?d?#`?cxWLN#YdA)h4d5+DY{u!U_#SfunJCaiRde)aN|Ne*|i+Zl0V8q8_zZ# zApkg!c`{ftFCALxI;pxEx#^kv7z)wTuVZS~`DeqU4%-1(qsb=avfJaxiUsTO8nKR4 z)v{s8LE0g!8kaN;;4Io`=v2OFej!KZoFmct{Xm)D?QOz_N6JofzA(JDMCYL3=c&oc z&tGPhZ@xkQB2gpRQ5*uHr1rcHet5yoU$eA z(q?vW=84^|o>>+2GW(a0|9W`u8>hQSAo2o=#8Ap+Dbr#l?A^ zNpKA?l3#czomJZwi!(3dK9*k(g}dZ+%yi4dXvoSNgVRha9$|u3wnh4bWQD;H5c=)* zfqvLgiE@6`I=-Y-UF@Njim#@T9)h%kjV;}6 zTau&h+Tl12WchrH5VSaqHNfl{dPuhKLShm`;eL}?UEgL-<9*gESY0xy8aE zz(IZ-YoNxh)oD52dQ{8x^%r}2XYa+fm0je2nIH<~U)p@9CGub}4-;$7pDZU$n=v)i zw1fAh-TfbmrKZLI8p;+#6ry=q{C(t;0b(LH2Y)PH$cpTe&5SB(Zpx<$qnX!FPiqy= zZhMijaZ-+)iqKhOHj-D1C-76>tiA~k`EkKO&`{-cM1SXv>03RoPCDnCS(D=|3XRpw zWg@d*G)uA`&=E{TNXvuXb7G%7jddAadk$nbAOR`oC0b+G>;?j+Qz{24xfAE5KXV5* z6(;DKRnMO<6FOwY8Yj$RL-kRpLcK|slJ~*>O0mM_s*CV zEAAPRpYauW#p_(PcN}6lb?JTU4+dxbMgDabpyc-@;(;OSxcAB-N4I~|l(HV>&c5+* zwz~F(R7p4+E)X?sFO7^rxE@K#;CuD9uMzvW{icHZZ}Qa?R|N0-$LzS>-1^%7@#u!9 z^pL@ebZKxeH1jL*O0T2U;%BO7#O`Q%NpH}!S!g_14*V~(HXEAX-m;6kt};(n6P`eo z`PmL(!b{^qOZm>Yx7+)Atm_N}AM=&|al`rCIfB>2%5TmEpV7EbTb*;B)_1VkYil57 z9^lmx%pU!A&igXIAR9sy+B*+;3WqL2hEP@_qf5U-hqsgExI@@_6UwUDS~fIFYEFkzuh^`2^i_VEG_m9K)^^u$n6g*_a}%fx?H?{_yYelajozk|kjjc*aS(=S$17 zbstKc4S*-mzNbe?O@b?63k;w&6~h4!t)}j-22Rmt<~Pt>RKwJ3aKIlS0aQGe5y8O@ zUlwhXte`3$8x}rDLvw9KEdo&*NE_8H5TCCS0IN2mrc`5)&`JPz-)JB{K$nnVEQsR$ z{@23xu1KI%WYSsZeC0-xw{VH~t&-m}a&FwP-u0bvR_9`4V?bfz6&ReLBG$l{Es6(v zh8o+1`Y;+O2C~r{sxvGxk7-k!-j|f672wkeW@3nW0p?zS;)WX|ql+L>Qlb;nsSE7? z(GFqr9$_~mbP4tWV8wBZEd6E9l~PBB5yN6}#Q>K00hwUX29zH$-3|M5s6NU(Q&H!W znK$;GZS$`rk*8lC?S}!_u@qEIc%C;2OT2T0n|RZ8$y#DD{aZjM6GcmF6O zENxT6nctwB%3ON9HEXb(KM2$S@yH5mh# zRkJHZ9>5(tK;qHOy_nGwyj$CKaz)~=fUtT$=T@}{MtomBl3};$U}gBD25`!q^RLCBP^%CoHchjBI4aLdS`cA zbc^?#3}#C8*{vo{)Sf@nboJEc#?F%e9U*@b+j(E<)i)j;XJN?%4{>{DNe%w^h zz!Ud>j3YlTcDPhuW@Jra(U)d`vk~G_W8&n^FyXt6P4`dVpZwkK<1Zwxn-<$g-Q%4g zLyca2DyU*T57ZQGW@DV7v0C}Li5dH1#h1km8IG(fNq9Abcc!^f4L3QrvmwEDyB%9O zF}-Kz9d~ez{3n4ln)BH_UJw8W_MWn}jKvl}^x z^4sq>BR~r)__Jo-27SC4D|xDz;!kaIH;&DcmTan7VTYBhou7P{y7Y!QWu@vGHggs) zr2d4Y%c@xoY6q3l4s|MU4w#|vHa`|G32o{ojV=14=ZA{|xmiTIaC+eU__fg~HMcjv z7^6i{%vF3HG-(wpUZ6LoIlK94>^D*OZ3o9-@`cwTtrj!pDC^2E#K#7K>?1U;a9Ww4 z3E~^hAc@(xRd?KMu$)vrAWbrpJG#%d?L2^1jDVn1i5V6Qo0z8Ua4|Z8EoM8x1go?F!bh4nz3D=y(2#--FrDjN9Ok* zObR)e9Ftc(UlZ7}%LRg&?iya}XcOhsYikI)1jr_M8_UFzyaS5}`i#jY0DB_WpxRsN zG>hOjJbAJJCvHjp(6JcK_urS5VU~S5YON!3PSGJUWN>sX)EowujZrj|2_v7FX5weM zG9E$td90<#ybY|SG~BIlUQR}1IKC4Bgvm@3LsFeuYl@?e@n^aZ$Muo*l8Mk1uqPZC zYI`?k3#fmo5G!z*L-7eew*_zp8JIGdnFX8;&khIj*$w;;&6*T#4PK#;hEHx{m0_9K z&gWPPGD{MP+opMvvL^f<74#9$TNMZz^83wTV&7rK00l+{<3L+MbWGA>IW_Qn?a)fJ$~@{(YZnosFPcjo$Z zHtz4Os4La034l(jZRa^?E80cS&)h}}Hv!28Ny^xXY(MD@#gglLz zPDXw>GpcZ3N&Bj3uc9jVX=^ z&B)0h|BI2W5-$K~sm)#`;)RTroSWmWAe_VDo@bBQz8(m85*JbQvrz3k;NXigt(P)sBMSxNmoB;kokvO*LL)} z*aS+&eW4sW=Yr%;`<~J}$qRn!t#)O&cH<A|Ul)91;AhAQF=guBT6%`$K7V4B>8J$PJjxs8vr*?mGgk@G9|C7DHKv$R z!PfZ_4?bO**_>*EyKrgpe;$hgg z3uRmS;Dw9Uc@w9VG2@fP6W){8f+jXjuJ9=F85>v@QRykUisd6$RC<4Fy3JDrDBmd? zBR<~g??yfP-1Wgfd*uV<*26NVZ~-Q*;Yj>2W#XBnT+6Xk^o@$|$BKrfdxFNp_??op z>Jz-!XC;j-R?zvO2Ci~fsL4P7lnv_6`+od#R74iE+B}js`6VP|=j5bna2_QsEpp}{ z8H~mbj!v@TUKlHN19h;SL-upBNz7Kk7E}Zi8)@&sOH9u=mWVt3&~hkXW<03tNv-?U zr*5LXX{GZIFn$oNI2MeGNX4U|u76bD*7Rh)U7TY3GfSn~OonpEcPt~W;l}ueB|RtY z)jMydoF|6?Q4VL33^c3;yvDT0PLFP!6bfW>C)3=n#GL-U)@5U)*r>@%5)M4bODmsk z0*(pZVS5u^rgXum(k*VLC(em0ai8AbH@$)Xb?|Hr;LG{sA!CluQ!v1QS%;aZ;USuX z4L<(3^7kOg&AJbU<0BIaX6PdgQ)+moac!5{&%L&kriShv$x)7NVRN!x3g;}Q;q0G6 zkn7UBI#)lcjP?AmD~yz?ZLsLxup_?rIjdb1zB*fj5LUdGuZM?B=VXKB;ONYw3F&!7 zW6!Jp>6HFf_ZdUw$)ZGSkGxuu@?7I0FcWiiqalD12J zr#S&wUHC_PR;T3hQ`EsY)GD4KVmx{_N+|x7dhYojz$F5&gR^GvSQ;t}Rk=j9V7S?g z4EDeK=W_jKD^7*Fr`8Z@pK+kD+{uP?_f-{K z#K2H(2(4LT3t$}`9qk%d2Ihg)e)y%;_y@*r1C=MY^cXj`;-ZpdBGO_AxY1 zLwdn?Bp4X~YB~iNd_#OTA(K*3Xb^}>1H0$OwhMT-{G+f+;ItqT5<`u9@qxW3*<`b| zvKwqmv_#Z=__J82!pTAcQS$_h9}&%Suw8W~E2E=(2i7pYj)wTN!wzHv?e(sx#!U^3 z{vPsoXaifS8j4jZwN@Muq40i1TVsbQnu>fA<%e<04(57#&D;x}9o-~|yKQwz+u7$M z47)($qXktP90L%=0pENFmd~+4#B$lMc%cxOH{x+~RQkr~Bnib{)x{CLHyqsCglF~D z;GO2Kv5=;hvR+*bwZqQbxS?UZFx?CiY`}<^M{AlR_xA4YUB?(GlLhm?WX~opkg9@* zm0eqXlQ05Yk>Z^?!g2=VH|1yO0FcRs`oew$Z49z-AgyDXUXW9#>Hz!Fq{`K~=_o$5 z7ErI2i1n-;Fg*Q+X83)4ymWsCb7i>hrTlH-p*3xh&$UtuEDh^En$0Zi|9E_6S+VqB zag)wNc@@FsbS%4BWh{B~ljbSzz$y8+g1?Jjoj*MtAlsRkXyd>f8m%PbZp0|9u|7+7 zgZp^TX@^l|dy?JAVnV=Xo)*y#dnw?cJ<^I}K(HzC~j_agPPf%J-jf3w)=qxMvvaTd#He1HEQs zBungoG6hv89KYMM%$?ObbL`{|6LHo-$|)r!t~KH#Gf+qS!twR=3r@C{>tp#~_oEqf z%hSEoiI3LoS6EJm&HTh2K0og0HXhAh-k@=i5n9dTU2;7!z`6$D+;oMHI)m}QWbGtp zm+zA-KVrswXlCr`_&;tF#Y5kUR<+pg2uFj7l;{umuv9j&H+h?u1qsQ+GacNXfYa|R zU+s-+Ii8^7a>4ba_3G-~OaCm z@uun(CNZG=p+fAX?K#lg^HtH8)8IyV-ZWO=&3U-WHUX1}sh=~MT9Zk$V{n$D6+ z)X;3rtrvPtmgS$-GB{I)Ns>CnveSr)io75N2OXt@y*L`Qq zq_M_`EgG6DL^9HOMz4uj99U?*frvtB{S$Am0FYiDz2;&cXAqVlJW3?bB`a3skUAPyRth~uP^0yY5KD7$@C zA_u&uN#MHzB27-$AUjkH+8QT{4$f_f4A>X3$|~~@;osAQ=-{1Ok@l`A0``Za1SK(P zTTua_ffY9AY!RwZnl(Vu@+_y=`BRo?f@qrnF6X>UYaJIz2>&_X_JV{Cr*H9SWN0o)*zGG>O za2XNdaPJ9EfuQg7(%ywJsR;60yqdaKSV!$-@1kBZ%*J{E8N%WlgD0Z>tnIR?F5ZXt zC7y#cm5?HWGEDcDVVm>e`1Sd@Ng+<_RPc#vsxu5m+#!YqnURuXnw(~aM=&pq9YNE?RuZCo43GCM&40%|MkiT(+DTsmP z1l=kJOfN?JP$~Mc<%vRE#$;z*9tFxF5o6QB&8d1k4gy3IH7JcA8rbP_15@g5XO|eji6FO%Tx?loPRq+@D>Yc(AZyM!ReIuw0?8t9q zN&QoYW8WB0e^K}5>$r^o((}+l zQ5KtU)|eSxj@QE2$GFSY!TcGEEnD8Nyf6Q)fBJ>|j@{%wzQOE5+rcGh0q|{ccYefQ z{G(Qf9L@Hw*9odOtGAqd<=*O~$aZf(=QfID3|^pD`f8u|4Ejd?t}(ynj7_QQ)!?rpNu+#>D` z+bz%ct;#+8#raGJ2fv+q+8+Aa>0U=;;u#L*^AdK={(i}!u)Uf7%Vu9*TxP3d;vf2> zPK$}}xIkNqZJWrmG%Db@36 z!r8f;Vo)M^Y!k5MQe$?`TWz74-gBS`#}D^C38{1)6>GRJ;g}>1x!B`h!Tu3K2Yq;b zlK>iLN-yw(k~+G(JM~^dKmtR4P{1zgksnUHt+6+5^w{`e_H*reP7 zEn<10$7Cjv!DR$$oo!fF1q}}@{DO7)l-QBD?t^n!>k_Dq9@l56OqR%^AUMWnI#k>F zsU3SK8qebRzR>VquY$7j53T~Gl?-K+>x;F;O7uXL~>|6 z`Ih3kK@Yep(vDuRqQdNKxv3!~;wF736en=xR6@8waK23LgU!!3c8<^zgs~9xVer$4 znUVP?M0olJ6bbNx6D@&AVt2NrHX{%^lQ|uqz5$f-h#`tf zEFMcm9#o32>d$#p8`wL8wDl937hJ}r3FxsvvmeqKznW2wLk&g*x%2%DJ`6M$yAVmQ zB1RFms)zn;d0_-;8K88}*f$_xMcfqWoEIZ7SO4TNX%3q_fOFLLCZf{?;}9b6h6f4L zQ-9Tou$)iX0IfqKJ3HeMR$HyD6LlStQhoGEdeO<7XAWB?2gk0q@Dp?fk4SWg^hTFe zQqQr=WuTQ-nIB5F?-xYPj5Y*+L-CjV)cXKx^8p33*`M_NApPn~>N%==~X0#+k@J>mRdK zZ0}e6q&V&VZjJnp)7Ol*%k10s3U&5@`T1;Yt#rD7YLgVuP8ah>v#_eeMeDNomjrO4q**eUVWN*9xBNmkd{7*0%PW z<&7y;>%MZ}sMU?yah;U1%8x?DDZ%(tsn>#l&Ybj)+V-1ly6%4V0!96efqcb}K|RG& zKU)qAy1%)>>M!+d$}UOl6dBB^;nkO@cZM`AvFig-GEPS@+ArTw_aW$Ga;)Aw-sYti z3(0$lP_jevr_6(5Z(gu&-dMZY%&>C$lw2rKd@a8n^zn)Gh^6&WiK8~AU~^?dJVJhkA{Yi~CMQ?-9WG)M~Y4UmC_9 zGck%h?mrXK9OX>q&=WoTHm|$nZP@}-uzRvg8H%$|>|h4F>|zXw?W+n33i7ibxC;#x zxuZkwlh*{rLGQ%ulq;c^B0{-*QfaY%Co`i zG>hPmFIZ;n z5)MP5$%O=R;=Pg!6LGxKKe7uT+TGC7v?Ezs0z*|QHZ`ce6snV-RE%!A3MyLgx}!Iw zJRQ3~m-&SsR-61(O*Om#2}T;XZjIprc#slRBz)zG)5M7iKycUCH~mg_c6RY^Q?@}= zi|m@iB-^Doh7D`YEk4rthpg_U+i^rC#B$W}ZNK(>v>3iG# z?P30ZV5gVIgHJEXMA|Oj<#TF4K)jNn3z(F6Or3ivVLdziNf_w8sv&2IZg6~xOWiyyB#^-*6utcPX@ezKve175*@FKRx8cn|A4irodl2q_VvD9#^-Dz&1`5io-b$st${uhDzb_?9c z0+h=HZ*Rs~aNnE7IR@F7?2ZKI42PGbnC(cdsEc+Bb9QKU+=z$9!=y#r^QVdpbz`ku zmvJxmbMKag9OIdpky5EmQl*xMPJ|li0=0?qa09cS!|Rl%1gSyeYvSf}U&nAi3p&BH ztz1NT1-T1coePz|%+pO@F<>pa$(1~n4%bcTOv-%~tPk3i3E@Rl6RdECpjxWIP>&W^ zFZugbgyPT9p$WyWm6E5*|5l2R#6$CNuXH(io+v&)5(EzhA|50JjoB%_pBWvU zajP4$o?*B>=-dFEmLw>*n?nYP&VumqnpTqslS>gAxjNjp{mKW5A1i09Cru*Nn&!7B zb?oI|Jdz+9#j0iu!Vz%*!2N{=3d$lAg_~7|xMP-Q{V5`kv|58IPGixC$M4*}xIwXIUuskpxDaknK}DhQWQo zYlic2*^F%{f71WqUF`Izd>i(86}!h0Az1hKHV6g?9SFya%FpHdXvd(j#*xO^dg~xufoYdX@$D6cFH7$9@?Lv+El6cD zJ4Vc4g!DllSI$i+9zU<#68pq*@!=s^xVBWi`AHYB)%DqxbVw_WztAgU`P>Pgq#r~s{0)fl!BAk^2`*7vLIZ%7-G zR18_{5ojeMz=qfRW&`1{2kvh_mK@8M>7$!%}o9GQ=%ZJ8N-A+%KzNQl$U5YORfJ@QM!BzB{ z!w$FQ=Mp_G>LgjgWDwpdo+PiM0zq>W2+!p$%hxq`Co^ujGTWY@l%Bnu;#7LkPx?E# z0gyiXeX~$VEDRZ4ZMvjqxWqfbfT22(!`03-&w?O=|I*SsLfr+7*OB;6*jwFQ5()t> zxPY|n1^kGX*&KPiWy{XQ7W^U*b}JE&$v5+3e8q9%cH4Qmy&qKSA+X+M5CSDN{}}?{g0FTt5)vn(a-BIlt6JF{n({W2j(Ap zWTu@j#4T`6yJqILek@J!{%~x!ozja8S2xtrP4YbceicH4lqcH%AMU^x@l?HGoKfA! zfVj`NBemQM=atQN!-4c{$$#3Dn6A~$!husNhpzk~A4)pf0 z7*ksCLGhPx9Zl3`(zfP#{2V^>KTJE6fAq|x0#=hoj7yE#YAFHpQ+G7K01VK;-eK|g zwsJ_0*}Hj5{zIX*Po1R`%mSxiP74NTxF73t(=GSBG%=Oq_GD`ApP+74M=D4%NSYC)jZbc^twd6V#VFR$$; zOjiIoM5i3l(*K}OMNYzNFiOA!{HBOQ9LdMS*|Zs+#1KtxDp}?c209ID z%`IUP5$vb)(xG|{b1Y-oE|m@}ZK%Ria-dW!1gc|lbk5IkYQ}!9p9}GLgQ-UhBrT6f zM4qHsL9tz(HrIu`p1BhrUR7UcLjBe|k=4;v!s2tr;enX=HScn~eq~6E1AMAf#$tEZ zGhoPmTBS`+uHX{v5k07fk&U?=LH>7Y{J z#6Tp`Q66}ZRtQKHv>qA!bkZN-_5-mSzNVfMfF_AJ&a~XjhIHKxVpF#T&>hMw280Ss z5Ee6gehj|e2&vJqIl0#0sRT4R?09(;Cx*HmN>6Zty;BPajzXRcSFkOc>>Zi1uQc*!Q8<(me~$!K+fBJ1EJpDPX=*Q~z5*-unz~j>0CM(r zphE?_0I&(?S8l7=tcu(3^jnu~PbBf3!N=9803wtlJRX8Mq&BIPldhS(Dk+2HWjNQU zgi${gjBwN2+@U_!qLr2QfR==V->jlPqnx3;XYUr~IUcM0&4YTLu(`dt{ZxIBa$ziFYxEVx z{r@H@E*HNK>z#}A!Q}rYq3^8M%DX21bHJc!ZA-tRZd4qj{EM5*eHS$Om7Df#l_wG* zl93l4e?aCN$f#ceYc{qBEXMk0&U1@`rhf_QX%)P`@z^-F@Ik6o5hKzs0RS@Hl=dCy zNH7~)7D$tqTFN!uC#_@El#=4foY+a}6j8=AZ>($^MjINK#sA_8=g0e?B_mM3a*@~d2JC`olLBP|zSr6C(5$Zw|IOHr#$>h{b zGwjg0q0=}z>H8Ulym*u?6Mv-dqEVW>ggP&4k)9o0g~N>cv9F*-Nz%&u;9R`oFGw4U=r z?!j^oFUeuTm>2&U$*Xe08=A8V^U6%~l_+Rf_fh?;6mkd`b95190|R~_C1o%nMtO*< zC*qgi>Q6i%&oH&4lpr`jsyns_n`D>}gTm79gfcB1b()qL8U=I_NH+k~$nLv?>``LJ z?K8WQrS$B`!zuty`YR?53;;G=RgmL$g#R?83N>pxGkNjgc8ESl!$ELJeKmFVH^v!R@F+~v% z`de>(zQyXVK|Dct8EDv0QUP@N`;}hoMbss0Z$s>NYG-pW(>R)+sYe*-o?;dlZ1h?bg=eb%s71HW?`u>s*%vsXn-!iGue7N~8g zSeDfHSl|#Hi}5qPp6C)UDZ6vNv~jD@OIQuo1Ft+=3?&A921Ls^7?Ohf`$C+CN9uZm z5bbhA{?^nO0Pnyf@H0JV?KvP)Xf4NF*aVCpSlgI7wa=v_fhv;G8tH&3oC#4nf}(+^ zSL!%ZJHZNdI_`H9_(eqS2ss5bU#~D2@nIuawOc|c_oKjM+Q*J^4&r-*xx3Wq4pW_h zy+n#^XNOmjrZXlTcqhQmP9pXr~p?vVgj%epb=coJ8q+7kLe2Au$ z5!tW6e*mq4Fp&Hz;K~v{C$|<(~wWO1k>FP!CV*Tv9t1mVnl_ zR4b?DPHPrp7jv)QS^Ld33SCGaNT=jQf{#tHqKL^>&h&f)oNd&=XY902K=*k$owt`r z9~UdXtP=+*^W`Igu^XKJ`i4V^Ar66bPA-P;k|(&ue`?Q(P*+NVCLLz(j>;qCe7l*o zK7F0#Wkb$GP@Tl1f^fd(A|&o~!Y+0_7+Bue@iom|>1ZjwDUijCU+w?!FW=Z?Nu&JI zMYF+e5~C_xXTF6({LffJ<;Nq6Aj^*?#sALOU8kH!0Tm^Fb;+1%v<^4Ict7J@UeL!H z!|`H8ZBVOIY_|^Q{8)V@`oJHRPXD?1e_R0kU~D{-HBv7t`0m6z#Y5ao9uU|6R2FUN zK6$HWI<{~37poH_$Ua?awdbL9(B+}EhPcA4wY@EuuZexT+)|A6#}(!)Gn9IxrfkE3 z6q}?=#40{Mu@@?I%GCIvKzXt9e(``|>^mn}LEXUpCrwk%+1_g$HE7hI>~TC-J*2B? zm^sm~RZ)@C85wycVchl8VRvgu8k4`WW=|h+?>?{icT^N4AFjKk;jF3QbWTLPc9gt* zyu$i|dPBwQ^W!&WdShf}_yKEMzrM60;vncPlv_M|NQ7Ba^UtK~>g(oi@N)>?MHs$J znA-iCb0wswnsLr(v>FA>QuR z%zfVtE1~J^{?@PSH6T7#Ki>%~J-bzJv0Ag@EK?INxU&K9wCb}bJ4N)6izV}XebkR8 z&L{P(E@f~fC(S^32o!Z`aG?4gf+ZwXqF#tPW26V|{e?Zcp7Tpzz z)oQ)1c?2Nv3d_l`=@H&cvF_YRcsc4+>CJt-0aitcil_)h3jQwg4o2N)-EANFT@QZ9 z2Wwm|fB+{wIJAcnULj3CzOVmJ`lpjUg+rmOJsI1Iv^aR`P3bRVuz^ts+cHc-vdbY51W{=a(VtHrT0y6~^kD6331k;vm3VqcTtUJ?OeguB za5WH z6TzNHqkNY^`XVGPlbT!h37=>pg*J{&;k?be`D4%4I_{R;;W;NbF zcap7zl zlJ7+<59*WYlcxkhH6|3aR#LNIAdr|nOvK)>FHzQu(+U1gd^J{vQ9oc$I$3QwC8i^5 zrx)uQ>mW#+9v6GMQg+Fp`;*+Ur*n^NEHc=kW#fN&RU)EsVq;C!wjz+!QK<>_#Ixko zEz}QKS!D!%zRPPfeoO2{8Fnjt=m+vLVt;Sm(-daFJ0bbGF%3G|FD3gHJFUqdY60U5 zY$?@^GG*v7EO16%GqIm{(k}!gRlSUSSmRZ;B{AFEOyO=@WM2^?H2YR_kdvG0$&bp>!Gqpvm!B@AT!qwwC8`+qd1_N^=|`v)GR78c8$BNV^)$eQ{mHYvuHZ}Vjq!FtWmiw30&=)gnVZV#Vm^HcesjLpUb8!s62mXd@0>;L>;b^G}#@9Qq|~E zU`T}$QDtC3_KKzlh8G)(13eW?Di+{jDj!h6B*@82xPuiynv}Zh zm}Xh1<&k4;l4D+j|It`(Z4C}Kw8B9Al|2KH3nI8ErK5`;!XG;M<>6l^c5E6PT%JW76pxQpTRYxqTtV%5N6RvwZ3a<0 z(2=%5a4ei^gmvLkur#B{uB=cycSFb!eyonpdI+goZKZFEBK3xGi7?rQIB4j+^CD!z?@Qn(cWSL8@SsmQ1EMPMR4Z>pZ2z!m z^EsG0Q%6A5-v`m;6PScraWLGxqvu4+U(L|PW#vQoVd#hKbeC(MkeK2iTi_UGZN{>y zbk=Yg2)SQg54~86ZP?4EK1Hr0 znD8d{bOS>#@Pm78N@a~LURHV43v$08BkXE3^oU@ZlF~Ut*9=b>&n7?Jifl9c!BnK{ zLdl&|NWN-ivR|PA&BLZ1JcChKWa!R?i}wD@)kqRJ)qrKNuV#Wb5P#Hs>G!25WUE(R zKm|k7IiyJ?o7veO=8TiTpazFr_cWkxt0+;+XG00tH7&nANB##^6Lc3}uAa@X_gkui z&9tA8MhkiJ_jwtRKtQXJ_h}FMCE4L>=*HS_cgil-kzRBxsy!4U->Rw&@D#{mGFE@8 zTun!gX&ISg1Ra))ZFF9hiESnWQ`r&^Nf>*UM*<5KT|$BTq~GJ zmH%IaSDUjMT}lyyOr^J1A`Wcv72mftZ;OiRrk*e<+|eOSv26)Cr@Cz-xL?l z_L2C2P|7cXV!+$hff%kZU_4v7(e0nV zcg14zbx-VN_xBV*hCuNX_tJ#A>^j>U`<$e2g5I9+NOfWRk+IuO14%*uw#sX{qsH>W z9_6f4jYOXHHim)oti9_)`CASDK6>`Nve#E?t91KuiM+$4?3V zHe>fs2}~^eIyW#GKZI~P=c}!Mt+oKqh(oUM9$O~q#sF1XD{tZLEqNcp~r6GqIy@){7M2iKqTOU;nTj12xyj zTl+s;?sKT>^Xz%SC7}>AKPcLaKn7tn3<(VKnbZ#sP%9=8+&kGL5mJ;%O^3m?#`;#i zs+yaUx#Jg6!i zIkY84h6X5aA=m^hQk0e7%Z0@Sm^;p+{wLX$6`C``=q_7sX>BM2@&=|@QH4bVq;L2y&Z&5lQem>5yr7Ql$y zM-^1D)s77Z2VOmWDe4Y{SMZiEmOz2vH51kc(7k?$FYAhIT;r0G4s9P~F5sLDJ)Qia zAI7sgU3wuX_c}qnw$QdS(j_xs-#V7dg@PQ!t zpL*25a(u0wVB`jGg-RKr#Sl6EXdIt^e)QBz*(kBSUArn`z8RH;$3Y#*4DzyqqB6L$ z7svrHG9Fx616(MZTpm7!#B7|7W!J>c7S9e}GW!hcWH2;DJO$u%MdPfu?ULdzT(e`2 z^sew-59vv>BwZ6)4Th|aRnRrmaV#tIKwJSUTMZ&pwu~W2>q`J~p$iZ_H2rn^5Ej6m zS!5?=@NMFo)4=wy|dsrdi9TvWTa+Q|e=rPC{T0xjq7LHN{z%G9WvQf+pbh0%vbCP|q`|9{T@dB4IZdu9`-%HzYI0DZ-$RhtYTijZX>RUXrReRMUKlias;+SK;|KTdbf~MiqkB!HV=@bB{u&0||Uk0m! zl{AX%4*N<+4!R4Tv$=)y6$K4NyN%A}FzF#fKFL|e%)EHX!(f$2NkiWG>9?tq+dQAq}HAtY9Z&htrqog4EJ@_dS$j^`s zj=ro8iDsbAOtV0FRZ)L_+D`F``}Tg+dRWH!i=_1MjMyHqd>A22X9&xZp&+br>9^NMeCDjkZ8e*+q1@tcT2Lw}( zEr$zc-o}inkQ_JgwjoQ0-VIJ5K=#fohXqRYrDx)nN`{I zPH)mFD!`6U$`u{gz$52$Ui~sLHa0d(pXzNBvc=1jhz`OpbY!_Lu-^jH*(f45cN4`@cWEy|6DDG_i3qF(}uct9kGP;A1)=Op__ zxult3H$Js<38g(JO9ke^U^k$m3bKCqQ+kIGH)}cxgg}DJNi-m;Kdn$_Wm-d`d2m}Y zvIBYp{MX7awg@HLBtMHC0Xz`QrO1(xMhUJO-JaFF2k^n2twIO~Wil57MtN!yzKwPj z!%CD4JBb=9DW3tp^g=fQk)=JQ178I-=|YSel3sdYr+76Ro^w!~_I^54A*c z)Lz6$uun|vNQ5K#liIS!GZ}HdyzxjpJ){(?T|i+_ccTs<=za_t+LnjvW4TJTQclEs zUcwtC@L4ruh12(u0oJ~uuYzL|AjtWWtc@b4iN&-HSdA%T4Y&3?58AGTuEe(Q2K}X9 zm!s$

Y8!Itz+$j!kpToKiX_tD&-+4j6pTaO3P&sPt5JHwa7066fdUup_~+D~xbk z>u6u%PlusBQK7K*!@@4|3ym~rTNo?Q31y^PFi%#r0a!;Y6JxuVx(S7BLeySBE?A(6 zGC#n~v!*)L@~)F+p`Jq{8t7LN&MppX+{V3ByXRD!T!u+)Eiz57hr|ElvK0n6%cVRwruXI}vbrF@-E+LHIA++b8;ohg}3MX`_X+@#UkB z;s53vmCY$k(N6V@)8?a8*%rMwnDrE>-1X5yhAwsVXpin5>|DARBBzpbVgF*;~OC85gg%%UZC)7C64g9OhS3|Koj_VNFiT7YBZ@3T%6q z*$C}uK#984pxV_@5AZQ*&BbPBW`>HvaCT~?Y-8Y~mD9XV{>6Jy za$;@~qoPxa6<7~9q^J?w7G#e-=tYUDbnn|H6dhTb zd*n^qU3wI5rhV=5fj8<$*e-$N180lWH1%RM^|e#?u0MIQ_J4=&zO{IGB~dlL@X^ZJ zYkd{}?TUWWWx133ZHQLktGG3hbH33De^@JPSx-H)zp%D`2cI*$U9HJE(#ikX_;l>X zy8e=JssFRd&rx4Fg})vazvF$#pGanp`iZ{VY`%}%7`>9YtZO%H9k#gZRThhyMzQGj z`A6yD@tIlUQ~!>csJa10-haR!@XrGtjYwjYyTnB#A0NgXdZ5Ekkz_j}REg(2TYx{< zkedmvjn&}nSc9p#fgjD~&593fNrmgX(fhQc+1lHl*DP}co7=oT4E|3or1TQZyF5YZ zSIn@J2PS@oAhgV};ZlBFIL&v3@sh#8uf_AlVcmOiTv19W|AVMiDtQ7H8W(51^~}g= z_5ifr8br?o8~XY6Geyg;>)UrcG^^((q;yAuF=TKbd=_1Lz%Ad+EqkM)cQ`E%n7OAf zx;#vg3rc3z$Bxwn2xb*W9qhNO4`!~Tb7ePibPQHjy)Qi>Fk~&`UfNX<&-Z<-7 zcuRecl}di<_O!0z7QiCS8aC$M;@>Cy0*4rkT=we{`R!{i>1&`WKrn|$%gjfBosT?E z&T$TkF)8s8cTM<7Mak?d7K(c%gKDnwB`#B?ehh{aQ!1>UkXW;p+WtE8)g4ZK>kFL6 z)ucoZh8@hXQ-?dU8*~+(1G>t86zaqjwz#(4j%}70@upu+9V|H)IY-Z|dp9HkvBnA! zIE35>KKAWRyM4s}$<{VqAh6WM3c^>5$#k!fsD_g8?Gk_?F!A3?Yy5?Cy;%Zi$8zP04cnZG$>YUk`vz|bENWG9(G2lifrQSwAXl=77*;Xuy zOz^eWbiC_-o$;W2i@wXkws*)+P;O22+~N)kar9?2jqLB>GMSJn{*Q96*6a2bEWlEX zQCne-$Xo{vJseORNcRM7Q!j+(GSwC<=D(vY7o>aNh=QF~ykGW!bnd_-M|O9Nc&vAZ z7O*jNzS0}#HeUYc7Y1Kn(vD%g?#!%LXihy16njd)A5fg0NJ(gfLqT7LTOAbkB>Vq% z4ThpdtJR3Jh&K~BKAaZ&F@NG0FRAmC*7&g;vu|+E`@B=ix9~TqFI-OTx1$|$S(NLj zOI=SJ9!VaU{8jeZc19@69{8ABKR0VT-t~Ezv(cbY@(R46&Svhh# zc0hCLmelJTW+Eu+Yta z#PTXsIa0dPQ0O7G(li@{8x#hC(`VUPUNd(B8_iE2%`YhvoVBDZf)YXe+}sE5p;_TB zBFpjVX_=>@+4l8I`GWy|ccW**8rwz5g@T)hy=~Si;ck?d7FRMIgL)ilrax6ni@Ni&$hSK>`mVs#B7NqU9^<3k5=w02DDSS!YCfanp3=A{J3mv ze8^F8*|l}Uz{eMMwtJiA=W8Dx6PP$6$PGn4;a+2IEAlrFkVd_h*(qAslV8rKGc_)6JLyND}=p!Vc(A-K8m`H^eh!9s(~5g!|9 zb0Z8a-Q;f0zp0&D@`zbXJO9Zbe}c8iU1(s9h>oQzLp-}oC^R5i+~3k!o7RcY@a!Lb z70WW$lU60)N~tGSL&nlrxA0Kcvdn+Q-vmz_niuOkyUl!}k4EUZ`PzUK@IXLq1$=<| z+mKuTrW8Gt6CgsA)roK!NsHguFcKO2aRo@PN(9rMx$F5VnTY!X*;*^ivX`;@NT!( z;h)G+fUYUZAqieLu2SxSd`2xQo)U%wM7yQ2ttavqOlF}NhhK-zl02-1{R@OhYOybK6&go7 zNtrSjlg^AxgI<9Xa(yd*HV0;##>?*X(at;vB`wMg)L&?Zz+d_MQo)N&>RS`_sA&sy zJx9x;G5>OC*@12VhDo6UvPnRH4w9-yuH$OTnT|1mM*F;I17Z$Ilm(C}c92;|Q5VEX z(W=Y?Z(?^`-#+BJlm7kz;eBu`@O{$J`VbmL2*YF4^zD`eN+3D;8HBm8&xrRkX4S4f zI`=s=?xXygJd~jT@<&#+_5t~Q^mWizI*s@1CxMgRr=gLs5g)DF0Z zQ3crGSV{66RJ}UflLcRQLzs(^ldY6-!Q`anrqD-gwWq&Eft#Lc{?H9oBJ8&<5mw1C zPFk8N$nFX~zlm62Mis|*m+u*|Dn692^37&-;jm9scBVJV*3twWQ#*e_wqgE$n?3a} zFt>HhA(S{QCSm0dNF`a(AgoFtaKmfXM460$eu4jj4yD?CbBIWWJZ2!ZQ2SGNN{$b^ zQ_o6{1D(C*uc|!~0c(wm^{VxwrVT}><^OZ#_kL#bvi!^!Ybu{?@bD8@c5dQ-rRU`$ za&zs-XEoUlxz79wdq}6CIJM^!TZIwxuKok18>yG^BLZ$+sp^+v4?+k?XqV75iVvOWo^3-v$kOgUGlH; zvW1j|VZ}c7Yb>TpCnX;haz6h+qm#eYm!5{-2-j{t+M+PqsFKaSN-C7(tdr3 zG*BWGX_Y*xpUF8;;uB?Zt4vTa@->Fh`k0hnbTb~dcAau#2{4UOgg0cAC=S|A7(|Nx zRVKjexY{Sm3GIl7RbC-bS4a&bav-swpmP^i5C&D(VRWK!BhzOENy|$V@0db{b-Q%~ z=L~d!QXO}gacgu5`wzr6E*&xzor^*9zC&A7YmBoHni8J8t2>#EDgFCiMgjTpiC*V7 z)a!P%M0;b}F-U~#nIzz^+hGEjSe0Zr?{CC?@evtk=$FTtXn~b3w z5H;Vq&SqNHKGfpc#U>ZkJAK_t5W2ZGswu_&YUY9WBW0TT!Y6ifIxLxPv~#mmV`a`V zA@B2~v{K$$BCwTbDja(IKkZ-%V2r76c6Hftl<$u_cSB?jR)l-jk?>Y%*ycTzqF-N9 zGWk=!bVBj4THIMO%T@;%&|q0e-?B>`H{&kd#vPtbF-(LaPB}oyl>rYheK-X2yfr{)CTC``l?=OxxC8cZ!BQw=A zq3c!G!`YM!f7pa?N>VmZMDqT0#(J_{F;eze5q<4@u^vM$6MSpboY*T)M9Fp_fXSA z_!~q+5SvcZxRjj7!HGBMHM2n+$J)nU63%ay?$PL+RZ*ks>oc?jDKCd4ycz^$v+fMA zl+ypSAMh7<>@@2?nrPMk^&Fu<{oDVtaJf_g!_1=8CgS}7TH9Hh z^u7u*qot-lvvSl(_Xm|9j3}kv6V6TxCpkHXxm+1>u_1JaYzdh?zXE{{;x$sny7<0D z%Mu-$UElkZt}j}y;Pg=Stk6s0yAVV2y`9^UWV`^@)2pJua%CV}#gN{ow-t_XMC%GC zbualn*sww*A{ZnBpB(|=tk$ZFZKTy8Se%Fdmg2P$#NmOGPeh*!vvZuXZez@Cax4ZR zw2Fvw5pO*>ct)9M80V4l8v0{T|J*OWx(l zUqM-c&NE*7>g|!aDp7){$4tr9xo4X_if9}9QT~wkT9ta3)Wo+D#&;%~(+=6J_mB2D zK{VOs+c^ySHX+XyVrAauG}_^%pc_1CvkJzoKxvTw08bll$Cw7QYjHee6WOTH`cti#?U#%FME>JQa$l-;PY+9S_Jt1i_g*qnh!fR@Wtj)>2D{iF2V_)KuW^sQ^*C_2$1GYEbEHrQ%#8m19W`gD@C z8pegLpZ}T>G`$H7$ zVnOh{MS`t~NrjfMH-mjL<9}yjM>G{S?2$>irtCkq@=>PgVys!=9R;pS{`=*H0tO0- z)n7oR4?D+e4sK|eK0o!Z${96QS9q*mPq+WS+@aW70gB6!2viJS%a7j*Srl||i1o3Z z@u^Ew`d~oXE_HWR>}90nY^Iy9`7N$n^2Tm#KNQ=|WV`aVt5}O>$;R0;np059(x32? z|1mK1+rZ436a8&3pn+C52(>MY%Z)z}d}Dva&av;+Im!AH@ru!3Wk&1|lN0VG@GJhL zrWe$kQ=s%&B&KY?2qV#Lf9JEq{2#c>7yY#t%+@{y7$^=T65=K=3@5lW)bmzj%CIv6 z)f-W!NBfpr@-1^+{m+Q|4xsA74w&mN2{=6>DM!d=)fvZLk;72ib8ONv_zgG!~?2qx4VfvShA%9u4_1GH$fZ7}(%hgCB9$|b(&9a|$sa|V{(|S&aRQ7HiH#Nv1MoKe zfZ7x9MoVyvI15BO)%$h2S4e#FslZ%)1jE%1G)HIPYfM-!#fxr*#Gtk{LV!^!eHL3m zvBNSSY8K#b5`pN|WQKyTv_bEJj0uzkT@h>(@tX!pq{J@hSPX7EL5wi?0-h3$0Jp;> zgqzcyJ_i!X)Wvo6VFe~ZaphY!6aTC)hKjk`t{?tvR0%@%p~&@bUyjsQJ8BWYRpbd4R$J?YxsLg+|K$NH9li-GAp{jv8u6@02k2f zfCA+HN6DJS8_%~bG?LCilTb!f=encImIgI?@G}y+A7Z`e^e_G&27Sf9+2b8S$>G?R z0Va-Bu-PxbI)X72GJ)Cc)s0>tUBN?4E1*HB3rEd4Enw+a_7+r`1O8?&G$iCIwA{;}@?lUnc7cocOOSV^Ypz zJ-yvfm<*KQdrVS6CLP?ms;03_^R6+iP`I5f8W*2uPd^i(A*ht-GO#&EMhJJg^()Ma znmD3l#q*Na?|5R@VF#CKBk}e8+7Z#x;qSMoFU%a;qfb57SS2iXhSs&>tJuGIpQP|m zP%ICCPmJU0D0`QXl|DYqe>aNuljav#Fxg;3YlGVxKu7;ovmw`lsUG{nNcOH?VXfgR z{_Q|X)V=bh$*)4^Q8*)CdnTZ$+9*0+%AeTxozVqTvtH!uJZvAF)5>+KJpo~Ne|Wf> zPy<{B-CQLu@=o}`W0yg;#N}q9eWU+0=g?p6b$^QYHjzm&v`16M08#qp&5q z6gy?6!tZO|G^G*$Zn}+%4sBNDY@Q;Mg$U1+8L}j|*$Xkb$YFkDEl#p0=Zet+jhJY> z)|vo$a}5aKzb9a=%aq(=Fi>v9wpV<#IIn-&;@T$A!bBPu*akfcE5_?2({;o-q zO0b#ncMh?%$UGvEKef$WxD}9Lnsk%=B7x*Pj0rFsb;np(H>2Vcn-Y8+D)ln`dELO*00@ zWP3BD4-p1H!g^2vlkcLC0(^4%dqESXPDdq+UGAXR#Mr^b+57E_PSE|qE%fAG)zw^K zYl%bnVvEq8G>2nP&FVkBAK4=e)un29kl6#3ZtjWE$MYH!rVkBLr4RD7=*w(I9{`o2 z<~>%U93bLn?`^EGJBGc+s`_0R9S|LSvQssWLe1RwMif*fyy6|)w+xIfZeP*GuGz|o zIQa*`?MQ*5oU4O!Da35yB{m+2>+r>+gZ>}lGG2uvj^d%EW*2URy2GnbtXn8U7#%vR z%GC`l-{3nb2O$u=MqvN+BBgy6;gq{6ku@c>O7<+sv>JXnX{H$b#2_9-nc;UfV*{o$ z$C_TH;{Y`Y9Fs@Sih&L0TWRdT(40)Y$rn-S#(%G3AY?-O&(tgIz!&o&I=kc+mv;WUwG*=;u=QODewg-o z3~f}X>iAd``LJIvSt=n$m4+4%KzxTT?_P|f{INrsq?v|hg+e{W9l23&LoNOpt(l#N z4b@_yV|PXu?Aee%!jdS|<*+g0hj+Vwaco2Cz9V>g$&~C+qGu`-v>m19hXW0K`~YtD zsV%`NWB`_>Z%ThuZ0}Gd2Inf(vvUcg7ASBbAo;$)M8he~$|;GMzhQ*|ha?(tnfyz; za;L&|K4+vBOB1GelxcGzPC@B>CkO!?K`PjL+*7pMAv9oG>KAv$gCW6qq8!$D@fS<0 zFqU}$)W9CYr|L?&=YY_MOD}qk`P6k z664z=L54-w@(oOrYC)3$q379*P~#a?T;wEch}Yw7hS1Y!$C z-{OHlhq{*pRa7umTv|SAM;QF>5$qc|sSs69>>iL5u|D@Q9bLt%uW>Zfb`t7^6`0?+ zFW|%((}qUc`=`}p-8|WZG$&B;lA&XFaWnrY>Hb*P7E~TKU+s7%@`Yisx@NR?r8;|5 zaZW!_^dsBS%XMfkxX=_SE0yEVP7iX}`tmzg(w(8=AfGfH@b( zSzEWNRm*Z60+2)hWdFEOU(sJV=%_du*kRb1*D{3q7`vmsQ4Z1e-Unfja$xDPct0cg zGsRz!K(d{Ah#`1MqF4W(b|_;#hAk2dW{)K7RCmy=^t96(x+ZLAf3T34lrTikQ!#gSbW~!(P}Z zj*{qQ3r)G(r2Ba>xNmTS{7*%zU+hOmKzE-Hrk^fNunc+vlFyvnE1ovMS_#OdH#;w2 zI*KK1pXz20c}*}&CiIH6y)LC5#Vst0x~XW6KuP{k`Ks5OXr5Y`|YIa|zZu5P{jv?Dcw~@efEa zZHF(;0iSp*p&8r!f~`)%*m5Zifyz7a%poKS6jkPXG3WU*!Tmc)HQUo6X^n70Bu@TGJmMckoV-(2 zM~fmv)OF|{iN%i%6|fzq8w5^PvKpF*UBh0WAg>a$3x<}#lTK~;tY;$R+@Hgz)GN#> z?IJ~Q1o07bH|X!AM&+>Rc!!ib-?~?fjM4a^@1Vf<1bfo2?)&fRPgh%G2bJ}Jb-qwA zx3vq%x*=IhCR)I<;J^SKDX}k>pE((T3ZcAz+-FJcF@G$E7~fio+?1_}H{l*x2k+d? zCyxqIqsG`amv#WMX&Jh(cDs4Wa8cyuS~y6ZLZ~(tI-@Vc;sB0Qks&1}8dFg;nJ*ov zr)u`5loaO{rWnz=bI_WSQ3guQYbJR)-}vBNbEbU{ddFID%5ZE*i3I)b(?5`!5m=f+ z9rIgLn1}4b``c?}`+sSmLH=?oXW;V@)*s<)8w*;~u$F$F5@!MNk7|3ZMpyE?@PY!W z)Pg{9+LU47cJPKuzGyQSo(lzzVS;vQTV5lr$D;g|>IsG4B&^DAh zdt`B7XcV8FZy!)?r;7P8if&)=Hc}036-NGF;GZ#4td+M^&P4ZXbQFS~a5J@TcYtBP zLYws@pQS!9aly6OTK3-Sc6iwp$vv)jQ{wzZ8YabJxrKb1HRGo!l)Y2@X(YP(>}TCF zgLw$xrdVE~UeQ14l;{^f$)48$7tU=BlfSw)SzqW1mz)aCA-k}e;oYHR&j(OaJZH(m zTx*+Nmk+T4(kJZ37}kWNBuyb@C*6*t0kA3{-~_B(My}i-`)A0!ge)6_MLw+3lIFF_2OOT%|2CG>wj3!>P zr}M?OGm?QGuX+QofzRUWdR5n(4qvX0-Vu?+Nwvb>-0E|p_x{CZE%x1+GdIVFC)oXU zpf7(u%Q6#P)TF?{ShJfmWKRMcE~1@u8e;%_^5HGYq)h23{yQ-8W9$IC@ujQK!DK+y zCcV)&`ks6F$bG=&>uCqDqZ{RQ?yvTOXD*F_pC2epN+xT^2k$m7P+g>vPCEcgzbR4; zlL2+aRdv;XgHv9-zbYp*<&PaDm%XNMA20STi;h-Ro9m#qy|K(!rz7;Dwn6TZERF-? zoUUf2*itd57%6O!54`qd|JU~Qn);t$_6|&A(_&zqa84bz#N@%gww3c~q)g&~aeo-F zS}t&C-0nLVf)m)l_9n4cDi?%f3p)%Z?drunkF|j0GEeDH4w~zVv0_blowj=kMu8gp zbQmJQF=Do>Ma<>M?m?zrig+h#FK`9cLHJu=DLK{iIs?Z z!3k$;O^Elr_OLo7onR11>ckf(MA()=&=$r#D!;d-OacqyH0lrA{Pb6wq7ORy8qr|$QTuc^7A>Z4NTd!^ZB7~Ku3a3}9hBn&_}#vuD* zTbkSlPyck#gy{=wk5^$z8=8gePK+|)&<7C0FA5m~1?@e&G3GC^O+m&UM>)X$5u@Ts zRDI)Js!6os7gcZ>0_4*5Tx=5)M(h2$DY;(>{~cDkld;sQmFxJYKi#+j4n#N;2-=9I z7DwV}#^$R};UX4-E`v1Kb%yBX;aT9(lkGaCjyhsMi0Bk{I|*5f22~0C=@{Ln_mGX2 zaz8r53JWvWf{<=Y%ixWzjdj3~#8m6fqn!_T_!m!I1n&c>k8bY3^+5j@duTm|y7;$< zE9?-|JV(8=`?&Q%!)>U*2Sq_#!{P7oTH(s@>^Gh)Fd-X|s~37741uZad}R$6&*%X< zc>f}LAx@t$bxECdjeioy(}RDMIuFY~NCmbeJ#kQV5GoZ|)dUiQxOX>X@;NovXv}Ck zQ|e0x??n|kC$gTc1j6P{bU_zV7f=s_2d7emRW)cJxDeXFZ3rUWb~A6~V6qi?BEMis zej%}R#95AC<9G&50m%&>E(yf@pyLSUP3X=rFL6*3w@7i1sU_ZAcl-rqH-H9-lpO6# zYklUg3^?Ym>#Z#A|Nl{4uW~jcD+uZ43&^-fcmO${wLxlf~2|%!Xutu~TALZN25pRcRd%20$6+vl999cwZ0DPWaFke^?Ux zMpLd2A0FvPS^R*wyq=Pk31z$kiCw)tP&(4k%@>@-W7t&N!4b4E?0`NPiAo1~QVaQd z-cYsNrCchw$a*E75${uO@gIqU9~sRtVj;@4A!64!ge7aeWJ5rM2iP}qUIRP1b!9}I>gmN(q3+(I4c zx{vY*+^y6eg4V+|e@sjRs-iKeLC*oNme~|USqgDSg@Ba0B`_6H5GGT>F~Q8uTlnez z*faV2az`OPtyBa;@PKi+GV`G-NYksc27r~HnvOBfJyY$Qs4i=vb*c=wVYkXQsV6;q z1pVbdOe)W~mDiZug8mcQAU;+c3$fzv_yhJG??9anDdP~8I0*w<0?!u`70Lx-ZGBC)K^0swZOW6ovO zN7Ndx_UY~kf(DVv8(r&P4jAR0m^X);rKv)d1Rw6;_(v>?*e_`16arQBB1qz~urL24 z!&Y1w;TE8zQ;yo*&0DwomU2adVI_$>0qpJM&!WEXv`PldqydGIbiChal97(_ZUNoG z(>sD2N$AvM-2{a&x4u@`B>HV1lt>5$B*V4i5<5hy!y$17Vr|LK?5UU1?@vqjxcv3N zHCaDmunFWWH+RYPE}d;bCq{Ne_ekWE@>#skI&2k%*y8g)>M8TM42RB#^YV?C?$Soy z4@=s=-^njPtzl+^Vi9j*lKs`VtS6>LyuMh)!A(ztdbWAa#-S!rkPkEBmY@a1N6i*K zV^DGcbzOi9QKbFFK>lwT9wEBoU&ZpK=bxBTM;l(%# zHNZ1qu6&v&u9lt+l-Ch@t#i-e{zq?{-1Tr!Igkc`=s6`r8)oNF_Bk%SXCaT3zvyKe zv4ysX%5PVineL*$A=^`1gh#*3lfe?R^Z#?U1~S>s#GSHRf_Q)3g^w9G!@D$%Vjt$u zn9Kh+$#N|bJ?b5Kv65&j0UjCx6@7>Xr_DSz>uPmjqG+Z<}FiqvX zPm5jC@K=%9Y37FWW{)Ewuu(YD#(=7`j-I2}=*af|i5XVYsDdT$u~2;L5@5XP#uha= z@Is@9HctqARtbhEdv)?cKcrt|t(dyZ`|K#a%bUy;rHp?*HL}ude&w0BvndDA{~z3A zlkCMH@HjR9!e8yo&+pY_LMX4W`s-W^s#Oh1vfx(5C!oTUc!k9HXw_bCtc}zdpAkx_ViYI( zHR|1o1PNmogg0kjNkc5~jxvf~>3xIbd%V;x3zdWb#~;uI5Y*0x>^6{Ht=y4q<$??> zL;fe-s5R0A;;+Zj(hPgQu8IaR@P>i@AK`ZQbtxczLaN7IxW~LT8S#POjGt)EdMTyN zDF`>~Y@GcMDG`#T`hs}cB~8hVEmlf!&^dc!OT0GhNw*chRPw`clnE9uxI%OE;1}&| zMja92?Sn#_W}Nahh!7DOgP)ccnT8PS-iT&){R0`e3@c(q3?m)=x)#I8U?ab3@ zzW~ zrBcbHCyaLj8AJB-R`XGeF(B0BK3cXmdG>XJ-IARQKxcVQmrJooZs(DQRuxQ(3Yb#U zn9XB5_;w(zC`Zjc(FO6?z9=U11MGcdd%_2kj1q9=e{BsNejN#YU*$}}`}vV1*gmHe zsKB4T4)T{yI5mh;i1|dAunY5AA{GTc3{oS}?N9AGl9IZnt{c0C_`7KLU|>L$LE58c z`HHV~jdk|Siawa6&1RhhMZOQv$Q6`>USwUJ02P>BaUsqhG_nkP7Vt?0juOXMjMgE? zJ8BqKd5vJV=BUBK>fWpJ`4~qdCR0{HPu+uvA)#uHw&xBiO6LX~mG2gD?gT!Yj1Bw6 zv-;mJ{}WoeU?ty3pr*6_VBc0!I?JgRu2LH4Uc*cmbB9N8n>WT3mbL7_6a30a651Vj=_$8_ShfkQ<25-OaTuHsv;l|l9?^NBL_w*sdc%g zbNyD>9PZJT{GdS^z36y%eSG8Ywf;$b#&RsGVt4^q80{G0P_*rCRsv>8=-SAL%#mQ! z7{BAm`-)QtJAm9bI!2ZnwWrovw&tW1&V^WD^wh5dAFQSSJAK};0NCKw zrG~#AJPJP|d)l($PR;%aH&#=fOQx%Ax*@^KU`fodh!=}ZnsYP}UP~dAx zGaR288XryLi6*44D;2xz)wAk^ouV*hIjCZ*Zo$%ul~zjEuzDwXnbp6}go~e-MQ3xu z$<@Guuyo7K5T|SLHyIcNTMT^oIED)RBxQM zBw!ypz@_xq`v6;&wpe6jh)>A>5eV`%<74%Cr|R20n-y3b%w$ibv2{v5pK-}=XU6aU zFnDvJal{pD;JaP@Jtfu9O(e;jXt2Qc|6iH1cG*+5xa748!+ApUCHsxpHcJ=Eu(*;GU*aH`!P zse9PYxCJ;3^u}Chw-_$@+~+myesmTT9Z7Gk{N5OX7*{+u{MV2_W5?7@w!l_A&K|ZH zaftoo`sk?s9XI~ETW0$AuVZCA<6kXjMvWa)Qy?1fl~LBoq_j_O^r5$<0AW~a>h|)|79M_Q+2XPq#O7dEV*Kd<7 z3K!dfZ!=@9$k9^TEJz3 zwJzS`FoHp#NKH*0{W_W%31?};7pmYup##4mD8RlTB~1t@;z&Z*;`gX#Hv4SxJnm!Xkp|I5k11Pl+bj;LbXGUMnXc5qBdvQ9d9wuZLPyf)2#jyE~n9ES1 z<7dO6`ib5MQ@O51akS%x2~?nrm}mh0rqjI7bU;*BZoenzk!2w8sj zqJQfuJx)7Kq~_8KmN36BgNGg^$ux(spy&slkX&~$^=r&F(C56jnTz2vCb$R~WH|#l zG0O@K5%rq|m507FQb$1tYby2DPz;<$_Zh<^8d4gJemlU928NES5C!%1C>XyGwUOmU zY}vi<@;&*S7CwYedNIk}hID9}Y`OF-^qpQS&(vi^QT@dtP@ugeK9e z(0-}6)1(l`X|R#8jq$x;Pbiph8W=bJlublSpqgqxUFApx^BBV^yeXT%@uKPF*#Wp$ zZch@LL1zXaPm((cB^skrPfINdr>4|5I17?sni4UNO0gg5e}G4TF&ynDuK!{J4jy#> zRc+JC{664>=}00DfZXuKtq{WX7K@efbbr860iJ&Z2!1BW7AREEkP~#Z7Q2eXR#iF5 zVFV<0y))s`msOQssZWAT3T}W6GYrpbadC&XVWkha`%a?4s_9Fq(4grV)JSyjCpsk% zsyNJTO##?KrqBL|05H%a3rs$Z82(_4%_Jd{Ld|FtbnV6>tl!szK*H`{=aN#Pdoan6 zh!&8F2AaC$?E00GZcYCTfJZIt#VEx!L7alP1F1Nur*RP(xFUbLOR;wDvqH!zl%%6T z7DQ%Sn;3B}K49>N-Zh9fK&0=yBi5+pssSgQa;&@Eg-mB<80_xs2@*A{u?9D~wi?yH zo0w|hjdwG39;3zrTG@VRj2d)cX?aMtySdj?vTX~zF4>j?)044RtJ$x6hjKMc_FP0u zPQT(eS7Y6>UJT)#{nP!{bpDw4>__kTp|aBE)UFqn`7N3Oks()xKRj>p*r(9`X*Y#Ypkh3h68N#4cikwClc}ARdC6K5wT~-Pglehf6b=={ z2?{8xF8>yl2TJG4VidyzgTJvqg->);S-)v=AHJEi(1|g3*m9xu^9|Iaqa!u(QjRw~n}=3wnIi+iXUpz2u@rE7)^ zCz=$WgfFUC6D`@q{=r#-6c&qYm*tiaxzk)Q1RA>=*&mJM-vr9XXH;B-4s08VYPwy# z&MJ-091RM*o#$DjYZ+6+^x?Y2=cxZT85k*=kqm-TM=NA>0tO&%;@j3e2z8p{6t7<* zy6LK?=(3&unI#g(d!2h3E}E(tX_~dWN4L9k2zuLFy2k`&kkg{(w+uN23NE+<<*`FRTRkAWuGq2PM?{~N_!!Q`7PgY?KDljcVxA=%8OL73#!niCN!9$?Ka3uOD z(E0cOC(R+?ogB*+OK|D?;E2o~=y_7MLN8g@K?>Hwl}$z!r_M>!o)^LFG) zx4Rw@kHoIQTr%fIs>F9iV^5egHrDsmJ522(K!oy$NcUP%Yj3k_bsmaa@OEXawY3 z?}h3yb?j&dA$d4N8EB&6x1m=3S3q-=Mhg48!K|X~t1%F4qott{c z#Q!4IS~p>OGqTJ^b8W|q=-cm0UI6jXS5DBt z6-CWnqwF!UF%v=7_fU$jCN+<;u`zBfOTg<@*KGw`kCisdDV-2dEdqi7VG!k7qL~{% z{tJKSHuS%Tk?1hj$n+!wVI@Zkb$c2ZNX;EZ;KHhMG$FzT7{wM-vK{`r$lY{47IR{= zl@w&uULx-1%|uWSMcm&8%|Ry2ux-dP-H zrBHjgV0LbrcoDwV`B=g?PdJcRgA9=h_7#~1UR0Yin}GO*+_>MWL@04oJ)tK_Y7|$QM*HG>C4N_eQ5WoG+p(S&W{4UWEgsyXTpRpH+*O0it zpVs3Oo8rRptN&ptwbBP@A;__W@d08i>3o({2GdT*=VuR0?`B^)J@ZS~>ZN2Af;`meKDzj{aoYVr2nn(PmX*E;7MR3MyBhO0e^f{pY_U5QXcq0T0ciuC#7owP~{jN#YG3EJ41SrHsIu+c9wh| z9%wuquek{-jEIY*zrvfMu!U$*;mGo1!h(c2zXZi!imAmPjK}D2f8TBK8bR?_R?E0_CpNcb(E$r)2WSOo^nd)3tvN8EHZHtd^4a7L z^v5lYh~iotm^)kapL;uNJkp1pR`U3e?XS~bqBNJ$z0CPpnSgnI{jyeWeN*reY8WFs z)Vs9m%~+%CnP*d&Z-n)Ky4)+cR-KiVmP(Y1iL?MJ@83K5$N~(h8;uql=Q{bwa?xJRfuPx&f$5jB+lnE-2`k>8frIXwZV0y3=AhMsiV!Lrx~gC#tb8l6 zAKD`{M8PAw=}VwhLORbZO@Qfhl+)x^9Ew_pVjt``;DmU!&7+v>1NDIw%`VQ)>&9=I zgnbZuP|8B}r_)j#!B$ibQ3;qsRH~!Pd{8Id>&`I48bu?aa1kJ^)H~(bq2PoGarUrN zBggO4)+8_mY}$TI3f}Qz&oPE2)e~KQvl2@OArayTshiysu=tE>5k(`SJ*^jFdpjbQ z*_h%!f`dU2rsp-v;V-tf1bd2gPc=q6NVc7-8Ic@{vKNE%=y(%keJ3DkVS3tFTyb=! z8y_cm6}%=%67+qED*zDaOWF&uP^bNsF7WWgjM>T}6B&-o8pa^y0Fb;)vdqRh(oAzB zHnfUocPK9(rCz)D=4goifRcfU1cnVb?4%OVz68j_obY>}A1KRCO}@27NJ7*y;(6Lv zfq)v^w;IK=Ag)&~@+1g#$cg8nIUxuec5SMv%IvqWc z)#s6)0k$H*#&aJdbDj@s%9tB1aF8uv) zXHOQ{kstseat<;n(v$LT5bgs&H3SgSIVyV@GS(qa1hgV}Y)wGWuyEvSXyjm-9|Dn= zIcb|aA8vIAVE_jb<1^oGq38yQBEI@|(4`-tkIn}2N&G<+tjDs#l zbjN&%Jg`qKrt%=NU7$fu3Y>&!2g0#{%;DdvS%d_~1h))4iH*6=Bb&@E0>fU%4;z0o zjMeS5owN$?Y-{nMmt;*5+k`jo)xBxrZwfWKJUlBjhG_}R>z3eq@7lD?e-S0MP3lBs zl|1Xv1-WakgIINN(EB@!;FjTd2rqfo7b7*lf@~$J#>lorN2s!RhmHagC7GHR;xm7N zA&UKArs0K7kz6XeNQ+GT-R1cvD;jGInWvbEXe-`sm}*h*ON2!wGqo&+RdV4*A7@U% zW@M!@B+dj4OODxt|F5xd<0)1#RxMU`Ym)lZw6@UsR}4Ll4+#goW@>p|yqP*)aW!w^ zjEL{0k(?734B}Y&Gw<5pJ9CD@R5cdapr;rbyx*#=DLKYm3xpvg%ev*T9*OF)4O4y! zg9hQdSj*EYvs3-PkgEO$RSpQA45`^R@#H7jI*QRrUP<+Z&l{XA+=O;i$>Kf5Cy-U2 zcXl~YG?#Wyvqz?--&abbV_PcE8|k;{G%t2tDc(AVq0Ugp=7D@(iQ=^Eu&hBC8f1PmETs6^@fCf)-|5&2>W{PjB`nI8Za$X-O6b{*qh3u zj`tGdYdV>nk`3hz*e;sAXg_4@GCPww1JeHvG?&PK;x)ebmuBaW zNh9d_m{i+c^&grhC7tcb(p7BvOX;1M`bIUoMpavt0r?p35pUw`KA=3@8IN~ZuZuP0bDY4eAJ;`Ei-=AyS4h7 zXV-RwrlcOdwI#_asOGr8Uh>Tx3uzOtWn6YQu=$z%ldWJ)Jw$qEZ@uKrZS?giiw@5M zIvL`v+Jd8}-1A0oM}kFJ#8h4kK`wq(E-PTq))?pS%Oo&0YA;sifp&R4g*yP|FIj5X zlsV}0LV(sh#@as0a^8)l-tovWjN+YqYl!4N+*(AyHpB}xBWG?LTm=9m%%QiQyxUky zLvvC{zaCE{P%SkMMCe|@Xq)hBDwS+1($II6BM(}Utw?3|A!BKv*k({d9kDFiqDgGu z0Advk5poY9IgPE2HuM6}AB010?6HF|YpD?cHn6H$*1XjUgBSv*BMf~K6FU&!fkeGsG4)j$K=g74O6LJ&@!}P1BIWS|Lh{7L3u8C^!#mzvu5rLqIi8YC~ z@RlROQN(RSEipC6TJwvkMI86>-{M6O*NtY7;ReE7JnUETd0ntPr-CI**b(y=6&!B^aq)P*Smd4fB*X0#V`Dd0dUHNqFes)N{cP-Q9kz26yS4LdPHy%sD- z*;@sH1@Sfnc0zd~1$6(89^Hug?Do82r^sQDsEK9^pcEseqlofmUMaldX=p^Y`bgWT z)S;?NRU%92g;w~0b?>+)GaD<10NQB3?6UJnOx1Q+ z@Ox*^<60Cjs7%&+6cKWA+0$BtxMmW& zmXyqd(19uhj0_w^bY7C4wuvj5r6KkI+oZ13-eR}8sE6jQlBSJoB3(Kuv*}}kk+P_j zwa2e^K!OZ6kMP)2y53dLy+Jm?Gb93_D59cFP_~gfVznu8PY`J}MkLA`t}F*hZ=>X_ z3qO*NL8g7kIAeHm@Gdp1Rht+`AMKq?)pK4G~YD2TU*s2X6by}C4ti!15MSj zFYB1?;cPwIl9r{|g>pt-LLCB<6^>4rwDElGC0oX`QE_st!cVjx-ruXC6GFeJ zo7Wow56SM1&&-F+cC1!|@HeLTZb|d!O_p97x&HK>x`%w4khD}dJ8kL~YZ~R6=9>zC zhV+&-B(vdI!iW+mq?)cBm5PMGW=Hl+zIb84KGK!pUJ(NCQ-!B#z50c^YwAqiPt(k2 zJLhyRJGFGh3e$ItguUkvKN(~TV($Vl%HWz?BW^?ma4*o5Uaqn6VO<_rF^eIXa6$Gz)1U+gexc~ zbDmu5qQ+^X{!bUiM~!5HK>p0Dcg_Jbhw9HK;Z5Iu7aR|xT%(@&E{^b#Fqt>`583&^ z4@}m_!wnb1<5m9Pn~cSeD}1K<9B0nOPD%ajE6=I*G#Q*l$$95}|K51$U%*L3Kg7vw zYu?iz>haO4y=rXX zVP4U|M@_}-$_vA{?OnRd4?^SL#>#OtzMYuPMMakh%zNTC_s-0TnRM-`j{WVK*ttY{ zu2_BKCS1d^0l(TH&3Om6lw;Jfmk~RpkpC1jQ5z^SeY>xu@j>OeudSi;Wey3acECtg z{^_P0xzMdD6|8NlsegA~z7ou_So6S%Tpq_yP5YnFPKmp;*~atI96G(e!-GGMaxTlx z!@USx(h52aTAPF=fQ`mc4B&yr8<53lD;F$r0Z6y$Bq{{Tp}41sqbJd}DSO(vyAjcf zwT{fWZxZZ9>>>13ffAwmczpQ?UVJquypwrK{@&6pr3U&q{fBL0^e9%8RjuyIZ8|`C z58(5*0|y+mTC{O%Jl2*Sw{9&= z$s-M@j^N^;U-kOIE@0Vap%0&*R0wz_Gk9_&q>L<|t@e4+5f5yeNMfDx2Y)ArTXQDJ zJ=B?LcO2=?*w%Xo(&Vrc*agdc<~Q3%+Hh!Cfx+%R1^^H4wU*BZGUx3Rd^9Cja}@qd zo6KG7lc%`65{gBR?8Ph{&&s9iR37{MnzB!I^qbjzfHyZ;L6%NY1;UR{%8UY z5RNRl*lgN!C^F-1>m5%a7J{6vv5@<%5AAD8pUxRY6f|()m|{H9?OvX@jSOOttM}sv zU}c-q66vg5KtWej^9Bi%HYZp6E9Bhz(RkVq=;TP_g82u*N7x@~AG`{EJs5r8Uk{~t zL41bxw&HKyuskaiB8EcyYWT$dh(2$oFTXrH#gqW7=$wo|m;Nw#--e=zXBs?ck4>0( z(hlKg_2^pPtLt;7S4ELNisA?t4iNmJ2cj24ZI^3zzZt9l4w}RR!~0+0|kY zEx5mR&Rmb8$An&Td!N5Gt(2n>q2==!rUm9q7Q+lq7VHIqY;i_rkkOUaHqq5^7w zRKGHbGJ^Fq{XzqVVa&a;wMy(k_Grxa(RL7KsKOQ*1&fCUoMxn_%&klNGwX$!v1)+4DqJ(ldGLkWzlJGm96_0p^v&{+rzQwdA;VM%higb zvHVfRJDJq=Ke8yt^ym{GvFblke9gSgX@kuSDyINc8IRpV^i-d{)0PmL@72pkEQ|J!Tupvw(x z3p7qN`pG*_3%uAf10!>>)Yo?=@|Q-`N_{o;SG8B$-DrHQ6=V5{HvV~Rd}Ix8+)*?g z+ig2)GB~)Iw8Mn*&x9%+87ZuK!mz`+LyjEf@IL=z;L*5DE%4#H*yh`3%zCR*3}IvW zVeqLrYCpWZd6e%rx5SOIuMSHs1c!NV-@!JAwrLeZIq4vQ4o?TCPk#rcBx z$=|i$*@`uYXtLP#gzIfmzVrsZ*)qBwK*H&~)VKnUHWc(QB_-6;T8!?WGkhgMZdT0s z!|qq~ZxRwcU@A-L(TDJA49%lm-cPWK4avm(?F5Z-FF)gh5qWV}lJ;^i zUXJyxcBE!rDa`qQc={5sCeN&G*%c8K8d(Jw6dMr`tbj%~Wmj2@RVxB6fL6<9D@jEH zA|N0lB18vdajBu&0kKvXB4HPZO4Ux)7Fj|fu8;&P1VZxPPn_?+=9_Q2AW7c5?|II- z&%M;a0Z9UAq2;2psi7|BNgTAk^HB@o;U$~qLF590eV z@qihZJ$hX6UZZZTLeN+UZqFHjS~f(gc?Ek3BIvV$f~^#eL~u&R7e2?Q47|X{BaTZ* zDk?xP+|KB=!Kns92I3tZb?t(w<;(v5BT&2J5+Gxd0&f|Sb=k#qvbh)_-jR7h_!85}elgco;lu4w|Ys=D;-BIdA>?_0= zI5y1kAZdht&ml<(26nYD^0c6z4xMNJQ!S#CD-&no{`-<_o-n=J`&yz@zrb*mhI9P# zm?h;Ev{VvnY_<(SSrcke(&23i4Hq{A%Gy$s{ zx|AK3_@y>fhcGIHN9#E|yhNMU)I~6c8`$OJ(0ya&&HU$31bp!y;HI4JdLXu@&@i)F zJFfvJ!IwLHDQX@t`2_4V9>iH2bD$+&9~mDT>Ftc=^w`gGM{|2gSbH zg0SLDvi!s?m%Gvt2-tn`zmvF^Snr1An;PHnYnNbQP3O|_P)e*-13?RNHEUH`dT>;?M_(<@ zFAiwOJ&lf^`77!gii9t)qo}0E@Md4z?2VHJJoGex#f8D3axtzhHuxN&#d>NA=DQk}_tq4eebHjNpaonL2?P zQaGR`IHAMy%gBRnjFeYC%6x8ifHZOl&mMLP6q!t)-m;H{H8E zq4!q9>cj*<5rA2+0>mGO`{Ed_eqCnZY^o_`8TJuq%fYbjAWD_MH2j&D7WDm`_tV&= z5S)xKs%tw&5{H{}50lfDbZt4R?+1~g{YA&5ZMA$G3a|}Cd_k$4Wx=* z%15UStezMlI&dSC9(#%oQjuW0LF**2!8A@7_^j9 zRitBcSE8%RK?N6{?HF#&1O&$><}qZjbvAF{_rgI64k)ii22jJvDuig*VOLc)&#SGSCr(2ZI9u;3C-btNs>J*JVrsi4ukr zoM-T=0M7LHgRJ(Pc#7}=Tk>CAR^OmyOPve4F0e8v2w)76A>3vGifdq&ZiqO74|T`*DVxbzqm#Sz$Cf;v!fQ~Sm)2ecZREq zje`>}*_up&Ie;hZuNg|O?tqS`nBm^aR@{mk;7v@%4Q@@528oWZaB$emUkc+_o2AZF zsL}`HA4vPGCM;84*iXKY*H_CgaY183@KNCw^!$G-9w|H6^0K?)$sn2SkDvbATRwXQ zMhM@fRI6Gzc47OqTgUACo~gcZx4wz&IH6AebZqh~eF~+>BKRl&ct9%*}e3n zl+j(xF;KUZGPWW*T&vT)JastL>RwiaG=rC?9Q)3_?U1{~CZR7Yz$-)I*_w{%bhlph z){*u4@_}`I-Q^(3^5Z515uFR-XK1%xUYuB9usto&07uz>`ac!PgIG!{>15F4_am-; zv2XX2**yGr5ICUCDwbq=z)uWv0{_)IRX&!6v(1g5PX+L%|UdIoF@t=Vo!|;ZiYyvL)f_zr+S^ThAiI4hX@E!USpjIn#?Y5fAqTrma5nW2ee<& zbY)yU7uo7`|M%%BM$fwb?g+(S)k3(<1 zN!<_Up@iaAPREjbjw|QD16fMS#4%oBwQNb;;4^tGD{s4+#!Nb=O+!Y8=t62Z$uk@Z zm4?n*+_SQGcE6m=6teV)_CxM6o1vFZZA~W$S3l&%0s=kZ)aof8#{*}UE|%vfCMjFx z5921rk{`v~I}@YEtP&ZvUYR*WA-;WXNKg)JQg@%9++3oZtDI6w)`XAGiW7z{-zjj> zEY9_4UsyvZ4oBIG=%3Cf$SOybv5GvwWb)qbw8fG55ri&~T?Ph%e<2aEXeoXSq0qkvwCg^t2C{kD`Bq8X%L$#LWtG6cJs?-!cfyLLtpl!X&gF@?PmNwkPTJ=1=GdRKD z0T>D}VYqZ(L0}B=&LcoEJsdaoQ-T=apArXc^w&u`l<}2GNlEbpaYCy=%00>{j%0%T zgT)`ZlDd#Yo8n(1rF;(^ekb&@KTMrAz%sWJtzOGMvUR}tB$C~WiLM(%&I;OSRau+? zbq9YWyF0e`<;xIMA^fxl@gL{xh>Cu#*dHBSAD6~)K_zz5*qG7vF#h&9Dle||_jZ=) z-F@X~@O?7$@w#KOVxX%pprfK?19fCH2!FT^IMk{nona=asQ~`T<@`T;E7eyEB_XCpcns4SdUH{4N7TuV z1s8_)7rBze#|nY5=;w9M=CX1MTTM$>uE5BZJBPjY;C@1y z6cF=+=aC5V)sZf=(?WfGhf^VqPY zHB=HQJ3Cl}PnHF2y|&>hy>|{B7!VNF+ct2RS`~g6Q@v?UNZ5Qa1QYJ}O zq)2*1hj@a!V^k>VL`C>@c4|Eu%8xoDGOf7Dy(!#h;`B#3uEbYt=)H60O zyEKuOBD9fCXc-hV@$*}aaL(7cT+y%66_SeBP{YaCuB2SsoKVDodm{Tq_ zz1h=Z5vC$iK8LReN&h-!RP?oBM|{voY7%#P-Nec`2)J+CPw%F!pgrx1kE}SG>`~E~ z1t1SV8o@p>X_MXq-9Mmm>GJxW15Dxi(X5`S6a8&TDLuzzb>lIk);7OysHpm@fbI0~`Mv|;#oM^A;! zt4c|TPp)v^_r88r?(WSwG(S;vj5kF}cD_k&H1i^6%|=Y;6c znuKh0adii?8Z=S{rurWBOzm_}k5g1Pp4e`n7wKTDO#(Hj9gDoIy-rrlUuM_p*$%s> zV9BCZ3^~^X2md$q!w(66C2a0^cnT*;AkMb3)lgGFxZZ1Rj|TK$T>|q<%9_Z!!wDBP z)_O+eV!YNZI_g=!n$UDz&l3I$9=e^L=;ka*G@^o5DFn<5i; zB0+t1@Tw#6h*uI3Zz+++)x9K)#JGw^96zq%WYZ3b4_o8(q!I^T z@p8MhVc(*FrgDAxORf{ansPayTdVtcXcYZPr}D*~I-BJju@;Lf4O>v z^^!~pBSLNfh~7izD!_OI5BSI$T4oMqS-3+O4wd$;IFQ($=SnEcQo?9N?uomz3dt=H z^e$F)rYn02a}hKH3d94wT;diD{U~;%xiAPYsQSGU(GeE5YJ6QRe&Br`1$$>g2(hl_ z*L5+hdvddeBBA+7OU?12+mXLB+?Y9KL{ z!P{5MMQodeTd)mE!|BAGXkX;;$$n2Ruad+%)<5-sL zRKCpmQA{OZ-Xj-Hi$BYO89yV?EziaERFbkON%~cU%zWZ5bn+rkmy`2On`fLz_tljy z2iTO)Q(C&c8*4n(Ctq{MU~2i^NPUEfh8>2r663$nk+LBwWkxc4##zqFk3EWwjngH{ zg;xLU5r^8e?rn{)I9q85sFir0C=zZkaBt1ox_FC_GSH*Q;58dh|3`^8ce1?8jhhiu z-Sj~0(7IFvA7eH4QvIy;OmI19diQU$na{=>3#%s|Di`q-{jyEr>ekxKkfs&QQzux{ z+mC;Vi<@k3C0SM8IZ~^?skiDpCrseTp_$P~&TRN}TzP6dS(zlZQHnscH&_-THDA0JHqe>r}&yWop$kSa1JUE>dvu zFN*7)UNHSpW+fF%k4-rBf6SVYl`FmuR~M#l16G_xypMq?AR-7r*zP9vQKq)?FJrll z{NCu~A~*RG_e_|b(4*0(JWia)F@hbDM(J$-_L-xTX`=!smc+fsSJe@iCY!eZs;`eRqj2L{+%k(2!IH4J(|TtqPOZr zrgeA(;z@GpJL>)S?gZ=2oGSQdmL@Rg++Nt15(@AN=UDkhv#OfHT*(3ObD!i`Hj#Zd z8(L&@mE9r?kg5Ml&pBANL!Sy@c^I5D=dK&TT-VMj%0{;OEU>(gs|v&I`INKen^Y2V z8ipNc_z7Ee9oeV{6Ig}58l;<3x*NUI0#;&sJQo!hIQmv{6vT3RO*z)3ZEZKcHO(a1 zZO*jR*&6UcLRHXjqQW+{@B5HdqicENp=q1+C7%>Ygls6RQXpZ59l2d@m>(M!k}NEEGzpAd*<~L(R)5va9$#7`Z6Ha+|D}x@N25HH&iy9{Wpk_ z5dKo~ql%gjKY73eWOqXlJA4lM`QG+)5}(HJWb?&lxTyQia@BGJy2zWUw>UC4#DB}q1pZcR`K(zJaLU7eUBsjPI zAim*F$IieG1Kzu1vb%2YjN!UB7SXc{7`!ueK(kDZH~da{Eag7yAK!`R<&q%D={-ha z)Nd}D#@8P_RcQQQ{|rxCM~jwLx1lNClv3!N@`f$`bXWPUV&blXlJYK2xzdTHow)z@62yhFCUY| z4ac#D4aVlhP3?aa(`<17a~gt}07Y~2a(wv=sX^oLx{39?A?GnIWe2ZQGs~exb4B%9 z23_oMwpZRcHHeJ%1A;+Hq~KtLfDvRXc*{v1=?X;Fg%Q zYIJIm;(FYaPs*d7AI;+&GiwS52XMfLtq#CR+s7fZrK*>B8I@_}O#8-i4&n3~7dYu3bK%Z4=qdh-dU4>wmZ_e|&6M*;_8y z+ILiZ&VgpgK@3=F(^Pt#>PG4nn-C?-`0 zg~K`Wv}NdIt#xpV#Nv=jS<@s~^-=0B928jzdXk@7y&7gs?qV*~u7{id7x}`k5EjEB zDT#{zpHoX4S2QQ06U5OGDa^{^79eq8_yK+ zvBtt4+4huq{o-RRqc~HO$Qip1o9g3ZEG_%lX#LzTPl@(&e}>v3xoNMwZV;XvB>B7& z1%R}jBurKXbirxH{G!u*DoOxAj~^?7D@eW=DZ=Y|3bV3wsQ=?| zdIL`Jr(1Xc=_2tl-u36fN+Q#zhwgqptw7LqALV zib&l_R>260*`uYNpg`hkz=y*GxDcTm^y)$77{4#EE0`#{HQQzk8D0iI!81zK!J1Iq zHi-10A_UjY`F`+VW_K34^agDDiR=jTjmpP>91)mMQ6N>@6+%_Q;X^hS7yESS-1O_#K4CMdVEokwB3{ zqtVDFd{w9DJ+z+m2cI{>DqamHFB}dktj~w4zcH%(5|%^ott4c3Zwl3Y9%T(N5q%6< zI%XGCe*%PnprtbEy?ujYY3hsWt_7=|SNuWE2DadcHfn2cx-86^T8AP~xR% z5FEd%nZemcMUsjEq0o`L3cZbb>${S)ms;9b+o+aRKU@w?G_|gWq7<^S$R=V^-yQ_| z17@Q0z^3s(m+>XRw+w9v_3cK3y}{x8An{w;H!6mQ37 z@?0Mwq^qFvr`=f(NKq{?!?Rs8ZtcL!ex*{JtEew;y$cuj+9uZcN>;YLvZpcg?(vrE zO%_7&0Zt@25L=E+FD|!b!Bi5yz`P}~c_nF&7jVu!urd>$=Z3POH;?o5vNj8zT4epRpp&L@$3}44^xB59rNg`3Bl6B zB5XCC7A^okO1X?RG#9zEq&6oYLzWz4F?JAUlK%91Tj}_$FQ_f)jf*6VMz&KYd!XC1UcG44=4LcoUq~Ajk3R$ zx}y^hBOdN@A9;F#xiFKk)xU{)Yx%hpvY=p-?&}lbWpN}`)K*ZL9S-! z6^1oZIBC^rW6}7LI$`g~JVP^74_8yXQvTDL{Azgm828N*_iW}KTMX+fX;sa>4^*}m>x+- zM|QbM0P3M-K^Q|7V_RziicOqf!WH}*w3ey`2r7o9MZhB>$7B8%50~ZgKhThY@OuM? z9NK!!`o;j9{|ruGo&m>3L@bG~6AbSTZvh@vesa~{<( zI!B&#T2rTE_*unj378=f=R0Z`4eI4XL1Fl-SXMV%FHvw>u&!yA@ccGQ1AIMp(u-g<2d zo$%>^e%=0pwVI z^f9e}0YUo~j4!>x@b0OA*Ows)luO4ZVgy|jagBlg7_6{upSg#s1Y{giIQ~%Tb8xeu z3-Vq9PkgN2n5s_+OPts>1ZLb?Z+>+#Zt}qPhknGr@#TmkSqowQNy0B9e(pDZhmmOJ zFcA7}t6+E*wm&0#7(?}yVw|wOMq$DVfi*E>qjkEiV~W$z0O3vr{8dM9>w+E@lRbyt zbQxi&7DQ%>W(+eU?o|NF5V&sr%@KYAIO$QNW)*!+7YMhYb&{&olE}1xW)F5AoE?^P zdY*Dp2`;Ih)qv}5b=5gg$+}lb%-IL4Q zr&cC++i)*xH4X+Tv>F9B6oGx8W|g-%d3$@qQbQG5=n!g?j;bEXc$yArLSrEek$Yaf zOX0J{(O3yx^I&cvUqtR+W{0?pJ$QsS@In3|Niow(^3=Uxef>@dAXHKS;*t$(@~WCj zuYEM;sKLG5@#!m8o+rRv9$p=$9c*e)c85db!X4~mkaA;LLQNZRRdO5*hBlM@hTy6T zX*n;ic@?uyk52uYcfWeFw?}A@`~ljV!DjDPk88pWfFfnVm!uk$shGkMU2fVhwI6;^z~^4u936N>1Cl` z9vn2;d7?mfm!%7HeEeQvgye4_|JLnQp?ms~G?0g)wezl@ z_O)Y+gnQGwnT;oOSH#W3NUGG2_;kizu%hwfcF8iY_AUBqI1QGE_?O)!J@EC!s)SZS>AO;X;VQnAD(y+6wtM;i0SXF+xW&SHmZ2HK2Ai z*qwIg=};gQVu!#h;|sMF5a5wB27d+*2+Uevs)zvbGiKW%+7daQ#7vQVnjAC|@Jg^V zqujLqV-`X*>PobWwm$+|U3(IDAYL#D=p6nIU4K<_4g7-7ZLjj6r*b)$3;3GIvchH? zI8zBjKc~{hddfVvG7*E$Gou>(H>+Yku+>d zXlT{(E)I#;QRE$)2W#3u@7^DhfZGGGl{%5kFEl2`^MwSHx3r*#zrgaHEL4h0a)w-9 zBQ~r88pT$4>!{{T)HPs-w49O*T_5_w*!eKYp8>9Qa8>GHG!O=#qd|7611D9Vy5c5%VRFR{F?c+Alj#x*kE-{OySyN6ULlfX1(+{H| z)((`XBwP7Gr&$9(jTrC4NRe27xn$(ln&MBRBmaTCN-bHlK3wN@tK(R zLuYte(iL5H0CRbVhABd-K!UsJ;Mu;gD{CA4=PFw~ z2>pZ*WDs}@1s7T;lEL2G$)96T3>0TY)me^5$id8o8-&p=K#HF*pPZTqZf9Ni20hdjjE-V=BTs#&CPn z1rTt(i33(o7QJ<}D6CjP(+^>Ww{Okb&~C^+&liIMZ8J0%(u172+Bf^F0{gdINEtOo9?E`?$O zPXAaqC;__H-Ym%PeA5(PYOR{;wGo#AJQQ<=?ooa+XM%Kf|5yedP zQ!38SL4}+{OSEjDoI$3U8@exYD-%L zwO*pvB^(r-5!tW=z7x=>RzuVHW(BhnEPeD|S#q`_Z#cCVn} znKJazl-MM({`rh_AF$-9e%6MDZ`%e;7@zve1@eom2Q20K{_bifzobq>zu4C?%o>au zbaMv2L(Ssu;u3A)E7N!b?sWC^O0*}6Rej=Fyb~AKp#vr8eOek^`=JK`x8?Bf@t2KR z|1u6wc4qx!5BGhUY21L8hZ{$I>E5&KUAR6_3KCUfB|0as_CNq>^JO~+lH`i&;W+s( z%ED*&B!ypMp&O+QDeB~8omb;={?%60DV=b|dPjuF>?a1qf zaH?&|yfkn`Nz*5&LLavU1UEZ8(WKWK!(UmQ3Gh>c^%1UkG3Ts?Y90j^e}xQ9uo$S+ zF(}q)O&5iNluRiy$D#DdTgw1=7V<1LIWrGSa4M1wYzFb&z*$119ZT2;QCeI)nWfo6?`!gg_x{=$etTB%N3Fc_6UE`x%p7Jc-!O zHWxt(6ORWEUl-9Ok(u>QSmxllV6~7{dd3F8*z}Kj4pp7Y*+A^#H!j_mB#9~i4iyi< z;6TF_J9jYSRS2Hw%b_TuNFjQ>dRVBb1IT0O853>?^s<|mG+<3O8%SyX7D9*~;a=IB zS?)x?$rpLxZVzc+g7eN>>oQjEM}iT7hL3x*Li&fMsHr|@O6Q@9}sOqO+r zY?yHy!i|ErgLFeZSi2G1nHtHwJlfADSJgLU2F_aId`#-NB>yw*i~6-oYQu(Q&qpdD zjf%Tyy3A!(5nmHV(8#lgUJg{4hc`=U0v%fEI4glD^yMx|H}^gY)FJV1Gg;!91hc<&R`2W2&G)`U-XK2 z5K{?9`lUR@$$XS5{9QRmkrux48{I?Q6NcAQ7-ev~bDebc1is zfZ}v%bYhX4@|W^<=V@Oa`y zGG_kK>D^9QV`MpsWJlj9r9yfGIF%UOw=W=>{5liynf9FD8oMQC| z#k6dDbLUnn>7Xd-#%BgExlg7icNr(^vp%lioqsl4+O2z@jntDb=|m~dwd$Mv&3;HZ zS(!98>7257_;^#(#uH>3?_}&{)PQbeBS1T#YhLr(^U`ZiJk3kz7~2$|#a221?O#=) zCIv}A2AFkylkBD%%U@mZlW53`Mkkh~Ojl3+m%DHie_;(R6b~uBB*3;fkL0&+lk^~T z#T>85*)cmZQ^(aJ#(Z(IPJQTqSmGvm%IsJGRZ=hh2+3-CJ|nOcMA6E@Ms|{N!d=jy z%#C{$q1@izawsf3vZ62-NiIw2&|%SbG1rKvl&$W~tbh8advMAgU)wXn*36@X)#I(> zYmFX?7DR8D|H*W8Qeribl=3)k5Uju?v6uK?gW00s(@52t5YI0%Fmt;+qf!vgoG%xR zPXC=O+n%fu#~8crc*Iu^sz%$&C$kV*imfx4)`rxMJfnLPPajON&W#?Qx+}g|F3}Fx z==6mWl#V6HWp$9kXXcovi%!nl5$U(X*mXH`)r7CR;&lJVU5zut#{viM#8p_Q8Ci%2 zqE45PxVodGA+FIErpCt}S;=&gdy?ckVRSI17Y-|~+%!vDNx}0(nB~!Fj^S|KCJJV9 z$Wq;~BLP*o=Z5N0AgK~MAj4ON+AIYRSfy;qCvG9&Eu+P0XZW_~1$wV=YTayOka=Al z`Ua|{9;F6@1ktNpH>4P7bx07dQQnV zbhq;u%wa5Sw+unAgb|B53an;Ngri{hqFvPq!&R~bL3zaiXMl_*)KR`J;s&i2;z8VB zMO1_#!$7v&z+s|DC(R<(F$mMh z$Mf(LhC)?NBbpRKSAcUD#Ga_=pGoInh`)Hg+oYajQq2)8U4qR` zCs1Y%S|w^A@g)Us45m#J?f7J1|1j|3jEl~epb1;*p*A$#xjkh%Nj%*6;n>8f1MUETVHS0z0M%{@BPF5)0ZOJwoj+o z3-2_EJ?!|t&X{G4i&&GY_O&YKda=vBA-xpgrJjj7<2TuuPZ zqGXF(WHTsBwoYOvrSSg5gS*M<{ZqSH#n0w&n-ZOyGCLrmMZ7vR@!^_^XS}f`+<$T# zPe0?m*?RF=vfg;iftv&5DM9;k1+2+5E#ocC?dzGJ8k5HUN-5?^j>ipePZ1nq=Jo2a zO`1SDA&Uu8_K>YdGr=*kXuuNJM)6EBKSDw2Z!+(bS9Q*2=+yy8bkbPiJcqQ*)O^9l zj2QP;Nn?`anUWtTib&zR-=Cc-Z$Zr{qdLUu>c#I_Tye7CcITj8nO4Nu99Fiw@;h=^ zzS*9bcz|Mn#$y;jw(*7PpWu~$53xByz5Qo@tj^-2A!2cH+3#vb;Iop0g> zWn^>^NrTDp)rJlo=N_XB&mx4Ac$EK(AvoaLVm2gbO>iTVeygg--C590fFhzh$Jx$# z4i*A+g^!RkSv66C$I`^^2gD$e=k_y^5@j@S92V%{8kXYo!BWlqW29?HrKip*Le*Aj z^6i$zJU$sf3XCqr-n1%m=+U6tfjzTSM0C{btQ?)%28J`eE)w2{v{Qr$nu^PTk$erH zEetkxmu4@~r5G=;{DAc{$f_Y}=!C=Iumu+YVk>L{3y|hHggAon9>9hm(WP`HU5nq;*y5l{GIn59Ssv%#Vg+8%g+tK>X; z373d{&mHgKB!2XDmz@idW1b;)`?P+sZrLdHzFXFs-+?+c2 zlT)-dp>|kaBKh*TxJQjylhfl>daW-m*R)tus`ukpg+s8GwH3dcd#>;TQWePvS=#ns zpaUfh9|aZ<~_Yf;^4W_Aa(e1h& z+*-uEi9}|0#O0F=_>yy&5+1{7tY>@s@_hQ+jY~6gLevFt=!QNHq7?ry@L-6i9lB+t zNs&|9*9?HxZ2AsP6Q~0soPEzHWWiMv85m}$;lGf>&Ue-F)4`DiXM1g>i^W-uBYz_q z_S1Th(aoTgoqM%G!I)Yw$lrzcGhS-l!_8+VrGMNA!IEO78RDN#GO zXtBXwX2Ia@(e(b0f7-uVFq)k&TUy>U{blY0apbivSQx(aHh{2@wnOizELDrWPw?Vc z-@`+nuFD!nC!-Y^K`f)B+4`DX=ZRON@|4EOcf11C3DMKc09HqA70+u>9C2xZ?;4Fx zDpSter~Dl==G!=#B>oZZmYw1NjJoY(#f5|G?OS&Be-g=GT21myK>YA(2 zVNjh&>o*=&3O0UtEfSyhCIdfN)px65K#H{LpobWsA(G!4J#bQ2zpg~1e)xL7Y)SH~ z>%0Qxr)s%rxO2QtXBIYG->SS~Q&tJmxZeb}FCE;pCCfP7U1qG%g+1``*}V5`CH3gY z^Nkw}4hMGu#2`9+3TPJzdJMOrOYWZxCZ0x&TZy%lf5xm*8y_9MW6w=RU=oGhx{fIF zQnganOvvr0%@pu?G>|=azIV|$2;bU{`d@3Hn`_Dp@XzRwy@xP4a`f?q5m~m?l$v7N zUKy&mXRrK@yTxP=@l0R_h-#1J=UCEo&qiEGJvLy8Fm@baQ4x|k+`)(C-K(mXF4__u znG}*%>7{Qs>o75Tblzf8YOnYrX;kU2nEacU(Iel+JD;zHq&eET47kTx*pLTRI z88|n)dod*@aV^(GevhZrcN_nXSNJTs*M46(W4+A@9f|{oAwE*fHvjs9$F+hS+}00g z>x?S0tzJD#errF-Q;fK`nx9<`*TePQbe)(Rb}YK{f7F3G*M#?m&b6TZ%n44|nOYADh1hT^UC6OzxTw$S?Pf~OdzxQ=4YFvgo)(IdCBpEts z3}2RV3q>Almv|C~ldlnMGS{Y{BGJ|!WlmM)($ToM8Wrtf&NaBYSF0!+NZG0(mZj!$$Xbr7>h9s;URXzeH~@WMC%yEl8bn^EmJM0-Q3WnE=U2S}{|F^Jg} zknN*z6G+$~s>(rabup$4VWXf6=dBKY>B>0{jxikW{(AodLJumOBZ)gq{04N|BNoUo zSrW^kjbdxEXRbB^SvaYLCW~g_XQY=w|=+cIUWJVj*@de%TOaD+xMlyjO=Xh_jX5;YP>Sc**fW~`bov7<3ut$sN4m69DMq9-B8-f)M4N`~h3d}% z`M(9N=R&+?V;_j#H*o<_1#QD@3CL1qvVirIO6P^Sg$!AwaSvsFZwMGm<1-v?jf@ry zK%@lY7n4Fu7D?Ej6TeDNYB9+9i0HwF+fP*B*`8(c`L_v{xT?N3h(F4<^F^9;eUB(T zq|T7Bgc3&WSZ8N*>!id{N9qS!*q04_u_q|(c{vx?9mTl1eh|BHVvdF<#5gU-07OfS zgP8F^tH2e)ao)sq+n{AYT~5DHhl42$X4$if4q_S6kv<4y8e%Q8#f#XtgH55WOw%=w z&RiOclu~fjz{3P4i1q_li;P-yYW#8&St^5?CcM|QU0E>&+ z@eT+1S}PNLN&cZ_DN>u1ll`Aud1-O-zxrF>r4A0aZO-hBN&_&%duJeD)i^q(Toac( z79)PJ$Eb*X^8lFkm!$`cqccr8uZ0@L`{q9ymjtBPy)o7&*s_0C;U_##7hSuDcD2(^lop2!!wKhBtML$#&nn425Eg{5`H{-lC* zb2g|fCv?Wa=i9zwW7enZ^~$OwvAg^Z`s>Nl`NLWs^G(VS^ZuD#Qxz#u>YK23Gly`GwymMKQ(=X~)^&9&u6OxkUpwy%GFZhgq`>P05M)up}u z>B!cZHbV!qjka6=$JKNHyq@b0k#&Nfnu=YGF1%Rg=CHGNzbU_#xiIl;i2nK+>wA@> z!}n5HtdykccO%=De@MRP78>Z?;;6|j2$@CfL#>oV#@JcoS`|id#xGcCDi$4b?xsWgxj{oojfC zO+Tg_U1f_sQ^Q_O$3a@Th6I!?LqKPPgI8Lb`DSDq)#};X#E8#~Hw{n!W-n4s`o;|# zxyd#k{@tPtA((UW2fGr7yjr_;^o#)4b2f?NJM-mD?gL553f?2DsSOb=he*6Z(r=to z!PY&07hY7$%)$Nv_e0`#nUhlY;6>RxIW>uIV*k;4PzCTO3>n%`R};wQDBHEdOP}g?5__@4>rZlY zA!s7jAG1Z>A?Q~2)Gw!}lH*7KN-f5pLmeoJKG%Sr&Tcale%Rrf)vqJXE81d| zz&}FOF4uY?1M3>XE>-NWAxdDpULXO+u-m{21$z`yC~x*!bVlLeg@TP(nY7gbY&86H z$KJEq+b>u<=fMjlxDv~gF#0ma;SgBj9N4c;Nq>psZO0V>dIio7Q7GSAhq(TFP*qgt zqsC{N^Kc!Xbi&S&YBQJ_kfCetq@mF;8;0|+K9GD1V7*fP^4{~h=b^gH0(fD&3dC?& zrv$>k68Qzg4H0fz-y~c#{gV^#i47250jwtua@82~hLFbvx^$?dbWV}356pqfo*Gs_ z=j4L=N>lNmhy#EMOKO;XAINCJLQp2p5SPd=s2)@oZ9)wLcW$Hwr(dXp6XZgN;999G zy56NyrsQ_t*hZVRfV6?14-Cw)_?i0&V%zkk1ZE6a8HBJl5iSVT!_82e8VCsBh6?Z` zLpAx``Ij3rp8Ovd0E;4w3_DjigD=6jLp*gbL=mRY7ElTrX5r2Q9~fhh56&@cT&h6d zU;xO?rE}ok$^Fcn#$^Qh+v6BZa=s69IJTA2o4OQYCo?x_BYsV`!4hJ}>0v{K%|R1r z9wGJEr;>Z^o%Cia;8FUYA_0^?u&}F|@at^$zNVgO6X=cPPK?d}vnjYkz*gAJ*)k1V z_2^-Ojf4ZKJ)ik?d!eW+{(3E~hhjsG++&GBG;7eu00$gezPW@0j*Ef+Lt71H!M9|M zloLbZn|-ec&h>US=V1Xi^HNi)p`=gvOT_d_`Ng=2uluC4Q&x?x1JlCrfJ3l<%3sK6 z-07v2S+bt_L2Y!Rz-nO3ZFsxny5cokETI)#6P~LH6V793Hp;45Hn8GX9_gDX?$NYz ziFtn6HTZ>*KKLoeVXo9r7!25tzbd{oU;f%au|#pHf8vnrKgy5e@wOJJ4d_*-OcgLe zwuzg5>)vkO_wfyFv6Dfsbq_V9{wc9iuj78-gjzH%`J0FRdLe5fmoZ1|fjQ+c(=pk_ zM*MG(##m2B1;-jk7jQ@B#0^Rk>KUm(qB%8SwSbSHW>?RtN$m1Y6S;!p8clMev~1ZH zbV2qUD2g)fH(AgQo%%G*RobMSR=!`sa_5PhGHo*$d3W6m99+`Wq%!A>0UUu0ODe zT(jf$anlC8v-ZkM$~Dz1qV#>CSQZqs!aPZ)pYkmV_f9iM1iz5+%^0b;L2P zJG-(_n*pfvX{ zUAUB7%26YFJ$w-KvoNB1gt3VJZ3r-O58O3?t5({CBsid25pf`px_4lY=J3|uT5Z?rh%_bIhpJ2elfyW`_;Uyg>(eHiV8L3&5f2W42D%ZefzP|qBI)So_SMxTs8B*s98uR+ z?La95rTE8+%OrP)iZn{taCJt(h!O|vNtkes(bDRO<|Q?!Y2*aiR!cn5v#BRacIU@f zH3eGGOKsWy=!O#+wdBvk5e4zVP@E)&5HpMsfJV99hDpG{z^?_lcP3?#v$-X<8mOx( zS&IWa+yHXlXf+-ov5bYT5 zW`#Kv6x+Q%uwx0K2HiDw zmazLFM+M=E<0OI0s5OVXcPKV`2U)p?RJInvi1SvW6C~}oza`#99#N-Z3q!%IHY+{e zj_pIWOs;6r0d<3qPID2Avv+)b0cTcbx6A~bJ&?m~_)&o9Lu40;N)(46Vz8HmS9&E3 ziLL3>Qcj(oI)5>N-vTee9PCm6DSlx;sTmio-I>WpB=HF75vNIbJ%$g|CTjR*(r%C? z9lZ>$h_?xNO!^LM=ld34L~>6h6pH_MGQ8kTu0a+SIT@}L1fI~n4#%djk28uJgxBX# zf8$0A7Pw0_lKY0`)J8>q@+>Qx&ZsZzt!-P3AypNF zdn-U3vaqhM@wQ~jyR3#wl+tICY6U#gerTGZjw@ZhSw&um*_sd{i#eEGvOj~Jp44cN zGR>1@$P4fCN}e5ma$Q=N=%hY-2^{Gi!ZOnXrHkm9F8xz>ukOVSvnGCv6SAjUf`oTc zlU?|mHMCGh*r`Sg(+MZmKkFv0L@4vPip{)J-fPmpjl^ALhr_BAk6CYO)X8yqTfX$C zX9ldPzZGV23TwtgZNiVIm)WxG%KVh#lEmq#?OBHdd>fb!Xd(87*IO zr|$=m!@yH9(yz4an|Rf;(7?+QcCjVeKCe<|6vb49{W<73$2c!*1Ew3R;ll7KN7nG) zjcIq27h9wv&d)|-EpVNs4I4)!UD!F)s6jHJDp@eVHo(<{MoQ=kyFol^F;$<7Ifwf% z=o2n+nox9*nn3!0;K~6RsonEcKew)^ME#nui+Hb;p2Xyoo*v+h`3abPeL_8=vzwQ0 zp+}~rX&1R%G(GTKq*0uk+P$=l!&N2&j;cc^<_UiiqPQ@mAgA_W^AHo-5x_KfkXr#k z-2}cW@X3%q6{;5CUzd>|B^a7&T}ku_3q;&tlvtzs_t=(0)<&7*yq;`Q&}s%(!51XG5Pc5;-pDhm z!WW!0PU=EFZkw(<)d{7>+y?ZS-J4^;6*x1%w0yXaIX@k`YUS zzKDAydTlLprwyvGk_Q%Fd?vsDubS783KxLP!o<^>U#w1?LAjJ5fr-`mTqk=jq%DMRMrVFg)=Bb#RT4qyNC58@VG>ls zKfz9&M6_TVO-agMIm@ZFbk(Wuk(N{VEQzc(F6IrNmWN>xf}w{@ z8G0t<_fx;F-&84Ri#m(+${lI*(#ijLVw@U4MJ%a1XuK>E2iw@`7&Jk+65+q>O(wox z^hZw7nQO5y{JI^2R-7jY9m4bg6wpLu7$o#h)m@=G>(0yrg$-4pLw?{a0VMy0QeSuT$b-x3g=X=13&eB{@T^qhag(UK$*J9H@iSm(-; zX30L?ou;IS?5AX0?d2wwg4(uYW@JJzj+-80{mYsA<|%W3q!7F9iqOQTsevalQB&Fj zbaG&_4<&f>m{BFBKEBA+GKPwBhfn8CL4T#CceJ0nN3 zh#a2)Me}JZV5jLX2foLhx)_Eqpdjd}|g)s`0Eoe)Y7o@_2X(e1y55 zhM2vnXo7*D+u*-jLb40_ZG~k2c<^FhPrgz-4icAiT#~_)J(EaUG^`@SHVT;%&%~W& zAZTqAwhOX*SK72rrQJP#zki6Y7$_h3d?Ms_@6Jd7O`8p_?4I7XB~xWdV^3s-NW7OD z%Z%OMZDr2zF_~{_*S$iRF31M$bZK$msZObG3z)?2psS_P7vbN+AG-~RSi zQ?V#vMkXD;lEgQ;vNf$^`9@)hs+ty3thuiBm~3DS)Pjt)c9)AW_)G zz=)t22?4Tz6@b?XM7`m94L~d4E(nx_q3;)yi&9;`8hFQUkaGd)qvAdU=Wd`KH`zfjhoB<#!gN@< zl#XpRvLOdcKGI$xKA})7*yRsXk)}kTBk(_L{46=l12m+BuY_SyCpPi4h13mLw+Mjp z%w1dUV~Oc3OWNtrG7g@|h@=drc711ry}qW6p2CyF@)wQK=LD);cR`^~vt?-cXK_g( zjGGiPC|EKaqY6(-8juxd-)}J6O&S6U1ZWQp3v9=t9xK3B2kFfTV#+JP_k==!oHgPd z$)0G;eZ<$PD~ddq<3C9pCPLbSgXWM~P6n<;By>5p&jYgZDU7#9wWAdEkyFYvM1lj z^uR5@RRyQ?XuF)zVd28U(-Rmqk)0IJ+eIQO(euHhi9y9u66K+M3@l6%L0$~i41mNm zU1h+(et~6d_Fs|}Y6e2qBHBI-?z5H~m?C3c5Z{aO&9lww*y~}h3Qch^+H_OkXs$se zQykLK=zM<&pTqjS>KuLAa!7ArdkVcQ-34V)Q#Ps$$T6S<2v`y4MWuP+O*4c`U86qZLv{UpNx|4Ti^B0$ zg)M`tX#Dnc!>+QbHkfCspt#gC>p$cHcIlxcG$sHkNP)SWb}K30+$A5V<$*+*H`PNM%Q-wa;FQ&@5KwhlB`pRkBRgk$&VJmW?ZOv z{&Iq@_+8Ox5%*WVBg~z?jlrI89<=f+LSh&1AoCI`o2?^h$EIYVG}re{onj=uz&B=* zNqs~1MYjT~?@(CvHEd5A4S9Z!{>1NnQGBM20yjgy@57wuNi!X*0Ff9+DaA6VQ8(sT z8U8N;yzKkHmQV{nt}nUYiS zqPqSX^ajHNgRXhL(bKmpw3h?vjQ}>iPlIX^-0mjau{`+Nj4y1%Vr8p(C(Qd=`y{z_ z^>t!CxWpIT0*}nz8$35{ZgJIb?aMI-Nrp!1L#!@+mR`U^sRUTeb~HNtwAB-}r{5Ay z>JG$zvcL?bi-(|xuLl6&DZJ%YB%t~vJEs*A@he;a^k!qM{(3CCC;q7x|G zH-v;boIMg+G~j4WyGKw4L~&gmc8)QXj)3n6Fdlnl`i@cWv~q|bA?_aqb|An4&lmuh z?z#o+#1O!^p8n@GAA-v$g9;K2z~l48C8M|m$&c**f(zs8Rq!*@KG98l9q&v_5AR7C z^-IrZ@jEi0l8XYDEVNZ$--K4CgSZM3O|ET4zi#F=KcNt9Y35SM&CF}8^vnD zMpV#b=gkC*h>VH>J4B3`8m7SR$%Y4bLLdbL9x{cYC^*A-P5~xk4KPOBUnB<92E2rP zNJXY&RpxZv^Er>?v9-N@r>vi<46S5tbklqE@aKTvUAJ$gzt>GId3v*+b@HZ~dgRw{ zwr{O4TDJ0cXT7h|w}r$UFa7TMH+L%5|9o%V%Z&YBZ@6|qH)4jPiSx_T=laTzy_}l( zqVUwY@)6n7(+-~W%+`hx+Be6)7pxJ@vk>(+2#@#=%%tuGRHXbQ2xPz|s_zyxRvXeG zu?(OiZ{R;LfxR+Jv%bMc;{$TK$=@lf!8%v&c_IQse`OGj8x>lU01j0Wt6o6LkWgdn zh&l?5LX8{Gu@AHd(Dds@UIRKfxUiF~j;zEgTm?~+T_jM)JOx5{6-6~NgOagDbZ3xd z5YE{wFKb;Ltd}t&cm)Zob^ie$aNb{KOQ+lqD)zN7_~Zd3S2A$VmCgeCJji1I+3P`tXcZUKaB_|;4X;M1Hdac8K ztWs$D=2DFJ`{O3>MNkT)cW=AK3AnuP-$IMLy2&_sca-deyrC;jGhB1%9w=EHnd@?w zyWsw`kN=LBT;A_72PX34bcrBdYAL-|I92WZ^v`{pgy#Qjf+=bU3`oP&7aCSa*Ecou zv9Ka*Dx7);qjy=W1kq*bLAAz$Qz$0twCC)2& zNHDQTHhKrtyS6pgWj%EhJ+Uw7vbeYj1NjT?A_wHS)r${ZA=6*C=Xy z9*L$#j}=byV|il=^Vq*?Ts6PA=;jH110JT^cuc7J*npCDXvRc;ye)Y;CfV(x7_Pff zIa`&|o*|lN->o$_d|7!m95NHU`z?Y}#^eQN!!`1ny3RsHd2PBvS}r$><~HAs{iCa; z^6?G*6RG@}mdBU9@^e$OZe4Q!0$|=?j^Tx@-3-&qk~A~9OWZpfxpVK7nfy<#M|5!F z0BMmoZrYr%T3JDbK>1`TURVP|JRBcqqRU9Pw?Z2<1n~wkn0ruj+!@usO96@GYAKY3 z5izB>6Gs5Yf;nx)-j3j4MzZ?NA>ik2*)wtsKz~`oIL>eoJ@V8g-sC9Mju9>P74}%J z253B!_Qt^>jRg>yj%TgP=?d#K9{4LxIZkR`*3>RSGF2kUKjQT6hQY=rH+3Q*xNG0w zn)W9x*uV2sCydtl(C0D#8OQ)pyr9m?=^@e}h?wnjjPN2?4R&&7#6X*?2I7vk_P;%7 zgck&v%tM%K8GsRC3#hpOFDW?YY#aWlq4Pf1(CSYM%^k!risAB9O zZhm-PF&1Ts=HU;Na`A-0gam{2E|`*sc<6$d|67SFVd(D=>`-rn?9tW+umQRevW$UE zjUS!8JuH*@|iq zwnC2#Qx*c;@jBgx8zFK@M&Stb3k$A87GTxikQYWxN(d1J7A8rQVIW=9u6x}?p$io0 z#c=+L0nwB+lA}sNm*|t#CT&WQ69nemDomEU4Q<8oIYbmP&&Xu~s9&ZBLQ~T6DHz?O z!UXO_Cg@63iC|Fokptp3z%srQLY|nKA?-y%W5G|F7wRGYPMCrALX)#&zPF- zHfAZgrs3!%=6Pb@JOgipBnfz2zlsngsNWjExUyIrick+eS8|8=NCK+jm#b;E7|Ll; zeRHn@_jDHmun`47>f{WFq|{ErLZ-PbxSyUvzO^ocB_mwXeGJjvS9 z!TQvMaQW|J0$tgFYeP-%wBvObXv5#@taLW&{X=|YmP6v61eI!o<&&QV!X=E&*Dc!EGBbPJ(}Ig zOp{dS@wUwA`o1?KiYI+db>jRuM;jIKbK2ShEt{R9O{%8JY=gi+iFS}IM^+v`ks3XG z`|?>X4|jhpd9))|J%?Fxnb}!0#j8F=p6s>j#MpSdn&x7g1qio5?<3MI zNYu%mA+4Cf&K~%(|IfM!8z2rHEl%Pk?PXcB&F01 zR-RksI=rjz>7Q@rsZleau(kDkBFmKM@l}YbEHX3se4DyX-?;H4?wEIPS5*Aiq^PoP zSX1icDjSS_`(@0#8-99iPq@zCEfL=DK(GJhUsjK^p9rS4Wba8Z5f7mqA~IT_EmE#|S%-1Jr6+_D;K&RI ze1QLC@T))LDJ|JqtV#lFkO79E8U*?uao)BBP!Par>~+@GM89wuA$g;^H7EMMhSsMM zs|h!kV>rZw+SGhHyq=;^bt3@MjoBCQGsw?5Qbrs}FuaX~m=2b$Df+;+B2Di4i~5yd z|L0u{%0+${;29z-1w5Vz3xbu1%vcK@X zj+OUR_#qOlLFyT{CVo%GB0pEDF#Q9~iS$W@H9L(?TsMG%e4Y*?eNxxMvL1Qh@*r4z zINXjw=P)YK*js;?jFP9K*XU~geAhOuqazy`VljF9wDRlFV=RJt3py37G$e^bb`EF; zesNYCyfb1+@{KjE9aTNdRf)1Dz@TBmS2#rjFZtP^az*K`t$kJG9=pxF*X?L&Y9MbP zT+#LjJ|=hr{xK)3;R%V=@@^B4Orrd_Cz3RLjNZRNIj;66ubF`*LjFOFy7bz!Gt^>s z2=8a-C1NxH9IbT+h|zx%QLxWQ6E0y!_jW9HcHaOJMLX$S35QDPIWugc!@P|`EmULloLH3kkyfkNGVS!{-anBOx7S;dBf<_SAgAg z=lIZ?$iv;s!na`ZfWoJ;u{o7@%95Tl_h=s$vb0 zj$Mreb*uvHIJA%!SP36gk|tO_>e^62#wrsv>V3(1W|qZ)fSC+G+EDuf1C^W_i7gw} zED#o?UE=)29274l?~}|6uMvX8GBfE;D71Y@~anmhtd^dU-5Pr+mTkwE@hAWK+Mg>~t=1 z^y3LbhGKH%a)-JP>{wH1pBrO#bSNfopl=GP=T4nGU-DCzqn9?Bk0WUHrpf=zY6-G%1?0#ySx<}e|eqt(;^;kMv}0mswtbV9v;4Qri67af(h0@uO3~}F^OY)M0GDWD z!+)tkz;j-BOzboMb)P(FqDIkgHh3)lcbjELl9wcJ#^l&nLp$J&=qLau zX`uW!dc0cDxMkcto7t*JiM;gLK>r09Lx-Ib_aufZp4K(*k=2F|?dqGZcF-M)unQgx zMQB9J&8ZjusG5tz|CAl{Cdo`<_loT}D-kk|jHl{UDu^%2?QJ3=##r#J(VKz9!GZVA z-0AG-cQ>PKTh&G?nhX3AwXe`|R891!MBhgrs>etlnlni(P%?aY*=X5A2XAk^DY$({@D#BJlHtV!!ccD0&YOdZd`N3NH{$_7D4$$$|q!(Kq69@`C^Q}jWEzla@eIu@RjH*Unw_e>Ue zL1xxp8oj__{(1&r0KYT~C^R6f10?V77r!!xMM!2#XMGB^@Eou34|ks|5{r2H)j%CK zLe67Hu9}M7UP3Gqn3LR=LnlkPfI< zP@V@GMA4#n+gIDG@iKP$gHeL`cN<=^IVU*d7J)IBUYcmJ(VS=!En^nKX<5})mn8^y z7%7DR)X;`((*32@Rql!%f`%m4{*9n;oW>$JqOtPs;$>`^j%k{y;2Yn}8hW!AgWxI- zNz4tSs-jKG^^F=<{^8BwN>zdB!`QJPXA9;bO7lTn#tfpaO6a9aEkVD6yAVDABvZok z;l13l^k^D&1@sKyo`_MBStgu@t@X`zVTolBw5l5Z&3V+P5QDJ?P|J%>8q!uah|s}S zRzJJHjV?xP1$p6ht3FC35-^RC3i*0b2-oD9CZHuOFZ{RkZiM16L6HEr9ThYIx&z+1 z%;wiNSjd@dO4g?x+iB-!KAU=~g;cIlNCsj3CBIUvJ1f3eqm3z2F27TaiqMZN`_IfT z5+Hdq-ymlOIv1=rlHRejft7mRa^UK_*U#xhE>09$p5mw1Y~YjDn6*2 z9%y39WJ7kjeYDy z<+M8415ERsy43Y15`!-=EG*_|U1#Q1wvS?Nbctcey&!uwsaP$)X(L}3J7^|j25#tI zxi&aDD|%@ZADGQJjbw+H=i2v(_S8*H$BJ*qFPQpQeSPzj&2VOc-XnzExX)%;VtLrm zy4u+YTj&hueZZ?oMHU6D*_qz;u>mT1uR z!xysOZKUgBd(0%vK#J)lHBqvvjqIwMv;D)a zS%5h@u~DBHVZYOVXBPhn#p)6RYdtA&T-b-}G=%=}a%xD_lCsTyMn_yfWXpcbRLoGk ztCUa49>fby#iZH##q@|_CbkIyvVy>Ek@p9lV2G^64q&{Bwgeo7{TZ?Zg*M|VVkn(d zxv1=;l=P?#F>COb7XKa(;GLpDHG~@mk*VaK=!ZQwv-pYEH(^GQNGgn*klMcQc~lUZ zJbNb1kE~AS3ql1u!QVf_&O92krhaig$B#3UF$<^u0QTwxOcL9uy0bbQyA7-EyTg;z zqJ$Y13z`;Fhu6meO&Mj3KJ;avLCdiE^@{ffW6)TlzO@Y;aqhCtr#C zgZ;9KFy6#sFd!)n#{)#B4@=4n>kP)WZZsp1C^~zQVjQ-T04Kluts*1#eM_p1nlpwO zm`k5$QK)K}1CiB6x%|b5>)iK=EM$d^JS?Yi?pD-*FS?r(9f5qnC+;Huezr-yc^SCG zIP)O*f;K~VuyidnStxf{O>Rfi(lIwQz_gBn_Cji~AZtods5KgxV`yO7QgT z6urQ^*-e@xrKU!{_5<|7P&b0~ji2<}^+4%Qa)`YaX>;%kvMhxQ21C=RIz#vFc2@y! zByGpN?y6!)MJ>j3>y+g-_*6h(yfs4EJUJ={EFfRlBb}PQN$k}x$+L*KbdIS#OqYb&f2qc7z@E?)sZgC`-Nn*yS?{|Hp@UnUPX+rw%pviOnvoxC>uIr>N`D3^JfgeL(fAe&; z_S%k=`tD7+#^+(gm-}j&?;BO!e|cW~$u@qbeBe21YLPRJsx-&jm}RbwhpqlHaroMq{4TH;*3j%Tk&r*aM*9 zSlzENg1Pe)s8NghaL7i;EtC&3mFrQ|OV zmL_4Ky2~%70)BHlj*>+-qkt1bp789}p1s_j8w$H|@_-X5lV2+^%qp;W0G~BaYrv!z zdU!I>5h(mA76m_K4{Q6b*1hEh!tF^c{xDXmUavaIgr5(z8+I_>%=h{o zyc=tjmQ5(OCXXec&cxt>aOw9mcE{N73fLXUn#uU}0(iaIOv+nvpI`c$x20_9hjBp&-wex=L z!vV>GWP7I;q|!3@sCUsLoMG?B)!jgD1Oc^Bt11N$l>LLL(cjjl%y(K|zgL;yjeaH$ zKqTBp6=bd+PpGzI>WL*+=otal2QH>X#qz=aZ-`K;0reuB39V_i^~&g~+%$wl1X!}z z=q6DTg(_fP^jM!Yl)N>lrcFF7cwnEiETM|{bKns$#vHD~zu{uXntp*bJEY1=v>3+` z?uDR!k{t+dQW0Rg(I8%ub4>JIUJ@TBxT4_b3I+tg&|`>};uC=kL9QQ^4#5<`>jE43 zpKuCA_y#M~WG|cs1s9?+b@MYkhsKdGwV+%=zMJ{5c`==gF+OirD9N;_L|{sRpNqQ* zr$D952|lvvmr5)cs1?|gcyiE%615MYaRiAXsQG{8z_96!mqnk@6q1G*jHUS)d)&H0 zGAJ)8$-2Fw08%&5IZ!@>yD)pl&3uAR3ffdyVgg0n0DJn%umH(U_heY!Z{jUR0%AiQ z$C%b`0n>MD%WclyXp?cK+&xnXU6)YhAd`!_fRO0fUJmS-X+G)%n!*Y@;r*b{f_dzO zhWdU1x)F?r=34lcag8#t0ZJk*bgRF|zH}9YM>xSLEEU`f(wd^Dy=t69$t*svo#T4} zp5Zu0IcB~}kHZb~Z6hC|y7ISHRhj4d9e4O~Uk5#wUpREo_2a3Sj~Dc-+Y)^qV*8B| z!WW)2I&z-9!bKt<8%VDmHxOwDO@)iv)l|z>UB`9%4P;k?8g#j0Js8!F3A&eP?nQxH zFk2O23?FJ!NO^k=%(N&77zni*vG30gQs{*-@I1sY+bM+h1}gb;XyX zYV-Av3!fA59k18=T6)*f9ge|CcvAF>hs%e@V}tx!$%ORNWUPAOGLzU?(VHQ+`iK3g zV*^3cSA$v=|5UoP-HvUkL444|S`7l@!o1}dz=A; z+o!jp-mgK6+LXVm`qfhYqDijeoI*2b;y|2s-N!q%*Vu__SLk@;#l(}v^*S8Pla?QH zkcehlp}7Cp_aR7hx^FyH+Sw&_E;#+nXNxuME+phnGoP!i*8qX`b;+8x2=Rb!oLSv? zkYu0CApULN;Ma}Mnebh+9?o;Y6Xj&Ep$q zNf6#r6yo4l?eN?uxz$gl>F8v^;r<^b&k&a5rwtSVweNIe*M+O;^!Kl8xf`$siJ};| z$CVBKX#-2=RyaFEH_didlXnJvDwLeA8yu1T78R!xeFbX_@V{ea-nSqU1I=5K0bQVy zLY(rl9`%cy{3WU9Cc-ZGb86-Z+Ve zS^w?FBQGSE!xanUSyAu53@2T`zQ0_Lf} zd<$=nj9!-(>G?%QK?tsW0UHW=7qd}?Z@|$I|EAjX)j|d;xSaeHgtbVE1J^ir(|soG z>>-xgUv%go5wqCD>#0{=zV#U?D9OrD_irUkRa~6yk^3NEfkTZdf3dYi(HiVmLB;}0 zw@K$$f8H)RRehw}if-zmenE$Q6#h+v}U$PR9q~QDmkw_Wzq;>sMpqxcOHNzsE zH3xVNc@+Ac{Z&9wxZZxL0@`bvAc;7B(id_ZbnA{M_}@$UgAU+9Tp%h}hDV@7Ho5we zAzf2U%-xk8t2bIPcrUG^t?)NG5*6}2!SBe2GS#ABKoEXW6Z_S9k}Bn+X9fc*JaWp6 zgLi>;lMC3?0+_EqkGFBTv^YO$S^NzxF-&5FHCQuu$jmtv7GgVCvDU_sOBj==4Ge0!;` zwHoKTC$BgFWmx`kzg1aS;cQf+oy5R_%#A#p!35YbPj|P&XV;syudcED|5_Fj`gUdx zQ8pxb9yVN1ntI_O+=-whf-%=Upp-G;hgjF4za{5WGTQF1c9Zwdwp;eiB- z|4-sLeI@DRCSevBW3<29Z_dnR@n_nsGLy(BMZ6$MI&{mYpTvrr^PKf-1@!pU@$z!n zIx>W3zhD=+=`yQd*Dr?_0)ty_zbl{ea(RDa?9FwjGcl)(Z9BD23pOP8Rs@_5LBHa7kD75-%=`sIm)#9C<{$F!ZR#<$a^^Lz*!{O@(#5 zs0&Uhd4&TbRek^C0zj-UPE&)K=1mhFrsPB~4#zFB7dgi~M-7LB1kD&mQ2?w`)Z^Y# zCDNdAp{(DsiH|vZHyz>Gu(u-McOEPtP>bC7+j?-(b=SsJMQ`7m%(#h{6Vkf=V-wiaM@u}7X-_teQ{qKErv?qb(l16P~0$}RJZ z{u%VsjsKEO_zwi>_gD=#Za(@Ekpkvfo(KR|?$atE& z<6EO&u)*~fT5^z)0|@ejVB#edwVX?uVs12?5Q%hZBq?Ai)b)%trU1K2+;3*3TUK1R zg1{8W{7X#RP^<0_)wrTbT#yK2LV@i9*sXcdPi?Kp%yT~V4pAd#PoW(XoCd=PqY-^N z*yl{geT)_0U}5`&ELxm4hM`B(OyZXTv2Q)i#uSQq4IfARSsUcQ4U(2yXJ8lP8)Y5Y zxY69Yi>#l01JOc+C&8~5EpY|%1k50?hoMY{Ypauo@(n5V@38?}6_PYdi&0Bk)~@8yo?2c!aMki%fnKXRDp zo^b+x=X^U<;^%K`f7joROn!;L%1m0gVKA->!tBoCCJe5zb>pLqjt~_@LB1PL1)I#6 z@<{=sY%t(SkD*;Jz{BPd{H@txm_m~8S^afDE>ysXT0EqzzHbEEnC#K?ULp{y@E)XY z?h+NRLinT(BaKIy)UQd@zgPck6K|&F+lHh2pH4K_sG(7SO4~EP0W>T6bO7I&Ie3&o z`7SdT06Q+fxnn{Iad;@t=NJ;V8fuq+Aj7U>0qp2wFR{ETVd_^)9gy^HEw zCflTh@(Q5Q_ZyRGq=N^2A=NS966`*RuN4t>3GvI~LcgkTCF$pJ^g@QjrR`^Xr|!iL z#>;QV4A;1_kMYu;)z8aBwXlr-3!{EKxZ0#)z8SPO#*q`|NHY~leU1Fa>BhoO6MgOB z81Ob7i~Yy9wZ=De(cTakmMq9wjeUD%hB|pk^ox0~qEg{2e_|uO$(@W+Xas8LZ0rqi zzCw?kFY)O6=SJ)k;7x_{eT7fnHB@sk_c_E3MRVLbBb{5kBPD5IC}~XLB>O8!B$dhg zK2o^{ub{|;uvB$fwB=S#>{@Bto$=(LPhZN$;zyEX-*-hD^rW*|jv85SCHlZx%oDj# zWrR(Nv_Usg@jSkMhCSBpW*XZ!rGt->nDC~5m+Qyd5tHIS9g{Acs9Jl!<_aem@Bx|a zvq5JKnJjSZU+x?CRxO?#|JSKLUeKq1T-*NCjm~>H-(Ho(Ce@iFxh9bU!5euY@J0Zz zO5zGRGt1jzyrU89*LVnVg~zXUg<*WsMAcwG7|n-adM~|WE#nnw`Y}{Dn{LyLnLNgA zj-N89OZIi_zhW%(k{ar-gqZvA>{-pmf(9clCH7^I!nF47p6M06a-%|Ro5#%yO8=g1 zkK+Or12i#78)C8=&U7t)I2k)Wjphp!0#WazY=5A}Wr3|0K)AG!6pNJG3~Oa0rrMR@ zI=QHiw@3a@AK%Gk{UHg-PVjkorxlVTi=&KFK}ed{$^KgG?s7Z^9{lPTiY5@|}Tt zfooEr!y3J5Y1n$OXidQ)A+mOe*9353dAAc$P(#Eo;x%LqGds*Buk;X-BLkXSpko}b zij2Vte4+#sk9i!;X8BtWqq=`)P4Do8h#n_kVa&fKO)*SGISOC2$Sh4NbFRgKPOXuh zkt;EZRGQ0q({9+>V;5;HPA!eG<9opl$i;$U^8mFe%qza#C|q`i?Uc&jvh443omwl| zEWjG*Y^uRn$g8Rj_b2hPWqS&xZNi-gH@U4!&1pC+v>l~mQEjLH8a2!E*#^L(40MN{ z+>Oi|DrpKk?z|z*DU|{rxltV&0#q=m_cxGzE*2j%^2E=(+TfYOU0t68hbdr5e4g-D z77N`I#K*xRxP+j01EFhb>g=cq!Ok?-%rdW;1N97HE&TbS8Fp=Y7`_m*4&L(O^ByZ= zzQNSMzNyqrk8D-5sX8g=PY(p3&PORcJbs*jJwzl+wM5`BN<3AGv>(tOeE8W6hH0}J zu%)LdKH^+lCFPPcjJe6YfGCR+s+?bBbze68s5VAMrcm?=J_HI}aMe7Hp)Spk^Q;*A z1|CY{D!Iz0WfhSkbF(i7*TDk`YwHnkO=QUH5PTT~o+9CwTt;HrK@!MjppqjY1Kd`q%ivp4qCiR<`2nWW|;F3>Ph2O=8?eM?kMqPKoe;nDU*)oVbX7?MKtiXdlh&Q}cZp#W}- zl70lLm?+1q@PL!cNYe#ucn1?2M!^pp!N*0m(6VZyj|i0<9FPDo_kCvw`i0vYt`?G^NrzVe#Q=ryu1StSX~qQ-1EA|cu7HdfA)-hNUk`PKlshQIM*>I!Yp>kNcMnumACZC z=Y}iV3)P3o4t6z&xG#Y%=5Cy42>sKyx|r4e>Z>{e+)nB+{)rL) zb!Rg619#ZGynA9#-9-F=5Iu=VSb3_>4${(4=iu$C=G50~ShZ~TeAw2`zY*IPr3jM! z5~L8yF89ffa(^1%qSpMCd-A|KvJr;cAX5~B>CX|A4ZX2qY#dF@)KL7vmaUM#R1B+e zr$HA!woxmIQNQum=2Pn#dJy7;OndCxDTNNX)az?MuoVHL=gl2dl4q;V6s${Bn>mZ0 z!Q6|QqUwWx19NV< z{B3I9l7Jy&6nRP8hDC2P-qCLat^C0nNk^ajY)tF1 z>9rVaT;-o3w3|!AsD)rtMCgGjNxqw~T<_zapbcn3#b6<1l5y51iSi~vhfXFekExhv zVei+#>R=wS-Bd1Di+elvIJ0k@TE~hXt^^r*j?L^QEb$C6#}9+9R@#Hw2coeT-93qZ zGhAZ19CGCl&42=YY0I?3Bmf%_RB*(}fmZ$+gaj$t3VVCM`#=#@o3=NN1cbqod^;3g zvahBqHC2>o*XdEkRugVZSj}zCeJ))iaWB95>HUm*-~6$3{_E!Bms*;G4+*?){_DKg zLd*XwJel=tZgW+`c9r7qF5WY~xcMjA$}Gxm*Tu6|{A>PptGEa@qqO;J_5F`-|I+zQ z=;O)L8|sE#yS|IM_v5>5^FBE2y$oAFgQok|`ixm*M)su%_0++W<;4RH!h;J<1A1R} zbY9_yH0A%|SDiJOQ&Drb$=@!~3p4E`(h30;ZM&~SUE+&qg(5M4h*p*W>!4!Yf38UrUI58*CBGNbc= zL5&^qEg&wKAhmk{^T%A_=M!@k*9bK-uH%#EJ#XUmDUsG~YGcYL2 zDJ78|N&5`jL+F>6)#E@cA<&B46zq+uy28pyO-rRRs@QodB_#qs$8Vw`ZXdlf=9L2y z(*>3XJ}C*Ot+lm8;-m({hPQ#>tJwNGo-ug5*(D@qry~t7W|4FIpHS%LZgdQ_9)&4G zr~_WkGnM5bT)|j@beu}|A2C-FnTHz`j*F(&**7JFT5A%Vv)5yMg$|_hhDVHPwx#_untz_&J_ok36cHowMo; zn@S6)`f-jSErk<2#PLgvUIHXA3Trt}D74mO2w%KB9m&84qR?uJRs9=O&08se8Z8;y zoH-^v{7xu{!U0VL*4dcj7ZEzp8Y#^y;LY0%#m(W=KU3y(^7My zstqsiFJN3oW=qBucNc0f$l^*lC2cULf0Lyp>`BhqThZ2<030p1rd1J=oDc2Ct!Ic| z@QRE12K;P_R`>&98{jHizf}nM%Afs++zBDB4k9xnOz>?qJ12EE?iF#e>|NV|l4cv@ zr#1Et_oo&bGU6TxdE;@PuQ+)G@Lf8Cyv;o1D6nmuyl9sp7~BhI6EaTpZSfHA^N;y# zgFsZR@Kf`a1fuWQ-uLM}qOWw3?C-)U_W1p&&^J`V63Ji7jDF=8S$gOoEzmKbTZReu zmfF88<5nrU!{r*3IO!h626_J2r#^|S?rnPY<2E;SA=Ee{26>j3A2~8i*Bd&vM9+~( zyyGrZ#{car(ySYdn%JYb>6)(#eJENuD=OPS#Z0aCeV@Ebs$D0noRFHyckV964i`8} zjFrcuzx9K>_~6`Vz9ex>8YV9&moVc-!sY*ooqGkJ{1zo=l4YQ7Ig_j5B3>_hKn4Uq zDh5-DlF6ZeFZy?JHn!@h%6=f(>9`X4~6(m7m^Fzc}o8{n2W>D%RAX>(fldv%>yK z09U-AsXcK;*NMR}E>ROfWwGOZ9|BqH{=lBus;n|@M z)}Efp8dR!EPD0Pkl9K8w7s(QNTl~j^vVy+Ju?cCAB$*pFfLX%fxqD3m_QU+8bm-N& z3?F)71@}8i!J3*gb=;9DTUC0*y zG^;t;dA{#LYN|HIT#Ic493r>oVvN9zGe>kx7@TDcEwL@r5QlYk4gc6z8aT!fH1f2; z|3@9T?BtlDo|39TO@9BzaHz@v12@`b=y%a*IyrRGB+$Hh{sYZ7mT`RowOXG%NoKU& z29Rd5&|AFNfErnfbI;+L88euUCpiubWR!W-$y?_~sMJ(rdq4mC#D@vdo0YNHiL>*3pv2w)^Le@tZ@o_D2{A921x+HTge(9PrW; zbvfddZWvx#i@8h}kOllfmtH>a#h|UgI%W@sCi8MAiyj$xU1p77%OUOd96;GWj+6*a z^ADVg?4#Q=xz?d6BzNHHIz0BW69JKk4z}elbPRAj6J&4yP14JVzHobc2;)X9LFBPt z>sRc-L)Pl>w+n!4Y!lvx`lg16`!!Z{+DW`84R|i~(eZZI*qh*blMetkpFPTZWxUmI zZBFVSa}$I}Pjm0`@YvJ$2{ePn^T&_~1Xrn;**(cTXyA>JESZ{vuf}n{WP-Unu9*1N zRBiQ->4&4LO=tzVRVIkVO9pKnN2fwV+Xi?$BM+9p%6No*LUJ>YBJCJZktfxK2;s>r zxH~zV86@%gN7&^BhrSIY>}gOsTqi^sbZ(e`^%XFc8lw%$i$Mj)>Ui`n9t92msZ_V~ zEKx)yK3lSz7{ZVbIaNhWe4e|-0)+EOLxxqux~g;^(Uzuk&zlRVS8juy+)c7g>&Swf z*$l1Rsvpx|t|l~Q4&znDrk)6Gs=>}kjtL#g_=IQ9;c!R2lARd6_a8JrB64CT)Fcyr zXSSuE^6ysI#=%sdm92SU9NBmmpT`NG2&hGG!#G~wrp`-_?6L33O zg)GsPST8F1a{rK|4rZx1`=rSN8o#E@q}><90K5l=2~{JoX}d|e3617*fTS$~U?G5z zzcitysx1U!TEKx=C{e+Hj_fpjq4{KUP3>(oT zXQ~!?hcS~O@Wh=Kt)k(H9Tl(0IV>y|pvs_^`EhKqwwv7XB!gwCOFB|&IP6Y9N+2z4 z?;VsV%Jl9KnldU3afjbd<3?c_ma5?UDcFwlk&osLpA^~gaju~zi)BH*HdtC8{^|Gd z;Y!7iWBps>dToXdN1bHCLeI|15+B8vN?l0Peik4|~1FWAjkODhoE5}cU3cfs?wftP2u2)*OR&q^)hp0mZ8aeZUZ7@iRx zbLwY~;h3MJ4?`!%mCf?Khzg7oz1K1KRo2;o()x1AAK?NgMU5g)_gn+Ch}FwgG@_yn zV=4#AR8zfDaK8pWj=X#&9)$g3XRUTm#n$fMGK{^qsP}L^9I+$*tPc!uP zK3^%hKC;eWNd+ATa<-K%Cw2p}%wywdW65RL4>w{5UH|EtDAtWPva>aq!_aDFVjrx~ zmb-_SuFgjFD;UVtWShrCq-wHLQ#9F8CpghN9T_k`pwTYp4YUpHMLfr70rcw?#)fS=)LaA8Iz^tL_v>a1<4J? zVi^BAmyuHNl8FY+;K*adEfkTcpe!3xIiUyi%;&gV$3QK-~Mj)zcd zDZwI*ymEi(BwqeuAeKX=ln0#W~>$Sk`EjU=DrRn?9ug|{?vs{HQ{oQR4{8T3N! zcsd4^`+%Q+%-L{;4wWwON>0I&`+8Gg=9wM-qFo3JIAFb*INlFxoXeb%Q|aC{oS8_l z2t&?a0~-p9sU?0 ze#H-(Ve~}(3SCm9{)TPNYnfI4q9a_GX><0v9TlJ!~U(xA`Z&8ae^70?)BfnjbB&On1UbrI$Fn@csQkE-Wh z^gur~(4bDuDIK!@PH0A3d4|DG7>qrc>HF{rLWfl5Y|3G2;*w zHTjp6R2ZKw1t-lcrY7k&)*bigP`#5y)`3k}s>ggI4|Lv_l-aaX@JTcr+l%Ao6<8OS zL3ugDKhjPazP;6G)?-*R+F}|e$k|!!0iU%B##-lX2<{}_+mxtof*8%5m{*$v(Pc8Z zOa~e*C7rS&u#(I4L;9v6f8%1|UP5e9XA$i(Ww&AC(PSiXDN`*v7(Fhyv~+1y(!Ud2xzAicI<*_CwC)rF>D)_KK1g@#=yDs2o>xZgAN(KaO` zvzpN6>k=M8r}~^KaX(Hlp;1$*zBFI_ODzQV8X53N(N#aXeL1eqCC!{J2*VYkQR@*N z^rBsg^50?_rz*9m6;6&j$)Ch$>MD4337LIYxuxebqN=!Mg0e8wJ7=I!q6mz8|58Dd ze^>X(X4trPz*ySfC9!>?nU?Mq9I{Esn`;A;X@pJ$#EdQ@NwKR4s=9LR_(h68!l%8X z=NP&a`$TwQHU!Q^Wp|wv146qBX{Hm#-tM8xJd9PAZYQHm(6PU&sTAhDTTxT zlLlJFtD1Htx6Er=;x~_Z$|~GRmY3Pk_fJk=Thw%+D?B4Qbsx^5S#q40>$W%n2eqQw z9)E>AHr^w9SSNoeUKc;io@h`ZiUH`=90`V;pdP5E_^6OrNb~E&BWPP>YobSNg0no5 zat!!R0kpp~QVw72NzN)gixK9`f8IxT?zJ!*3WU(d82f;Dl9hj2Tt zI<4>?*3aBx5ZOXJczWf=y$fn5>ZXIFtaAC!v2UAPGjCK@4f1ALuI<#CO)FeO%4^Vf zQhnyoemY(;k3OocVQlk#<3Y5Z03bA}+~ZKyrsgcy*n%fIIS=XxKUcPQ{f`S!TB4fE zAK*C9A`*{Yxq7%7ZNBQ@U+Y{ySSWmJ-zdd{gICRh^^BYSJ4(U z+=2A*_2Xmm0oM+?tW;rAsPJ^v9j2y#Z_>nMaQP_y5$PZk()?ssGNsaF2VQ zS&<%n>{q`?RA?r&c1TJWt9pp99P+2zH{CxUu=j843N7(pdS{(}r zxT5dK<{^rhIFNMKGS>PJuwu^}bXaWS+1dY8?szEr2NE>1Q#^7LPCMKZZYQX=J}t}y zsWDN=dq%OwaS(RN#&X<4HqGYze3R_zzH7ZH>(uyWD#69%+bPZ_H677c3!3nT`x>6Y)S-Mu)j`! zJQ@lXRWd3*yg3GzGvfcY2)tcVw3GYF;i{_*^5$2#Kn>B};##uax56bP`o8m*91c2@ z(+B^yKH0q*Xp;Ue=YS+*2#!3cSy{LY&;RPyPTsjb1TQ*@_kgykGU2mFsd3}c1I7&?M|(+FCz~c{LDz;{yBaq#s)AG`4}%SIDbKS zUuDXsNR)^44TZ&yLQCa+jNL$`rHUFI_WNxyy_9-k|2LA8UmDt^_+Fj-!Ek6Z>4RUP zVB1-S8pKb8Fm7*J z!w8sVJ$5`AIIiF8b5Dv55RkoLowGGroAz)2L@-=dsN~E*qCuNV6K@IR?!|+GI+(DD zQPiJcCsY@?TSNFYdVio6GS9AkfdL@?U5Wj*WT*HR`J&@TtxZwgTO_;2L zP1*0^@(prTP;L^_hy9vU@?&k22l9>7-bB*QY~g;JpT2BmWq0 zk8bC+o$9AgU1J1TyZ$rX_oOoR1zo%@=p$W(uujS8@~T%g(~RqJm6nTZU_^1nMsl^V ztMx4Je)D3u=R}?Y#F(_&CWSRKsYkf<&DBa*acQ@!+yjIBNhj$Y`2(AQQ=vwUv*!T` z)$qr2L|S3VyNglTLS9A9E37O0sb!`XCoGp{$XXS`_%4Ik=WNmasax}?IkSI~Pd9kW$IJ$f#o5YVxJtrBo~{$rLUXN+(%n$WTzKTT_Dswb;c?GonCLbT zHmTtDRli6_vP+xKcng4qzT>Ax5Z1F*PTe;Vv;>scwaA;jrCDPNeVL$eDmiw<^<(D5 zOU2co<{5i}5$W^y``0_<8Z=pa4dB9;+6o0Fkf>1kU{rwP5suG;Hlf#7{0vA1RTp)# zZ&%4q=5dfW@DywD?`yU4cmvIUPC`R=?WG62B{qT=D+RmYWxFyoC3<0?l`lk&z@@}O zggTv0H85D)FTMr1aTP&)oE9>EdD*FTk7Hurbgs_?!(08ay)mtw^^eywmj%p0!!5pb z`qjbB!Fy4;kTT8;-E>2SGQ@7dR*wO{<|LArBjnTW+9skip@6;2^T)DUh4_&F7973T z2X)9vLKDC!(AcNyo-ACV1pX2Igd74Ogj6)Y=p45;_V(g+A_loNb|i@fmr)(#TXb@6 zj~)%(Ts4;OhBgUilpF_**9Q$9AHgn~6wr7?V1L14xs5I$qyN&z=u}|a9q2Pw>aN(z z`K<)yaf$dAY7}frW8oQ66K(lg1hhxrg&%-XMov?<&uW|R2|<_PasvzkR?|iyUN8n* zf4HADc)}^jOlYVn+Bx~KhawLq&;owZQa2^8i}`>T+$mm>PD_w2cvf7p0P~JibX;YJ zLZj!28=;eP123`Z=2_H-@Q*uLh9CuKg242oCq>sr+`7Ta$crWop>pEz-+=;$RP3Do zg;gkAk@eDx&x#ga?lGn=B1&NDIX&MJ&jD! z(HG|veoOuNI5q1&@9XDPM_&BhaAYE6VToGjd4}TID*v(&>(|$w6dCdot{5$H3C?ZM z3(3E8w&2B)H2bap$ZmgUwL(8cHEHMEm9I`cJ$J5m%Ny()6D1d{=Ckw z#}i|IH|bLd!;#;vC6fbGmqnEIP`(vnP1fF!@+BssNYM?&{mSs13{6T-(Ju6b&}n^M zOGH4ZB{w})fDM=A?<$Wy>|}`4{zjZb`Xq4*-MT8l)`*3!y#6<|J@jKUF00 zE8SCo!@?W^cBJB+mfBkZLh%?$4iQBTdJnX}B4c11uYXmMG|&nl$8w05{pe&!JHW7s z`6}Yj+5Ay}pezqzX%{OW=L2cq0wjdR-lttWbAG089Kr`~R6y-jN@mA%_1Gne&Q&pHjLc34KG_vA#)y>EOR z!0xvf|K>8! zWHF#p;N_T@)RSbw)@pcV|7%gBm^s*usnqT;ea3G3S1OncO!c`OB%G&@t!zq5r`n)w z|BTpW;-vI#BRJ(J+?-=5RD~*qLD|&_tHz0qGp}AlCdBuo+W9RHpbv&`#jR~C^y##y zvyJwp4xDJxNf=~K@)N}R6Ae+*AEZC2#mzsrhsyYV*o^NfaxC!O<@8&+25R&+tE-#S zPRk~vW;V|KVLjV3^@f?S>?HTfF}DLMYEEtup8@De$v&#s;yDuDVi9&IFlm##vDw{I zXE1a(-R-h*M}Jp#hB29xc-3ri?LqBV0wADb?-xAo#NtBEZz+r z8UZRw*oKl?UKzaFg`l?H{YT_S73iQM2bLX$s&3~oiaJpGaD|$Fc2FSXxI`5dxUofU zsbv9ELxXIW>3`0PD??^pOFf{#C4FA1QZ-M_*X(GWFdDN}fT~bb;WIFMi&IZJ2aJJ- z2-;>gVT<^2;iYmgji|Iv%gP-Xk1N9Iq*`=i+9kkJe`D=e^gS4$I&lYGFD!8xQt5<& z0S?u?g7bcy)_mQ9FR@F!&fgZXKZA4h{Iwv}BN15{LY(v&WwOwL#0uzBCYHoQ70;1j zQn~060gT7(s0{y%y2blq+#XbUyFeDgS~XeP!=P8w#6eaw$k^H#$Af}+GI$J2px_MV z)z*@un9?9K6L76yA&?3EE)>ewI_(JsBGHc(2}6vx*iCqI(62-LK#m6BV>Q%P$Abqt z67-8W|j!Si7X4xT*4(*ueCJhkV@*rHbhPEtZ52!SG=~zh4wxdkHK0dU(g) zJUEF@?^7=PO-LARkDe0~XA6DYA`DxjzSfDCK(_yGsFN&y%C|Uh|1;Xj=rEM_$SW-V z%M%*jVNgBak8&0O_ctysDwqsnEQZ5iKu2mZb-MjCe6Xl7(s! z1}||Q?qXu~6R4~{-{G8+J(UQV;Ns%QfI9U{5a5HV_6$>+BC@$!K?i)g4VT@@OI)FoU>fj*|4)1uT=rN80VF%M|Pox#Ss16`(sMc*z zWAxRc#Dv93pg}J!XSv}9kaCy$&+FE9^2!ubi_~YIjaCh{PB9 z#pu(D#Uuh&jmT;va0%R1j0}5=7-2}z28Is!s3K-S@32)5@5T^` z%i}V$k+qsdYR(TWN_xxgwpOM?7EHrV$+sAm+qU29 zyX-&QS_uu1lbdjS{GQh0AVQ|L_IaqVLf6KQ(~hN;F6jV6A%Cp>=0e5JED@IZK+Up1pgP^1$- z&XnwHkOoXzqNyrf=SuVGEXJ7B`M}Wmjx5QS6IZL6_1Vt@ChTR8r>FjQnH-HRQSi`% z|6UjLoyrmejPGgPHKw^pPO*!srj^D;OztSL_5)}Ok~6ns==f0M%uUd%CO^!DCA4+V zrd)2fa*8zQXs(1~gFB?@Cu_Vcdr;`JT1WAG)nwxMtoB@o30fwP2R|CcIShYObtVzp zua=Bny5AIu2F%twB%A1<#`d9DnkjoEYwG^CXH@c+`-*DgEvwD-3v@Tut}B1m6|vFK zBvd3&sOwe2B_Z{U8+yqamQ)Oy)_qlL2z2X1O#o%gsBPIWIb=+&mp**9cqjIj{qML- z?krWk5qf6FIS*%Pvdp@1;+S)C7SSEgXL^e>E^df{Ij{c!DH?L8se`;CC>~uq3h?p<4U3OY6bRM!a zi;~s)MpTqR!eEYCdD1iTA#ubO+hAzr!}0Y*ItQjJuUNhnhB{rp=)fB5r6sGO-oOpR z6zJ3Ft#{(~Sm8{|2}@My%6QjvTJ=~2+c!!h+kua8p~&E*A~3j*t2gGYbtQl}GE5I3 zOa7%W&@p@U7&z>nysc1__)1vuY$QDcNCa3HSS653S|34QQ5Sqc!^z$B)GHek?1Cr9~RM8G!d-bIuHFd#Erc3lHU35IU+lBls7XYgoE@evqeo zx`n5V$Lei~ak~P4J38DVVw!^29dY_))iz0=#=6!{VA1nI8VO4rad;K9(zy+Dkt8I8 z#bpFu%H2Cg)m<7h63Jv;OwItfh;o*)@<#1CL8`_kPjFSbj1W*`dKQY>WB?~6+hXzV zi$r-8>?=&|{2a6!8g6Q$bZ~=HYY(pTFN?Kr9(&e-)e9d_C5ovXhskyz?Ho9%c zyand=mguKILsb%{(E;3<(;fudMAc#u|b$Es1=!zYH?AmfRzZ4%uED+WY@(2J=) zSC9^jdEIcuGw#(XdIWtYv3Ly>B`^x^2<u2f|_CTq|kMsC52xL_pu zo-=Ve<5bqAMD>E*k$9!Ku(ep|25`Bh+^jr2#|NvE6SBI5&u979Xl?niOZLrHklb1 z9}1b$XMaBUakL@TS53Q6qd>R7Vv{m~QwKV?PK?ey2pNI&TKk6!t&oe=YJ=ItY0Pr+`Et4^OM4<`fk7B$}`&4N`tX zQscj$xilSa7&+$9{X|I{jeWOdz0R~XHhnjqL~Hi0Fo~Bj#qE%BeH6v+t`faH?R0}E zC=qw&v}a;SdCqM@6f$*url4`I5%KN}i(B%BW-+1!SerFp6y7I{z9Z7*MBfSPcMB4hl%8nnc%;0e&(NOgVgaalbCNl`Vr*rbv|*+_PNtb6m%$EFXriC!*-aD%}Xn_#kK>q#^R zi!$73k78}h!Vv3P=9WqPwDgmqez&(Kk)amcXEda_FCT z7zl5N7xW~4m}SZq$j$k^gg?6vFAE-C{Vr6!fN%OKLrmxUb3_9+5hK<=X=h&y9nkA8GO+=ES5i(g06Tl_WF#e2KWr~xFh$rKGRNc2UQK?-h}VRM1T)G1{d(A3eR^vgi{P54=(|R%lQle0K#bVNCszEdk4wC1;7+ z0R-^q(AK`lF(;&?2}BGU8=nMT4JTSLndhfkC0 zy{3Kv@`K+co5nzdW31ibo`#z!*I2cTade>fZoF|Zmy%HoP9Q{QtZ5~i;kf8G;~tyV?Sa}dtZ*x)dR!yY^?_9U9VDh3Puwbju5XQ|BYC+VDO;XCyaKfdUIB%xS_6<dkGIa)3YVr$uL%YdeDgwARqg0c`>cG2i;@N~6 z&tLskplJagTalZ25<8o%fB`5L)@SGzxCxXaw0rjlSLc?2Atb2~bxvGHt&m>fj%dRZ z#C?nj*b{ChiEOZJaz|AuD7XyNX7_Sk2yNtwkU#^|xs>wl#0`Hkgzpr9&rC{3L|-#0 z14Cu|P;ioeWsK_FM$C7}q}Jf$(%Hff;>X>y@xi|9>sE^o);_1R?gmk_it{%!`i6H@ zK1jdk*&1;iIR*9<)79eT z!eZI~YrMsqEOrQobS+1e-nu7u@zOQ07rrboVW_?_e{jZ#tp)SlP*l3IgOAG6G4Udv z#X-@_pNEpGS`d_OL6 z1pUU@jg5shN|I}&@&Pjv1h5#LR;4=l?_7_xAVgZpU0>R1RXSzoU{aL-M5#a>s|UBZ zrqI`bb^s>Qhb1k8GE6ar%=t>*vggi=zfy`ay6B2SJ&$jcTIw&pR%=*C5Ud2IE9#Et zPfIVkjOy#EonJ$ACf$(j5{)s09$?95l~pH!6H#J=-`go^Quv)b)j+xMByOkVAm|pT zm5c(dwwtC-S!#dfp(eI@xnauW62wNwn9*92`R5acPEPScCXPv?Wce=5hqaAQbC;Lk zGL3rUDWXx-Gr3E+cVmnd8ic(Fy+kYik%U_S+2p5V}Gaf2Y?UK8u{<<0e%4EjDfJ5?w1S)h&9I( zh=;N=93V7N1ge06!RtOPHxu;Zmvz4ZM2XN2>MXT==+?%XD%SfrecEv)l&4fmp&n(o zwsPU24f#}IOQVKp`TK&t3kQmW4i zirzZ^MM_(EON)}r1&%nJ8NQoH1PV+{iWhHx5~)$*Pj%!XjpUVK4b}}RWq?5=;tQkW z0V1t-3JOjnl;mXvWt{&`P6Iu!9+6mR|#rmI7O-nlPLdR6qDV8zO(I7-&rx}mG z8;u`pOH7qP-G!h(Jw>kAOV9C9Ur~K4I@%JHQ$@62uV@&7^(4QO@IRdq1~fw}j6hz$ zTOW;}UoLRbyq_>DY9x!uWT+9=Q*p8p;Ee$=&!BZ~M`kI%%xd;0ft*7&PBIjpuF21& zZkho;j9m-up{wT_Q|dyBDRmL=&yD{#3jj!;E6zRmfWweM1zJ!8BWWZzN$&d`?+N5U z%)ukULVF?h#zcGY3u!gXoim|-WMy_*uy$e`k($K~^$^j@1-GFaMOGUBrxxK~-p6eK zHh0;7VUutz2;&1sfuuRmUG;CaHLs2_CA*A!8IMt~LzU&orj%nWc@>BN3nw6`P|z?380iCK(rsC9B~Xp1q1StsJ$WciCIFo7&c z^n>Uuf&whw%W6&}$@LGUZiuf>)vgCa1dg@{rX6ddpv12r%%WrX5_vco16jBL68JKN z&Scjtcs-tGa0!17N>vzf4b8Q*B``>c8g7CMZg)Fhj@3O%(Q*1Epvy(dMWa*>IyV_U;nJ{JoJ%fC>~#q~?0yx^qT}$$U)Ew%?FA`qqJS^nF}s@Rs00IHqR99v$|wl*TrbnU5}yHVph5xkD%XG%vkBB7UeXMRhkyCA6Y> ziEhhQI!|mIRv!8z1_*@gJsm!@%U%EF)9w$&(v~AdKq@ zfYjz;>$w1#-uP_IoQ=z5f9d)57cAjg&bBf|euPM+^O0#iHxx%Ebt3+XPJH*^@ax8p zgF}4w>#EVW%~naRV{4VLU7vu}5;Hf^*zqCRRI?~R_R)Hz{o{WJ-W!gGLb=`GMt=Qc zm4sr?E1I&Wg{UFP)S8iLXYZ3uLEmT^s+5h>k;K6b{L{>_I}DSM~@ z!+(!gCuPwa1|}Q;7lZ|AnGEGwb1D*@#xcfrRZ7$+tp!J|rAE z^qTherwenrkts{4i+*oC@{F^5DRq_iUVpuPNq$zV_HWNhUA)3O`SwpYtj#MgdOury zEBkW`uhlDcc{!#lS2ma}3^Dlpr#!PCE1$UBvm32zEIKADnZ2@c^v%OD?X#si(G%C) zEnI_txg4ZQih*OgOXjmq4xgV*m!+IP^@1q@m(Z$7slW^3h+FBbf|&gHXJvVr-sxh5 zX)C^^ThV#w4ymrEb!L<41b{9* zd2tv{!_!YzO-8ji&DCF-2>cg<89op>lhvNOR1M#LBgzKWC7h8{hRu#+SNAkuo?JgFKZX#ucuo) zB?k|nv+9@w6m36T%%RY5W^OVc34@h=@#!GI@E}$U^Kv83T0XwebrMo#op@HZ%6r;4 zq3|Ew7y`7Pj*I2KZvx6m4|NreCz;^slnn6u#Z3j_%X2JU1^5G@I5F^bXFTWT* z$AFaJQK8T|QFL5h;z`W5^zejnm%o9mVog$FCkB)#y`FcI>Srcs`Vq32OsId(;=?LKogB z9huw9(dBe($&!G`3c@qCc1_inG5UbtW@;Dp=U-Cz)TO448rmhdu}YjCqUS1qf&ait zjVZ3hwuCF5`x6Ha$=AaW41bby#R|i4cjGG*9LOi7OOh`jw{+t$X0DJmaycMb(noYuOK|b5f1ulPkXsYMvDlq4hS$zO zI4GZVi13|=5=i3!Kf(DTV7q1`b)?7eU~Fy2qYfU}=(xshiA`qoMWq#Yle$_TL39_1 zT)@+gh#lDDZtZL_J_=H>(g}UYvY40Vdh@OzSnb1GwDu=Q(T6upG+A~#oGU+UNiB-Q znck_)VRTgJCTs8>R$pfHmgVuMkrBeNbwhCbw{<}ROl+^cTMwo4tl~45n#%-HMfi}O zcm%Bd$^LbBc93&o{4{gcbZ~OkHkFDw@{&Xfd%dpc`5=t7@Hd z=sv8e#>CPQK2@bVFWYg`vZ=3K=GXvlXR~uL==rfIPRk)s6HXp}5Kq!CeY=Dc>cW%k zA+}&pcFv_qKjH7qj;BH${XnTgwhUEdYAv^GC`@pjEoh(mK1zB#{zJP|CINAGhhg)Y$$8hK1%-1em z?d+b$$2IYjQA1j;g-GZR?_3o7dEjtR+}Fc308>0FoePl}hs=mfM0;8`pj6uOa3a_^ zaxb)>EP%Rxlhl^zbn^A#xY-%jT&u}+OZ>l^T}r!+95hF~RFDa%Ewaw6C7CU2SJR88 z4-jtZtYNpC3>D2ht9tp|_$Rfj-?v_NssTABwd;PI<`q7=IM*I1c^`pQ3qtR!H~P9F z-=gl$@G(CHH2mYggtBb-p(7|dhvf)YVob$@XbW1lnCfhvdFMN0(J=Nk`wN$eQdw}Y zPH<6U1f?j4uW`O<NnIBN!Gt_O@N6)l^iQk$ z(#ySi24MhE`!!dFD^ddS6uw2n`Nk86?%q>Er;#g6=jN$5-~6@t@!@UivAZ5g$G%hA>C7yY)%p0@;<5bzUAi!6f8)kuQUSIfPwTHxUKl_!$f zP?VvLv;2}YjP#<77uS}@r04sn0GC;{m(>$JRspYb7;fqZ!s|eY8N3b_x+7B)$-o{k zM^I^c3TmAj8iFdRK1mPmp}{zW;lR3`L{6=bjutlQvO>xd_OSLjXA9B@Fve>$Gqhnq z^68HIh|C0@y~|3}cCW*nAl=<)5k`}Z>9IT5cT3d>WI#(5_G|+Nw_zi}wAa-~EaK(h z7O@`+4+qpKBNo)dkV?=)(5`yJ0Ub2{${qK2mGQltscK(K4kwchKNf^Z(#A(%n*qDT^cfvlOuHNkVkDW!vA z2i!#v@tG`ZxFA#+-<7$Kz_ySEb0`xZiSv8x9?@FfqofSrg#+><( zz}`tvx%{qUdf<;AN+sNMQn=tRz07}@*sKd@1_=yKEyF;rLt#>T1O(iI47}4bNRO*w zUKNa}MHtCKK%i9TL@@4l9_}fh61g1$$q*vbH?*`C3ptZm8ib35JiQc?Yx~LMGFlh$ zbmT4Yi&*%NUr!FO{)k2ANwftBD1-q?UARqLK*p+Z-Swde6E~?8%8?&^08`=ns8tx3 zLy3p`!?kdT868p``CjlVz!Uah&)g%5m)fizGhan2GQR_vU65Ue%N89&hs(Og3iiK#sCT+czfulxu+;r3U0f5mMK;~P)|01#KcAV-@?w; zoA?+^$Vwv&L(Pjc-kxP>(DX+-JILEc&#M{adt9ji2v6Q-1n`vpBMX6EM-972 zN3wAc%esFD#8bLY1S+PY*@e*oU?Ef5eAY9ZQu|Y~Gj*z`q0dm@bA|hZ0Qza{oYJ{Q z_T{SCw1!lZj}5XjIxeR#8@EMI5EL+!e~Z>w?-l+?48E_}B!2Y6#LJ?1l?_#kEETRc zDYj$^%O0d>cKNIiwoCZOG9fE!?omiPlRa~QtAP4*gm{zle%F|L5A23U2U4S?-=mx( zd(}NLY~OfhKYfoYs*Z;^TS~GZY13ExgdXc)>&CbZ9-N%2(;WO$dX)>+M-w3KNy zzW-XLFvoX!XCg_RxNn1TN>u&aTKQ(Zuw6llW~%BAiH+j*GkT4G*NFAlv!6MSPc~lM ztc`2>B_iJEhy4;WyOgbj(19U2x*CX{WNY>7AUVu1P!Qe%SFi&Sv=;0ir}nqr{aHo@ zLR=992${kmqQU^d?r+N!GgGznb$a)Q(j8UbzbzI0Sc;;(l>P6inU=Q`vj=OSwB}E{b0~nn+n@OtX?}^K@PR3OJUBPEV#f?jh>ebNOIj zp8tN)%EcIb$`?lF_^dHqh=%C`+QyQ;T|b>iyrH9`!xfk7h+pc@m^BD98_!mK6oqsS zPFt~6*s`j*r3rrouq_&;nZct!C-$hFI~}g7$}v!5u_>#pGZrpig-0aZ_%Bf>T>&dr zl(xedE&V|rGl+H}QAh4a>CD&iLLmSp4yX}g028@@r=1S!01yDdL<)&RiN+CjlN70G z2*R4XvSW7!33gK7m4#;!Nno>*TSKWCs7&p=0YG@BYZGevkRQ$vTEx;9SyC}>YK9W2 z78Oo{)4J8l=3&PHOFRn7l#%a+v8Kmk!J^8A(pEB2v4%_fGi*VQ4hGH<`I$jnpy((k z4t&xK4I{`9M&GN*!+;);Q61#}(MIe*SM8`nx1LTU^p!8h-4*~F)SB&N$#6Gw)H z(!hhKs1iNYp)z-1dp4!yPC6MvK#y~}*`wqwB$PPl;Oe94nSOv3fTl_K1BfuQf&+j@_GZMPRlWODlfiXGJqGG!9Q5#rKqz&Y@fhe^ z2#C?>g*V`=LML2hi5Jom%p?XKB`WU-l}_HMwTomFK1o(d^+a;PAwNr_z&D+*&e;}Y zh`H>7y);G2TJu+KJS<^DaC&Bnxjquo@JAUokR|TMaMUO+BAOU|H@H6l3rO0X@)i~* zh%jYD9wwNQd^$8wH6d0FeWMG$$Zp}6MO&S6>orDJ5@0rt223`|Ubf0>Nw|cXca=3M z+qXGAmqYDg;=#cuM=c9;lE3slq*sISTaDm8kKlcA;Y;EAG>ixu8ufX&M00D*i<8y@ z`2r{uE(Gl>I93VH`6n%kGDNhyaED0WmLz%2q0CEZ$>>_6*=Sz6E2T@V63K%fP?F<& zwcSYXnaTtrEV@k5$1~jLnV2$a>t!dsz<|$SyK-gGU;Nk${&z zb=0XKLB;Omv|842o}hzf7xR?}lb`E?UY;gR2b6yZ-2@khsPqMZ#|{TZl;e9be`Fw( zS!0*!kFy>7n&ie_t#SOk#3E$s5AHEeFPtuGwOWJ|)*^>Y7Mb363n?*Hrf0WXfdf{kU}5 zz|7sMp&0EWP4YUkr5a@i{6=(K=+uo;DSzhA!I{@nzAke=!rq&XYy1*%Xnv0GjVEzy zVOy85ewjGdJ!H?GY?n^De6)*~KC&K(&niwfD)5nPRa%`D1TvgrOSDbvL`V0W@VwaM z)QhN*kl8h|by4#q%LFU&4Awh%D0gQ2J?#Qr77dZv4>KDYr|YH9s%DlhbL8 zmXFVKdDkw}G@1Touw6f4s;Z22&xfuIrLl$Gk_`!??W{>3w&7zX=)K_FjIE?Qrgyip zhT^C7P5{ImhAtQbrf;)F!HJluII(?VYKo0Z|gE8VD*KS45k znvH`>-r6l&wk#TT9C?*Dh^n3TNnuq2`Bo=m{Ge~64J*P?(ifsnjnaq33L-rYyG{y# z$WuDAN!ZLQGlS5OAHK{a1Eesf5QBkxkcD8_#uwv4Zg?f~A5cb!@gx3OpF%+y)Q2Py z_&O3Z@g=z%)Gr9iVy@A#`+aSP1*`LZ5T-9uH=0~B498k{$}zvM$cWFc`qEWDcrRyu$)_ST7H41IV zoKUVgT2?lU;7U>;Jba$h5ql%whnI{NV<%jC~oRpYj} z3dLk^S7jsXrD;BA0J%3<1&yC5g~92Nna}Yv;&no#sHxQ)lwD+*V-IujK*W7AeBYilNq8OF~xPW(8N()i9^I#C?bHf3Pv zp=Z6x*>6MR0tSiKWjVj`^V}`*fU$CEFX)atm zuvhv$TQoS*Jrl)F44H{w+mGM6-270CCWIOxS zv=pmoE2}19G-z-DPuvyss0xdcTl1NxLmY-nXWIswWphRBR2}wk(d60H=zQ&=sn!w} zWAcWh=goalS2$60z%4@bz2N)AMF2}j6csCj=Ik6%cL@t?kK=kIX2}khhRhiy#hjcT z19PbAg6(O?#rRaer%EAKA_N9;qoXp_*$1)~*+dB2rSYHfDffYe%7TbRMQ+ad8D~7# z$5~2;O{VS<+*HiK%(D>HWw)@IfjpF{=Kr(iH7kRMcSHfJ-_HnSn`(Njg;o-y#jIc!ig1)nZ*lb^krmreO zOOf!dC8iH4uO|-r!G4B0;vvu!U=)Mc%2-_(M?u@oKg+|F$lN;#E&*;c82{WY!o-(h zAfJ&>$|gn|^E2k9-$SFbO&-K2d(+5RP&5L$5r;V4A}lrGafVZn6Jjq7Z#|8$c(MtQ z9yh3S$^RDGsl+J37-)=mkzxYpbb0vv0t-gT3(O#p0y^0$N)Ekzo-h7O2{rPGp_n4W z$oFDMJyVg?pb|-XwON;2KTV!$r}-M{`bWOc#Z5oy^?# z8Q%o(zdM#aer$tF(iubutX*Nb_!IPK zGw=BR|5|UBD1d~+`u5w3lQ$-oQk|>e3mI`*lqz_GVUB_D4_&f5%&4}V+=Na?_xPy{ z<^U_rf~?%ZU6quU;#(CfXFE1muetR;zbSUn5gs0T}OC3ml+L?|yD- zOB|}LXo~IR4R;0E%vYvGEx@14al!!01G^kZl_wWNX|?%amef80#js9_l8q!>T8*_$ zzkj?`fILFpkUiaSi6!6^gFP~CR1iP~y6R>|03}UB)4DLt-J&e~!d1Zv=#%qj{x zH(Zf~<%pVH1hCW<=49>y!Pe4kyz*EBYp-SN8ChvU4-%Tn5l5w2gx-WAm5sY(>#$Ly z=*85ZQPVpb-i*qUxlF!UmVtGihI)a;Ipu8oU7Grs7kfk7@%tmR;m7RKS_g1px3wJa zJT(~qc=g~1absuH)W412MSYwN=^oX%8-!UR6*bV{ZqW|k@w-HQ6(iMwfhFXclS`C>FANrFJcMzu8aJHFY2? zdLj4?J0T`GIN>*;{^F!?0971jq^YZC+K#dR|VG7)pmu;JyXvsl}P ze86}w?!x(J^;J}O$*!2l55jC$CBwMw`WmEI>*c0;GZ@Ym9hrqI61B)$K7_CW)XDwC z$HYOvp(Ft(s#Aii$V~F$wD<=zj{z71uzvH(3Ly_j7sT(GqA*Vj(3e``wm6&O zLZSuhz4S)$h&y%nGRCK(r$1^W~(|O!pLO1}G(2FLl@DDSCHQwPYYJ9I>lbQ;Hsb@ zD*pb(GNEpv18G`^sn`?Cj!8NvSVBrstiC!J5Ix8Js*M03g!?6li=JJwQPi`{{z|+A z(gBb#(=&>T;pE)Ujq!Y_7yyQ4%aGGJ2|hE7nMeW4n)Ci>U^)n)O%lEQs4;FW7RpJqK)3~XI|RO0 zMb%ExSi&g8QtmDk)RBoED zJOmkk&Tqj!H;3RvI5&J`FieO9kd%qQMI=llV`?cT)YR55^CCOUUXVHu^-NxL_EM$>$j=C& z2M*DjJ0R)cWI((P?kUeNW}6bt*UqVy!S#29QNd2T;%<6fQij3OOG|=|(Eonfya3|` zL7)i`Z-F72?G!3#a?6&!tEdPk@^|MvMo=Al0Y6pTAMr9>--ow~vPy?{zUEa**8p19 zLDly2g%y(ZfHlA=A~8$u^2KBMf}A+)Ih+ykC_2fwxh}iFm;vOm08~BmpWq{O<~9sI zu1Ua5Ol8Qwe{kz7^wm`h{Yx9w*h4#wM@6FjC zre#ZH9X;`ega3XeQ*asiEbee&n4h1cCZ2^FvbO{-364V9rg+^cJ@!lMNwvARE^VK@ zgJ3%)>N~?DoF>skQpQz*B%PUMB7HH~QZ-v3Tg-k_+)&c3KsF}4Xra0w@8m zX_F+hB^kD9Gk0N5CPMeyiRArBWz8ni0Ayct#cY-FdHSIL#9xS8PA?b#;BI}6`0uWj zR!1i~hk9lTU7BPQE_2wm_Gw5uTy`+t%uOZL9=oFq1gA+pJU@GcIpudByxZh?Y%;to zF;_piE7LOq{cPSm{!QJ$gIk>s;5J@8@`|?-liD`Mpy+%B9u{vcWQLbp*KZl^HW z@6@J}m;)n?)7A~i)-uJZJ_S5$Q$N8E4jjzk`YJ{a8O8-mkFmv760OD$I+H0Ol7gU~ z4aV7=Z7ok*pQ6##K44=9|4?1uw2lNTLM?(f=8L6Cc%4w`Xza)1H{96A&>#9IoGyBeO^NI^8zNxX$U8 z6VCZl@;6%2uL^d#uAuxD8lTEXYz#XM8}^XCs46w%>$t#3YVf0`u?l@ktavEaKu4YW zBOW&Lgc|uJiY~?h@r=3$D~h4&*hhC{lM|6@Q)M)$3uM%_^D1##RnRb4>3j{&N)zQ|vTjT^ zJrGHzA(119KLC^T0lM*yP#F`&I;hr;AC9GO4Gde#=q=8$0G$niqYhdY=vt2(sdiRY zpwUqt4s;MF6!RSfSzUKQMR#dkPD`0t*rB*cM;bcX2)p16f_J@naC|?eqw;|RQfPUK zLEzRFQ>H!D-kOH1+;zvDm%{x4n8jkAmRv`hR_YMTif}?!5w-Lhkln1G&ve~9)!>H* zR~HFKxrCbLA$paNntL^uyeDwW#X|biUy+1>67=bQB7cJ)ya{-QcK(4q4A%rRtB0C> z*c@&jivD713 zuN5G!aJQ!hgLtxS%*l7(^h%PdGm%OaRbXI|&yHrx)L^ zU2orh_hArr&5qi{>b0kEe+*B_uuN--1EUC?h(9{8ZAi#Nbn*IR4X?QboW<=>d6S;T zry?tz<&yOy%h7RIQI6OEOL;h2PC^o56A!wDV{pyPjTg6N8DN1KJj z<@T8xTX?O>N#11daJw;>yitgb;h<|kwJ^6{e@+;dvx0S}JdYm6y_lJneW1=z=znhb z6y{9CVQ@qY2V4-ixQC#+*`|8;b1oPwWY@;5!{ZYe-wTg$1P{NG7A_XjKQ5@I*mS~~ zzS@z-OH=1Cj@o*=s;^e0{%B0~k($@@^AU0bdzTHFRea|91uN2EUEoq+&Z)4wRMK8A zIDpyp&(bow4Ho}r>Tk5^(W41#xfv%OYqC$^*G&FMW@7#hIQ7N&?N>bArAIFWX{#T< z8Vd?Cz`^TtS}S57Huc--;Nnj|jB)Jyuw8w1q|^S1G0TLrQ@`s>>d(C?6`D+^H6$_5 z+>D@ATd=Tf{3&RGVQVSWSMqMP%ykhTo?F`}+c)RnGRbeuJM4-;gps9YJzyX0qY^-( zt$BRgprF>lsfP2DujlI6-?0H_2#^N32IHd1Q$US^6+@~Cul7qtA=CfPM48AIIgcMc zW%%LPLnq)_P-gfQ0?MAW(9@zE%Oi#ZBbyV3MrN7^r>w>QHj0bH%0aHM#@4DJ-Hf=o zm7T=%5bUJa{^J|1amB`edSsDvqcTyH7{Y?apmxjt@1*%JRyPx9Km1sZ^nD{!pO^?JTMRWu*djbEigdOUoLa6;)JKfORNA z?_Y)mh60K+a1At}bzsq9Hi+C5L_P+kzZl0%hO=yqj~{cg7`rZIH+-m{I@LJ&dg`-~ z4_4B?#LN#rbDUOfZnf=*v0jzswAi$->3Y(KBo~>!Y-xz>WaB0489|lc{y>=FOT_}f z{SnRV#xYz($$mF>Uc#E&IQNV>_j$r_0Jo)m9_wdgTVqKWPSs7k9ftUOVGA@HG7xB~ zqFx@336ub;55qW_@jqOdBr)4Vw8a@)b+ApiJwG7z9>Zf#amj_7?REIX_ZirYfbE-D zG6+Bt0X+6;-u>~|{-4g$(4_u|!d7+cQ3TLQ8mrT|oH!@|aDNC*Qr)d>33^s=mj5Da zFUNzc&KCFc4A0q8^Uhy;;3XL$`>Id1fL!|ktOn*4WBbmK`2v5j+~Xh~qhb9O2lO0Z zR~JT3)G`e*NJ2u^U_9S#X(W!LR_Q|3W8i|5fesVcX#nxyPrf0*YDk(t>1c%>17ZTk zt@u#EJ^vfhqggsI{m3CGV7D2{4GIQ~Q(8{fB5Rh-{W2 z6*+;;f^v5^h!!ELpi;2@+t&*FZn{}z1*GQm*KUziqY^``AulsKEjIxEHQl>^)p-5^ zFDlp;qF{>d`ph0|_Wytk4k%;`7C-v;?Wh47pzP+M zf<5~*01@w=>DrE-Gl%>4O4>Dn=R?i*F-1xEX_4nEVr8lI^l~T^@S$Hz7b9$m!PQRF z)Th(|jD$#A4&k7*j|nVGHVg$5ZaC3jC1bj#a0s^aA;PEI&<3okOM9DQD)M1l86)|?DBzj8- z<&QWe1jvZz+L8%#G4DJPB!^}}C>=82ayB0Yc@)(#))9;Wp^dY@B(x0v!<6cSe2%H?8k5ZK9!Z8;xUAU$@2^)+Vq?V_@~NmkXjxKXU*pX1$D8(UD360bv*Vy6|} zJboddf-OmFL+bON3s>DOoNocxzHD(p-hnKQrP>7+wWf($_J>r1v;ko)cT*{9DHD+6 z641F135XSWe;ny5@>2ZF=O~)#TNjdnKaw<*f=;m6D43VYRBI6LYq;VvXL3pnGH)R* z*H3gT*AG#*3O)Ndz18)`ON*MWCuEUD>6e4E zH3=?_?*nGTomU2}snx8=b?S{q?1V=KKb%xO-9QOf&TUki>6A&UCaTzz(9%qp>K45h z1k(+%LAgTzSA&C5Lm9YR)a0O6ow-31j4J)ZPGyhl%gzrRn&k@LW8E>py~svwpV zh$czxZD#1mcZZ$D%!Z3Ky1Zzv zkNt0t^nvxP_xdB|X(NL4v|RfF&JpepO%VXm_ZjV_wP4doD^Bo)b2^b_=9VG~TR>r< z^rsNRIK8U(QQDd`pcF&P!c+tD0s<}gmXB>{NaX? z11ntKx43i^#Sc#eG`#kmtPGjwd%E>zP_U+%BwPvUs`9M~O>X@}=_#yr)XbJdynyEgklZGxs;Ncr}|=Bb$}bN1gGWQ#*4kCjLbOsfi4qA-D^awdy4)-n^)*h%g5>@blIC7j6unZVU?Ak& zJW9rjGQoG{?zD5H$bPt%>3EQo*$1v+C`lJ(-uwmVl)UVK6fzJ+07#Om7U}FEu^W>J ziG(F_A~!QUg8Q_^4Jrl71%S;%CuXV%J850WZ%CJ?m(JRUY09%*x(J8mssyMlpCju{ z8p&r+DnP`Imu%n8AyFbJMv>EwAAoqdGY+PkN@9v-IQq+#5d5P!b*O}6gvS&G{`+Bv zLWxtw4?)6J?9T zuKQG09C<6I6jaZHljW8TA`Fw8`Z=y|+K7pT)kOp*{|%#h_zMiJ`udJTt3iXJLaHhx zQIe}RU=RaOD=Ht1bGij%hw&R#KSzf1aW>JAaM*^A1j9x?I#|QY&?j^64MmT_PvORs z%=?c2d7gd!y5%{IUx`W1yNbfqT52GC!5(+`EW=90h?j!7-yyz@q8M%li6e?KPi-VD9T|qrMMFSb(=R2SWc_9e@m4Le_&}|S6hwP?mMelS zTR?ge6~J-?dPWF{mMS!=?d6Ujqc|>>gN`CbQIRb!khwe?a(ORHuzvM%b}sJJ?PEEK zGjvx6P1UNKL6{xFYO`<3;%p(P*|B%*imgU*{)$5bN|U* z7oU4`Kl~AL;p^v{7V9eLNM2ul{gG?(;r8hCu>q_L1PApD(`$@~#m1o9H_#^9kbWSU zcyFq9@;)Dxo}mnl)l_QDi)^nxth{c)8jm&w8jacoXN=0%idB<^kt+7fNEyEJL9GwR zW=xmt&J9!pwocK(xk8YYfT|ZM0tq4!cO6H6PSBZ%%-zj7Js6UYvF^XlGigo&6fnmZ1L3%>h-_p0{A?cXyR*0<=v4$4^Fv?~P%nzDo=nB)tq* zr{!sF09dAQ=W`Y!yH=$B3H2-wFuvmzi%w_Qa#Me8#;dK1g=?%fZb6kR4uiv9DO#H) z6>g&CxI;)4Xjt)l6U%I8F@i+L)gz%&Y}rz58ob)lP(EWu({p#g-=))Te`t znZTfC1>pD>>Mx<{AiD#HIhJGGjfuLLqCP_=kepZ}XUuFvuGhG{Oz_qRyl$B$`;D)R zl`ys$rJ2;-y3vk(!;!+rA}uWpp|hUj_GrJPH$7NUJ2fC-{cWaie;}+o_ z_`5056ePE^YiLqALA)PhpHnMjb5So_ns{nA=`3v8dhn6GEkO@l2yVf+7DO04^7^B0l&rKg-aDNpmL@!MX zAnvyPl5kOnX9V`-A~}e2JNJ{e8?)1j5a>bwHl~!)NLYmD2kHHT4%B#5&a&ktXVHE9QEB0R?GMF)w*HT0OtNEXzo*|qpD4>fCE zK-NJEv#1Q}e-T8;rQQM+@nKSsaoJu*ld zIO$=*!hcae>hMonIpnNX5J8+<=Idg%*_>6X&(!oW&W_#(eT((F(8+ME{6BMlZZDJ$ z{Dzm#W;H@%-D&OslAD{?_ha97u78XpN`X!_$fZy*BWg&Lh1SB_MG!Y9 zM)j8e|4BCxQND8-AJzs#8jNU(`)VTxfwCM5EsQN?r=4no&LSaNyXC<#zF4T2M*4DA zwYD8CKYEIA{YMDl&SKaL-Fhbjb7uD%U(BUe-J}~{Gpn;3)1_wB3wMYD>x!kW7-Yqc zG`YVNst-&nhkILKVBQ?pL$_bc*ai}r0|S3~yU}LP2c}e<@MPo8{TS|LuCRio-70p6 z4;d!Jmm9cJCq`x&99QEn8S(eYNrTTppn?q*ebHm#7EHFBh6rBU5_D-6FWd z@?kf++!HWNq z5y`9EXf*zRvjCOgMwLH60~>LKzZhAt9bDu0VVNUueGv}2Y#qyclNjEL`|P->>8gt-*Bm0Ca@m4B5<>I#@gxrmR$a-WN^HZ zdhmPZGD5I~t|nUwgBG_lrRy~*nITmcsm^q~nBcSjjT)(M{BSk?<>)Ef8YUQ%P^*Fm z%3l%`9ALYDNH8FMH3%i@;TqYu4P*8RT169^0yzfEHY=Q&YTR;TM?`fU)ep3!ohj_$ zo;liFjcnwk^s@EL{BiS|luMSOPhY|0sq@jS&*gr-$IV*1K)uA^+v&}9v#&l(7Bx)z zN)|NyGdZ=;l%6Ott=bo?i8VEp?9Da}Tk0nanoJ#wpR75x!DZB^A+M%rLxCtYI7s{C z$PSgF6{?gG9?rGJn-@`&Vv}h#$Rf>o#{W^oK6BsCc1703)wZrl+U;Zh%k}NUlYrt) zGZL5Gt#69G!0FA#5`H)>R39e%e#w?HH_y<_jGDoO;?cs_KkA5GWL1NYLZ(aS^qt`{ zPZ#^5Y#kNt26Q}{WXWP!N5jjaw`{3L{FHwDO18*4!Km~@Slogfeabk7&1+)KP5Vw4 zPjDwjWfECO)YN|V>F(JI>lRjc%B5kg6=^Zok#}(VzTgZ!YiD2RzIQ@=E}*Srpew@k zfd&;KzEp@mI&WFgebR%cN(o#>UAA&;H)fw97lT+*un~*m&UQNo;1=+nyT|(QX@Z$6u!fhM+XD+&<}WUTFNDX&0C;j2 ziYX^iN<$>;#xST`1T(c+#R&6Ikg8iqS($YUQZ{YiMP&V+eIO?-qds@UE2slSFIcLY zpaoReMoN%UjVLy*wm*_%gAu(HCsHV|pm=Z&l3}4pt^o!|DebyFU-X?_z*>&Qldfz| z9E2lL4vXvzLtufc+`Ipr+d1HwE)BQ&$JoNXclOUWS_-R!F1K+D&sM3syE~|dr)$@O znIzm#O?{tR{NXlJD!NJIZ?Y|MuRzK>JW`v3eO}RVc|pD}66!-^jG(bdw4ZhU*V;JB zILJB8`7cJIBUpi9g6#{k{y(0+1gyz3?OH%UB7%aERZtMor~$+ZXk-;sPyvlwMHUgU zqh-?yu}DA!WGkBxEwWl_7;Uj?3zQ6D7YK^h&Y)x10ufu4C8z{}heqa@x(D;7e)wb&z2^^fcb6nLN`5O1F1gx6cz;Lfll*?-BF} zO~XVb>2!UAgck7lY1E;u^V`|ljS&fUvJ@c+Le zhU++1?Vgm=a{!wncBDlAJc0(}EXL`yao+4X40bnwo-BlH{zJ@e5SNIr;tAtJ<<@OW ztj-|EL;xw=%kp7`hI9QEz~kiYBArbKYecOry`9TwnI!&(#BL!kvj`Vl^PpVv7gxWc z$$%F3&%tbxP4rEe{zn`X>zJ)#mkJclX;+&?hXdzPH|LhPR)jT-{|K8kv_#*he_e^` z*vogxa5U|04}u_+(|!z@_LI}tx2{a|u2%Z5{`ataEBUmyejL->=-d$d?^O$~Thja? z$Oo~7_o9myTEYt+SVO32Qv29;^bl`OR~|oNI;|uVMbAdcIs(QkVs{QK3r0@Bx8e}C z!M53QgB6Y))6;*wRkFn?>9z5%`zQJ*$L12k2hY}zn+ti)5Icm~289~7&nA3VD-O@O ziA@5CYWItJWSs#mrgInhN!lv=xv|+XdCsk6IuR;y!^@@Lv$0jz+dt#$IC(bCq)uqD zswOH___c5kHmm;j&`R0bvS_L;Yj%#`+#@gK7gx<>@^5HscsI;fJr}$fH8LLR)^f>l z05hYoH(ME)P@N#3lgrldhfl{XH~l2EYSd-z@t zG>P@tL5w=ZpzT~supEFFocXMIfJ`;Er(|xmBO^j%!mN+FV!`|cErrXh4-YE$9r0P? z@4LqTdQD-%r6pGn5gxRA>>rDy>^Obd^?>*5Vm{rmYQcquvu6!FB2Y0pH?}sEik_sC z1GwbychxbkQut%vN^i0U-c0|>pDhtJ$77IyNiSRHZjCect?U-SNB*2IyxjImGm*_TS>IogxUA|_l*UBy@QFc?UgkNG&d zW^Z6EF563$mr>zQmrz!of4b&2c?J+a37m>Ef?m3-p)H4;_TNcJh1bD(&eT4ZRp|3& zBu%(iyo|EjrzAjA+>EC{Zi@V@W<x`C2%=}4h>*n6;6Eqw)1O%U0gnieGDhF!Gia~YQP=3zT zfAJf^*%toQK$c)Sgl&$iXlY=;t7r$X`eqQ_F=P0HsOI|c(#s4IT&{oMMl3# z?zARDjp~A%qNo@yC_4XQj(+Lm9M5X45j!UsxR9*~Acmt~GO@v-=G$ohW#BNe zC_PTrp>a`|37oG}!2H<4t6SKz5L|);Oh00Lg4{!CW793qAhftK{$x(l0O%*65p%@dA2_;x#o?+3SbJFyqU>j_=X*&P111 ztkL0icq=N>-@)9d5QVu}z*33mRJ?rG)>R7Y)TGX*U;73PpRb$P1QG^g(Zev~bxg+E z6qHKP^?!GM==UFvd(gs2M+VkB);N${2;K#HE5;wlwyfV#vSS4C`v$VmP54~h$c3=C zDVssO}5*8yMWUR%<+g%HgSp|k3HuYub8aT+U?@QsNE)Q8qVA(#T|RRC2q z6R=ER4fr`r{Cqrnc+_Jz@j1mbsrg&tfP%`2EM?$3rFN{t$)W9N^ChZrwBBX;!^g^+ z-<;thepJB>KDwi*^9`A-qY6TxAkK5%;TAR!iXGejuaqSlraC~01`1WV2l z8gSQpwZd~Pu_bd}ey$5`lq~)!lj*imS<}}`d@4b$F|vb>`t^mh-(A2Qx!`L@Ulqn> zkXnt01qCRhxrm<|F}7`6Vs~Dz78YVmrlU_}%R-za{gWrAl8ps}43q|Vw`YEDl@;1y z>nL>8V^x@VF4OndUp00+jQd2lhIg1SwNBa-`u>WCIw>1y7Gpcm!H{=~#URwYcBZD; zE_SE{B1C^Vb?e1-92)=Fw9)ucxl%J39416%>~rxZ1D^7z2l2nOXpR}uHht$(ykKew ze%G>+Sy`3*9i+G=R$>kPCg|Q)#(OgnB} z$&9<{;H%bUDLkiW?szJmyEIG^1V&EpG3QV;8`ZNZ{CsUCZyukLAG2hoSvVy|UHUY7 z;5KPB!ehI4OlNdYo1IU{p?Lfl6rBo1IhAD|qGT6$*QBij8#kEFC5(xU;zq)Ut7kt| zy>e@^@DmiRS3|87p5OvKb8MjXs4`T#8`!fYGS&KttpBwJq5UG3TX2#F&42xlB+Mza z@_YVD^0dnib&SP=^h(=iy|j2y4CloX1GfKC(HWu z{+SehX7`M!qEUcHe)e+qdB5DTUTnlq2>9S7kL*)cd#-A^ ztR~wiLdj0#y6lR*=VG-5YtXb(vbQFQ!Y+d`ukSj%(slUC;#B;@vW(dwUCy65Dt*kC z^i02SnlfjoV{r~3j=-iJnDpz`b>>vt(v3}7@^NiRR@}7SIEO#vGFm00U%8Ti76TzyI^<1o!GP2XZnXh@{k(Cc@CaSOrq<9HR=XX zo-U^m#z~ORFY`OsP^&fx_ZWko^M)BVqh$*&O4ZV;m*ja5BqC{8M~Lt>I1#<8FOWA* zwETW?vET$p4;p& z#~chBTs_EN_V^&`xSHQLMC0DNVNj}S4)0rZYh}5mlFsB#9mR}u;`p_kFEMSX{gsSd z$;{A}3wQ|QlQ1x4aLTO--i)6kTvWH71|i>N)MIJb7$mMqQ9Aga^74Bm8j`ny8xTH? z$Ma)1(g6m2g^^gLT0K)^^w@2#jMQ&tYp!0HJ6Ebc{=$<5Oxf!!~$(lV(?qI(g1_LV?_c ztzm8gQrBhO2*4<*Cjtt~BI{bCQ3~@UQb;85cZC%-2I&;dh0i`_oH6Qxn+2%!$lj~_EUA%;QAFs9lydC?BnEMETImq5V> z&%+M(PASABGkvb30)n5X1O4(M%*RrUB6pWc{HX+hgRKIhtJcuZu0X4}HRWaZz75vb zp&f)T6O_|$nz6|3SKAdc^RerjW4i+zK;R`e=pnpO)xvl^oknoOIF>YV97BvmKwUs{ zqOgH!3}j;mNxx*&frb-5^XpV5KWr`gBQqK~51kJJf}5CY?eB}nQ)p2IeFXd-ut@J) zWST~%9T1K|(!*#BeR$w-7=bXgU^j`$$#)i-Op^jUk($Oeix02yA)`51O)}RoX*Ytz zVV5x3>va!FN*i+ZkMunPy|KJoFsK)og>hfIqik1QpW=^`I=ggHiZ1P26_CND>|KdH z*S^+!zd|s=>K*&iw)xz;cUO0PwXW4{_R0K}6Y48<+-#1od64bAuF;J8UsofypW+J& z_UvA$v}d6*byr!i#-^)3NgtN4_IT2={b{_X^4_Db5B~V<{EzpK^j|Fcd4@F;`)2Mx zcfPP~h~x@8ATz_-)GkrRsxT4E$$;w-LV*vSHGGW9dHLtD4QV|wfq9p$&yl@h7v^zx zq%YzOf3qw<_m)-)MvaiSaG(-t$DaL_G1$i;n}UTo2OT$!f9QWtmp!kZQ+1rX@5s^K zrjjq{u)WckOtHjMK8m5mNC+K_lTLiSJGqCQ#Xf(Z$gVb-Fz=s|gUkEE>eW&CeR+2E zJT;xW!k7r%rBz>IrP`2_yCdDRgUA;T?Q3d35_@gXoA)Ms`~!O+OVTkW-Mv>^l(Rld z4NBQ-i5imMnaU@LDXCMl4O0^q0q>_{C&%QJK4oK`!bs=dp z^`+r;Ec0xjuQN8*H0yq@4Hlba+%^8}h-|6+kCBUp;oAb06GXSx>*d?6<M4-eT5x zu<0fC97nDeH$FE${;}k7ady05Ka4seH|{LL-r##ECKzaOLQSPMjzjMR{n9sMqW%8K zD%m|)NnEhrW+(6U{4)kAU)S#cN*pGxP3&3IzT=RRS4Y?42xZH0zO0DdVkQ5TpX4ol z(A~yL4c!0@2!+H058`vbA^19+ycSwD-e)?iK3f?sQ;Tc0noHuTT028moXH5eyIpgg zU3Yxw!v5()@*VY9=y7rU>zQLZE5^X%Momp3^yJj3Rky&XNM{5)Nr!m(+7dnfkhkQl z)5tr z>0xP?P-;p1B)cC(eNZpI#|zw_lRt?5r@_jkFVqy=94v7!f;G`qY;k)g86)`HwOW{T zoF*d1a3u2k4gNZX2DIPeT`Km@XVQjCm2nJ&Vo^(La&K#5;a;DoL=n>(>KDilM7i4~ zk&@)e_@_M_s8fT>a=cteHrifoh*|+f`i-G*L8F;wQK$(un%!TzVh9guM=w8|m^Lhq zZ3STjomHuX=?y!6>P-BWeZp=4Hk=Iy7A?BF&G9J8T5W zk~xyH5DrP?_aHd}5UH)kcURb6*CgF!vWx%?M2xtx?u3GBy^keKZp~4s>MhGB zJ`m7hK@NbEhxH%r^Ff46yiB1&Oz(P-#sVs9DQ4+dOegBjupr?cc891I+1sYTHTIzk z#y|Vu-*7k5z+^+S1qVADP!{vaDQ!xIF#iR`(z`9x3Q(-(Hrmu+#%l0GIT2y_d%O7F zc5|%c>qB7PVKJGE!Qzil+7#P>g8R#$O^sz%>Qy5>>;ZX0xdDQT=ZIoGZ3T1K*BQH? zG%~7&F1V}UkxsolF|^86+*Z?0*cY&e!*y_Z{-7Z3Cz~Pjv4O5ZBn?Sh6C!@q2qS4o zL^c~^CT-JhQRW(w6yj?Db;(zOcAFHs`E*dge2d=5sqg{bDMyf}7{OGaQ#sc9jBKjaxWxF4Y0Zw7F!Bo*^wT8^W#{q^BhNwv2t1S9aV~XmAqA z_}_eTdfw7a82^PckQNYP-o7wI4-g zYw&Yj$Jq8B_E7YA3HxQq$nui8`_oTseRc(ku+A?aS}c_{_S#n!YIx9KK57 zV8a{R*5BPd`zJ>lUjOE$^u70GmFykgl$&Pu}Fs?eFU_$jUVu`g!mB(!FimD@uAt&+F;0F3p>gvHJyM zbML?&n>Aun!wnQ^!(IGgH|1K*e%2$&sTgx5Q;KYaKc^D=v`YRcReW8CFUrO1{z$ww}3W=|YrU#ng|{zt=-yOAS}J60~% z%dd++6fghVO1`K5Q}kS1+^5hu6H`ai_A=MtZ$UJLR_gK6yz~uWcNoo ziFhDfMK&oJv?l1 z@wH_Pi=E4VA1e2XdpyD`;>6!13?N-F|1AN zX%_NLSoLIW!a?L5q(g{LvZnMHlco%O9UEB=)WRd8ddp@d|oP6Ag%F9U@@~j35pk5WMt0^_ zX%s5OmcGB-~@UbA~n*eKtQNzgK>@+Vdn-fzEYi?c|jNFb}w_^@Y z@(RuuHG|8bBxFOJW5@FvW{jp~*~SE94X!?P)M(&YA&F+(SkF<(Ipjd(#Jq$CtC-GR znwDA6#v<-mdtF0Bdk*+%sh_WGPxPX%W7sP~1oJM+H$OG&YYCH#r}#OQ1}#P8mBE$W zU;2L!_ntJtpwGnjWy%F39tXMC0#8B!7;H20Jz;@zwT}%!y z?k2O_Kf5BJU%40(^^W_5OYK1Jb!i1=A5Ht#G5F+)T4}xZw)8`l3`~@VvO~KI?BMsL z8~#rbQK)9wlDmXD3rLOh+Ge~q`e3ZNKz#j|OKC<(Xsv;%)bkwml=Mz9@WtE`9cpvL z+Fky?`n?}`Dp_N)3q~T)qR_!5x|~dg=@h<50}R;rMcM-Dg!oElYqG^Ah=`K(3-heB zM3QL8XNYvjMnw?jQM?8F^q41uR}2f%eG?uSo};kB!=HZ(mBXF`Tv9+hZ7b^R)j@uO z8>8BgDi|DRh%~wmvkw{F2v4)m^eMFJBs*l0=Nlj=YJ`|ow8eIU(;j#Mcrc{ZxzMTJ z&{Vg`+RQZexxNh4RJ(H5$Vj*m8i+k0q-qEmh}}5GwGd9D?C#Rs{Qm8H4w8G$2A{2XIFwd{1i z*$5j1D4yjO&dVR1mz=gEouWy_^>tdLaMT}9$?d!2X4R#S!)Lsw-Q}I#qItuaNJWrv z#BNI#it>lKcQs9y)_>@Zwd2ne$`;6lTb&9IQ9S6=G`su%#|3DEqM6>donZcMVtlcj z(IqK1o%OGmE`)2-?6(O2i+sqXN|=y?Jl3E=;{Q6n^!BtO{=eHFr#7=*-}gups;9tT zR_-;~V3Dm|BmS=p`sJhY z!v48m10Em3g2wlpL=NkKuq$Fni5gCHr7yO1sVFVvu?PF5{|;yc9yT_3>*61`COw(sP*}wT6hh&eP8Z7IF z?#IOZ^|fDap$nciM8y*|Hh8WNNBq@1HuUv~I<9iUa+=p2XJobTd^yQC>m}v-4N%2` z>N9!1YDuD(p32<;{~8=`&~~GOi4u6*o>Ww;#0Lx=p16|uw4wTN%A{mr9~S!cV&bJh z!1-V}=^;ByUl;61?5r@;7B++|_Mkofp=Fz|0q)451c~2Db!vAlzR9D09<}p{$Wmu- zgiqu48|{tz5i~w#*bzH5CBaQVH}sI0KRb~ej|80@fc)S+c&?i?j~-8i)=z37M2UB} zt77P3w1gY8xAso+vK5>!>05BpG(ls0j+sZfqN0PD2WrqLyPfXPH^Vi+g~*4s4b?OR zTj6D%hF}dv5r}`|H)*d1OG&|uze|cMG+&>cNO2+~E6LiLxDwd_4Fv<6GAQ`HQq$W0 zmz9a4mEMp;{;&tpMh$_fb|XH)NjD3O%5$(5V&aBniUhm~4Qe9i$d`lu3(<^Jxwr5q z3z{M6R~kVVCg!JD*zO&~v;d_z{NoUPpePGe%+r0OJXffxo>f4}O65-OMqP0gn zZveDWybPHxle95z>F+RfAPgePq(dZ$o){_a{|s0_=AATEq=ny)v`dG&t+6^4zOj#5 zLiA3m9VU+fQDQ{vJb%5h3fe|L+ENG%4`y5+RFKNoL0H|E zm;{=F7Np<$ZrunLl~7Jg5LIlt!_S%#)t4IdPDsz56ACO{V?&M5brd?&E92i z4Dy{D6yi!T#KRY*!<2mmrCJ7V0csXBbm)|bG8s^_FEC) z{~8lLb9!@@6_R31ivsAZT3~Oplk4LGeP(Dm)pcJpct3FFD^XMg#6mZYq)4B#rBl;w zRdU1nx9MyRtA&z@+W@uh!cO%KNtElGQxcqH@A@D0TpX$%uXGx+bwHZ1hmiZ(3)wz4 z&3jbA0gaCN>k4~TrN5aI`*dV-1Ak1wa?oeFkw}A$fg;b(8AH)A@aw1krGT1d*6ScX z(G=bpuFBLF3$}tZIXOHxM#iHB0Gs6 zUT;Xd!D_m?{;DZkJWx@6kz(o@xHDDv@Q;H}l~s)3OM;qojsM+=+=w`-rL^JO`V#&} zz4{{d^kiS-QEmHW!@kLF?&7uiI|LOc^0lpIKgeb5AusmJo{5fK#R?=8mJ6kd~`JV*!1R!N%vn)uHpesl9vLq@P09?Ea z)B#<^PbH^nTFf!>x%D_nTh(boQ})Pec4OaMvs1@Wr@>oi&8W5w?fWl`UzpgbjQ~$g zycs$x{WdN>V0K}g3Hu{ox{Y_yxhW7nK&*eHLK^z6R@FSVtZH^cy~OELV(cHcE^3)* zTceEAAKqi3PmMMlsaLMzl~luHrLOP8PqV_34;sAnyBAy1Xwm6HjqRG&1Q)UliR?!0{uj`l^4-{e>;_keo^dH!PvHSg^}X1i`FI&^dE`h-1vt=je}wrhZEjCd(6G`yIGne>&ULF81_V&5p;#m54i;RAhe%`)z_Q5 z?vXbo$(zY;2o{gSh>pbwpjqO2I<%Svu%85W98EHISIFs++;C$9sGbnwy&mN8_-ySt zpk^k}E;ks?6%s$wyVw;cHztBqlSFw7(+jYd_cgY`Jsbau$urp~>DJB1$21s@f`J4l zjls3gNJFSnjHr7<7U$mwsC5o;Y*b`}z>A2FbhwKIHY{hQvGmWA7&s5#*csoiT41q> z<<`rcVPvHb?|_S8#l!@X!Tos-(Il))YaW!Gfl|HK2*iuE)v1cht2w>Bf><@AH7jJU zfF_MyT#<+P zcQWsqfxRAe0X4ffBuS-~`?mOX1hKZjO@}Fl1$|Kstb)$?DGY8mf`6Wx=M#zHehs=u z{C6N=Pb{r0q5?!iWIc%2LaVSZ2q6m1C%yn^c#_fxrjO9bw^tP3*wR431hj~#b5M>9wRPk^D1h@91y#YMT?3 zl2OipK;f=S`}w&<(vlV1-#^qdCt+tgeS(fVCqA*KB`T*3n*TUM_bxAhEIxeL5PHyJ zE{x@pAx0g{^*))$O1h=Hi*0ytUVp&sVvIA3Vl?d*DL-o*?D#fr{M%`f)oewqU~Goc zM{9Sg3vKw;Nt6G#SN-?=${v$ORqJ*xo5mKDeCx%O8S6N_(UiB?0^ zvs(iij;g8IFQc_t?=0S5yMNm9K$*_nhII`AGo$h%EBU*ChnD{uI?GC`zH7Vw?zSPx z05r308Z1m+09$NuuPEQUI>vq=MK)MBeTXgV9z<|WVZBtcTDXJP<_>FL?6DdwS!G!y2A}g~6QLLRG^QR{A#-?}7<~zx6NmZT3 zY*{btHBrUDf(#gh*drAi^tWUFmRo9#2Ft_WU;5dpq-ttv%SeQFno#3)<8L?S{{84b zci5h7|J|(`T4=U+-J?XW-@h>WGCq3I;msC7d;KV@_pUwH(RJ?h*R@~$`tN_7e)UIk zd`C^5%B7Lte;%9p@b&_`zGo!*BAb7<$f)I~ht2a;r@1h!txK!3%d?AjntjMGteS3f zYU=(ZEO}_2T?&P5FHPdF(@D33`Y`QoyJ&iglPs~n8S=(<6W#J>{P>>u!OPVA==D}c zbXrzJVMEFEBs;%f^6&okTXQ$2h9(-+wCrfqZ_1Bj%$qle&H#4l7w0Tv`i-1AO6K;n zuLekE-me<*@xQzWeQjY`{!d>0`+LiS&(L6So@riUc4@WyKqzC;D!H&m=UeA>cAa3~q22 z@210dF!Fj}()@gfAxsAnn@8^fGwJTg+radwJyYiTi~CuhC5XYKq$HNknlLHx3d8Oh z0;E7kZwNg`7|=Ol&vBdhfu}+y^|LP#Hc!f;j$nKoy}!|Bw~xYJ#H$rH<0wE!6n-DX zV|x@=X{?oj%mH~pKi@tbDy2>UUq>UW7dyjX1Wu9{_68t9_T-8Y6)+S^Q>!yKFapL# z2vKC;*gjOuy%Vv5MzTeeg9c_1D@f(9y1ioi5S*H*#1P~-__*%odUi~DT`6&_MX-h` zUQj9mHdq66YT}Izf(U~Gm}84TLY{x7OVbNPtE>&W7~KF`YKqTE^RP#H;c_80kN9Dxjyr|e1^r=ecA43b1MKZ%!q7X>4wK*7zqa-i{?{|l zkIi=2{Z?HXbwshssYN`kxDb%fWuHK`u$y-~9~3939H(_|gl-#b5Ehyvy~LD>(3V&d zAFIV2QHKp|d-J$!o+N%#8504a(UFc78WhWk0q`;$i@CxKJU$>>Q#qIO3z3fCj}#`X z(aa?){~YQ+9EjQ02vlysW5Sf2WpAI_D|X((VcCO~17nfZVN4pCEY#RI?w0(F9FRoG z&msi?98~o3qkoOu<--C&4AB^lBl84xUjFx*<|~REo;i6uvJU|rA~9Uy83IvY^fv?$ z1Bwa8W?uDr4O(>D9xXJTTWX=Ff)UUOs7WK8AwMzCz>f~y%;N&Vpmj=((n3w|fu%&`q4h?3+zc*Mf;^gHioW+^RmIUOA%!Btwh@gnF4J4Tp#1)0e6vuZS z!^;r9RB&=y%u#X_@}c;B(ga1r8d|inQY4Pwkz#C>nxZ(UgAWh3gs6rz3+$!x3e!eD z>o-@3U|p4Fdq(g^D_~}k+@gOrAl9;EZhCCwgBCs18ifh7@0S4`@8PdauAqQ3R2xTm3Lc!DC3cXE;p^a zXv5lY>sUecT!?I_O5P1bO%{7TIa-r&U%=LZpLeZrli$gdp6{ejO{M;Ek2n`K*yB^N z@l&eiV?gIWo19f$m>>6ck@OEMIZgIyN~T}({;v|jP;zHf`BSXfFp;XkdFLJ>S!4$h&-qFK;#DAzB*UXU=tC-A7)QIr4 z2?I<(%UB=9GMC<#znqe+U7J!`gvX1a%w6TNhe!rpUmi39dLZ(7Q+CQ0!x z@fK|>8Sh}wXh+*$GPq9=)JUC)Jp?~m+w0gwZNhb4S1&CQAC=wjZ~QiCDk2IvuxbJB z_}v?t;q&^Zd)b+agkZ^j)g5f&pV$Hf?B2|k&WQ07a3uVDn7)@jk`i~rJ7)5h^ye|@ zLD@u!d@V0DaDI}i+O?V^tkr5r3AJmFlQG2-(gUY??QFEc4n_{|%+THtL{e(B2KMHx z8AlLiGfHg8af!~0Wg=yumIiQ~jQWSD_FhUh;&3*2Cud>q(M)uK{nlBp3D=-x?x8E& zHrEO&V8xSXpPe3i4%VE3>E!f?!_oz7>K5v9221ziAbxJbp&LGtK-u;LBV? z9Y(0cs#A2lG&fdAzzQ$(=&-wkHca79r5j=SLw4qbyLtG)P%I&C({L|Etf6TQ6RQyA zktll%tLQYWII62tetk=)&~6jo4q}*X8>OR;rVRL?4fgOYZ5q4AUls3$yz?0%U*vG~ zp#5UN30MukGd@rXu#Dsxh{SKu%NHfV#(LRu41ZV=P<`JS2Ez{@XPW0GTpuOh@|QYI zw54V!8i%KCHht$ZfZBNuLF2G6`6#D*#%J5_E=4xa-m=DsVsixqz~q z7FhFV2dauFTa0&-J2eq;;qhDX!|`k{I+4ysz((MDTtMUk)AX>*M@<}tqCPsKi4$6w z>=QIUC|E-aey$9%RI}nd=VVPyPy?y83H%v(1edI^8cx%`A8CtPJP60_E-I9s%UI)b%yfBX1WIL4Du$V2CcdpN6pcAt%wGyDE?X^BnAT*jo|muv)Y-=`Qa~3>hDj7>t7aHl9XAVhnI-eKvkfQAf(< zs_9SRBS&S=*{vh7jaCD0>#V_HSW#? z`u75Un*2?;T)#y6RY|kKs^>by=*Nq(gj-{DJUYQ8_!55#1@M^c9sfEENZ1Zz%k8fu zTDBcsrceA~##Y0qM{*+O9>ZW%dGEkXoHQpuvMz3UI3t#(T_UYyd~AS9J>>`;;!Tn0 zkR#MB3#_lj@BJ=V+F>eR3Cok2*;c2iiBeJ7t}Kb6r~w8%4e|gW%B26H}aj5N&mnO*=WD$rTod5m?O(&r%h3w zZESCyXMyhy^@Am{eJ#Aa7KS4|ZyZW{*@)c*i~smDC4cuYrEvl@Lx<)Q)8NM$h`j4R*_!{<_1du8m4- zw(~qMBQg?&c$+}L_NyS%l+Dq%Gs1`)V}PPGl=sBnh7|;mgR5_v4_gb6oD|@M0>_2< zPAwjF+Goc(5Nvmn5h0lmr)3>=OVYK%0mVc$S%F?dHICS|*RJ&mtjX|g+^)JvqLqJE z@4J8*LHa3B_X5zQN>93eGUiOP|>Q z0;s#L#!L)Ot8x2Ts^lJE+n7I$nP+%`JiyPnu`uM@8AcESskLqM3j}D4BNVP)HSm4r zGNE9P8c>}WIKMb{RgdXBN-HL4J)ygR{RKFLkvxKO9maQX&QnxAkP1c=JI}ccC5EI$ z9<;tCu>EeVaBVfSD1)U1(COeVO+%_x1{`!SpA|whgy17cKmg;2ehGn{9~TUvjy>qV zvDLj4%?*W`*z2wxwwm^QT>n3yfvSO<4c+hw2;FYREM8&gK_iGA?D`PY&OwEYdLg0% zueh;Yr}HI56&2oSo1(50D3kEkVC_oBx}7yCR~`KrIr(~8TC`1cYB$W~oK=Ac0VC?( zF^Uvp55I?eBhEqClxvyV9|ax37iYl9 z3KW@Wq(`&{U>=gO)-J6Hp9wjsnet{R!}!>w}S~A__ABwh@{C7svd!nqVkS3|{aB9D;?S0_VG*6kOv# z0H`vbry%LICnof8o?^XdJ4^V6#PVvm11i2rNLeB}>z8tv(4%lkuI6sUwB6ujMm# z7-P&$P4~oo(3>=jn5U#nML|ny58A{Jxbbyqs0SFg_E}nJ2*$PJ!>51axAep{+fCkg z8d(@~f(xpJ%1`<*X!B0q5-Fk=FQ{ogeSfxHJI)ldh=3;3*=?o+|7w`0OcEMC2+3^N zB<3m2N(;wB_#gX4RqXEmAzf7Tkim@bW&Lbc+`g5TjMdhz;@EL@`DXqbC#jvZAzUhE zXc})wF>|%l+s1XSZLdqWjH+fB5a0N^7|E9LTlF(+QNQf({^rowk9rfYzwH=YzOcye z<8Z0~&VfEbrSRtpoPq((Huc%wv1$HvMZj$ObTC_bnx#FyVu3Lur>1@15;x^Vx5jJ6 z?dl;wWg(Xw8XxZ{X>Fcyy#8$P#H9lpgy;w=h~UHl3KvK-SNqAM^a>8va|^m&QKj^>KLCHZx|Fwh(U>515jWLL8yo^@FCiChyI zHaiy_PRMZ)#+Q}vWqya~a1~K9Fcown%s8IHkat%Y!nA> zZ7YYOPj^J{>`3)&4G|sFfVlg_iREF&H2>!@`2-`Nv0&b4aThzI_99)nD`ClY88aN=A4c%19EDX9LeKp&Ne$3?lA;JePmVGo zzB|GkiAZEJdl3;#1|M~a_@G5&S#r-cl*+}s#jw&8hq9S{{V&j)Z*FK9; z3-P@BY(^ePm}&rRSgLt=blevmUGvZe3GsRF_(ZPY z0QV(x8~;BHh|3e=JwAz2x$^KI?T<8U-HI4?u&Ae-BsK*LR-typ0C$ZY-U2p}h_oBe z-mN>=H1Xd?03s{uyqa)t2fgcm`BxIA-ki0H#%{ZU5&?6qDSd%j6IGc3yrod$q@icbF<5s51=E>it=M z&xl4kEl9wF<3*g>cfs}?En7U7aUNFWQF#r?p6-`C0rD$m?l6E%EyMy-VcxY;&|J3p zJ{=@fE_4mpcv1M{-UMNH3#Tv#&#M}lFc6&;7{=yh;zu-kTM9voKk0%lgVFKYHDC>6{{6`a(#$?rQ2xK9wE ziHzXM;|kl^87>%Oh`x=^M(r*!2q;T@ePD zqgBS(wXG`{i2`+xMzx?F<+0ii$?KgSo62HKRBEW0gFbWg0P05>`Ob54)Pq`$uK_paTjJf*M5L-`;eD z_g7pZ zb~b_6IzZ2C1`@|okq#J@=H<)V!hmQeC0q7TihdYn(byMdQYQL&&;dV)H@ng zSsL@W)C_$gQ~}Zb+Ecpiq-A6B!q_)<@b&n&)l4g6ewBtfQ)plpy3l;njV7bU9(h9e zh!KCqc7OkHwEVj&(K>c7XWTz9 z#%m%+1MXb}d(m`SuK1*8(M!y*qOmK3#CA82Tw2 zCt7N*Y!{|(zv3f=^Y>Y*ow>p@a|9lx%-M4a=m0bj%mWBzlvwDZAjiM@|Hd%D$%*cO zy>o>qg1gfnk+j|A2IELzOqfBS0X8kj;5@5mqhGT4B=Q50X29#lsL_QPewyI4Gik?t z0ML)=12_1Q&>NYe4G-^zBTx(T(Ui8c@FzbSA$x+Nh+QMnm;LMtfu~mq+iJlUE#lrl zC~2};A8B(9gY$C9D?~}{gF1$l&z;3#*=ZRR-TdLU6=kliYDpnv zCJQ_mkJR8U<~3mk_p09}8Y*~YUmHyg;tGcXKP}^WnX~x7uYTu{XA~CG`;i)9dFY~= z?0E%6a%amUsMR6eTs8vq{747ED$-bJfO;PW+UPtyP%X0SG{*xgd6R ztX%KA5c30$0z?M~3f#D_AS_Ho7nk4{;<-;q5aVbpJa#@D{* z^J%Snp42S#(8-)=xUiz|tCgFIv@~t^|9JYRv0AGURzIs}w&zQ{aM3b0ztH@~c zU%009ieF`?LVJK2k0A}3TeZr=V1jJ{FqN8;1`EYVW5$7rz|!0&wY;$HNtyUD>iAv8 zJ6l(P=A@XCL{*;J4m-X|7~yhb4r6kIO^WlJ(9a_j(%8MFXZk7TC4isZ(6&zDS%#*^ zKLAVBa^nH>y`@`Dbd`x? zanl5b91XO8;(MKmX+~CXu~b-OQnfe3N##$t9ule=Dg@*Q{60KRu*Z)9k!?x}Ma2V6 zaN=bQ@>Qtn*tTvaKUW6?NW3w1ntSI{xA^@BUb)YoB=)MJ8;r>mN3B4|Ll!&sih#F) z&-IXOg!m?K=lNoAlxk-kmRpzUb*Zxu3JzpxAGxK`*@BgbS&XJWoIH_9wBe10e0y@c zc-3l0^U+~bJbP?Eni@;td*8RKwbi+zyeXJasLpV$C9X!ak}v$CSpRI2J_x!L+2O7| zS`ZC=>hp%RyAwM*Izld`c>wCv%cNMI$6*DBaO;uLW;kkz50*D@AbfIL3G;v@ky#m5m$|X@(8x7~ zwe%9xx(%7i{!1L+&&XD>-_EeJr`Q9hSs#{KZpOOZeClEUmSpIU27yUqIJPA@Ypx|r z;(bxfktDJ|W{vk*UE(OQe(4?Q(zIrl`VBuS5SV!zg!`5yDq|<6Nx5oO|Ku$>jsIpV zzi{f}w7NZ!UkJOVMV4W11bWjiJfZCH6At!Tb?k_H8$OxIe|2d5Sij7rPjvxCKSh+Q zS6oa)qX!0ps~W0gANWb~k!I7O^!_R8jgiw_^nTWUzh$T3Y1=rNaWJE>IWOztaPw?^ zzbt&BG5pg3-hAVDXXIVfQ?^T@qx7QhwT#oo2Tj>YRWqOZ8%{suSdYbNTdEhOd(vs| zB-G}Ymv`1kN}A(L^obYynURBqibF^b#3pLrQ)KDK4RVui?=Sh+&hr6-<0eh3OD z;^B_+dFabu=pPV765&W^$M5E5OI zj0d8s$(GO&wM7dL!$MN(+TJ)>&|I2eR+^f=F6vfOTZk^zl2o*VE0fbbT0<9cw)p1g zy%f2K%UreT)VqF6=5HgsBdwauhKOqJRTRK~b|jiS!QO?$Kp<3GN6qL*A$zDHoMNP&Co{Ze2VVlMO-?I}@W>^2J?CP5i!=Z8L>P17gh)^)vYk zLQ?AMCH1PF5PzeN`mvaK4nPE>KkxeB@dn^VA({Ud?<{?68es+-)UcC0*O*%4*=7QH zfy-?TGN?btns}O^)idAbblpIapNWGXh7YuZVOqoc1nxx53WI^jXYH+-UU1pQ_qXqt zC|gX23t{E622mqN*b3OpxwX`+EJp(mT=%O|(cA67BPWKc9J9Q)>JwH~Xt&n+ArhGF zNX|sOvuXjlMc_N+T>TOo#QZX9zEl(G z*E~=?6i}L z7c=usG{@65@Q}mC-izV<9PNt_*-fT1GSlHXQ>meUZ+4;uT_cfu^%Q!tQuQ<7cPGL> zd%qRt4zDf$+HX3jUO(m};>bi*1M{>-as5h5p!Vzc_jZ^U-EOeY5hVBs@2ok&E4r-e zzpH-4TdvT$4Xb~@&avTaGNH*iHy^EOfWxhE3noqCge=+fED7TG8|lyC@)h9frfv0g z3{Dutg<}ytTD3~q^jp<>nNb|1*Ub^b`(`GOh<L=tfOdeA8la1ziR!M)vR~yo3UvX-jsk}P{eWI6#7L34IweZ z#qo;3U{zHiOYK`p*C4FQWqm2r-^l;48mW^Hgb$6(Q)y4%@U-*RC8sGjc2WPQpZIxG z|B~xPNuYeXbxFD8YMP1geMX^1zAbC>_#Z6~k(4GL!KG08xPPvYrC}dWSu%W<@XVZy zP1nq=2ch2|M;%UEYjWea1*AnT56NO6t_S+Hf4_gX@D% zGgPZ8?(g7PV|JPxTv*%LOC{0c^q_exv(e#iEXNJUN7%2~Lq{E9`6MclFSLJkZ2d2> zZS5Uz>~*JT?4Tbv0wY$M%$Kj4Q6{|$hVKX7Ka}I z;G76LcUtvL0uMihXIjz{2L%yayZb20`i{&5qfEvs?p+KO-0J-PK5_C2o|CYeKT|u8 zE>*e^p<~2lC~9>(A0<*PQ8}8_<>&QO@`rzPbq~=~tAu4HcA3G73aZ7CW_bdC0T-C_ z81Dnr!37J`#mfd~0yG{3*$3Jp*cjOlYB@&J*h@WTpPUBCiCRK4QJBnO z(E_sr43_cl2*5Xrz{~CUA2l|e(o*599f<4#HZDFJMUA;P5PKgdlfO96NyNlZ!gF^A zUZNPt?*;-k`ngrI1#XRd=|JY)OlAZKmkC6XmCSAi7~ae+9An(_hbt9>US9((I7j{y z+Qse`(>F+OrJ%2VRoO7;uE3+81VyjCoim>JUO2f|2LbmoSbYUTrdZ>aYQn|YYSTw-{Ny*pqWm&Gn!pQXBr?Dbg1|^-l`1`7K67F9<_emJcMVQ>*?9#f7 zcD7;EwYj%c8NHQz#U-fZ-a&~oiMhA*&fvy23l7B)^gWmy)nh3YRku2+l0yk-?29Dk zPBv9<2H_t5yyh= zP!Jwo{orDL+Yb5T{(-Ihxues2_%hCwGg- znMKR^Vo-cxzY51-JGYt+VD?^_5Z{zDrza>6^Xw{_TCWN%%5I~rQ{*G_+Ml4dEJL} zXxFT{F@!DYLQA$!U7VkCJrvr6y9Z|1I!dDDYV28Uxxeh+0n>sQ4SOuuz>6-4{b2ky zf8wRIpDk^UecC<8ddnEPH*T0Eo|hCSuz5G*_TeV{C1iq&j|hYC4!wFaK6r z!5?1dFmL)n{H2`e--L^tj6O5)g^RSQD^v}&X;wPXRrBOv^^{CMfu4Kcj4Yu2Y=9YN zTogYTB6uZDYyr5~(JMJ4f|79f#82|ac9W*Df~uio4f7=1h3K^{$Bm_D*~lT`sgry1qil{ zF-7P?F~f*QZI}ZzF0A$lDHh0vqnr#3r9z~vT;bQ&Q4Z;D1ou{qR>7XG#$v?P&WgRG z$+v(P`Q_Fnr|VJ$y^W3T1B`&+R|bHgH7UR1b#QpBJ>A_gQsDY2ww&?B5J(?u3!3|WSx;-t1Q+yCn~^573n(OZigmOxf4vXY0pJwrlHV!I z7;t4Hk&RSf0N#tCL+a}Q!l_phVMc&C=M(Ac=oSWVCpx0sGxTDdUf3YG(7OqY4=foH zKoVZaNx;s;Yy(ga3Q{1>itB?G0;$oF-Jf4`qn+1V3Pn~jKPKsOu_~>ul+0DbHlx(V znjv|;gOxGU_A#>A6Pf7?X`DQ8t--ZHJR|9c*rMZ(6N~mk-DsC}?_yKji-fpLY=a@<#_E99kHPH*HaiU*s9ly>M5E>MQMJkgCD#L(%39r z;53mb(}eyBmVq>tkJ;s?fC+)L*lBiajNZ6rcK3gesRa!~#V4o2RojG?YX|5eePRps zF!nk2Sw^dL-s3fm@2H>RgMB{|Jy~ys5N)s-3|@Wcv*Z99J0^sq&G7MYiLF%Kbb2cQ z|GDnT&qz=Eu~zq?u$cR4!#`4!bYm7tQ=C)-jA;V2|L-+fsq^G_z-dXVa?WCuhs2CM4a{I{riV z&(tyz#G-tUxT+?n8~ZWat|c6Dlr8C-k#w*pRr&>o=6Hh^{_6+w2dd^u*y(I>fP7is zq<8EW%g4-WUtD~AA62Xg#4Fl@&U8WV zxCj3KekE4M5DynTFNmz!?w3LMm0rAm-)_ia>(q}1$n2!AZw-s5VhuvQV!wp#Xy@oz zCW&c?P*l#aN66(K#}AS9?_ZpiJ><{+Yc_8zAvB(sCq7}HAb*=8Gwhdal`S4)$q$*U zcey|@YLm$sZcLHD!ns2Cq?+Z04|%*d(+{V;*sroC)7gXF;*e3Z?er);Z9(tiAl^@D zE`VSMb%KOUIHFnr#Kc+F189qf`G38!9r!r*nBEd=}`f zk#)`17?pf4$?s_2zx4g3F;$u&io$^5c|?cUELsV#s_Q^pRA@|57=$3-mmbfcXosEG zLmxjNIiBvh3-QbyqH&Ltt_OYlo##55Vvua26?CTxBK=fGk7e^k8* zSd-V*JzhXS!=zwjiik4lD+Ul+pr$g(AgCmmIu)4|)aqsOD#;Z=KnR3EKm&5Aj8a2u z6}7D(6ch+Uz^b*k>Q@E{M0>9mNNfvSBmCEi-}if-|D#Wf3Q6AgJ!hY_*Is+=c$^wE z(FX2X_CK?ZYvpL8EHUn5H&@UMokJ63Melh461IuZ6sQo8mVEv4(w9%?O#V*`Aa2HF zHK8SfbcL&x@p~B+T!FzXwBaelW)s?%v~jt14JYm`AL!P*bXJHwgwi=QfUG_)=L)sU zqgd!uT1oV1y8uD4g8&@%L~G)P45-^B2q{7{<32SB*ik35YgkjW%oKqBb3!U-YN;hN z!*G7NY=SrU#K8pL2ZIX%8Q%bWI42MF(6US?Ja7|w4!T7Q4 z%8r=0MC}zgnqHW<>N!&MEN6BtVzCX~x_sG>Z$6BxO6r$?sj&r=J?gkdI;5$+t`4P; z+4F}?J^W(jahiymzH&Xl3UU%$!a2}wd9_BC6TAUd9U!rhM%Ci9Cvz=H-J3>>2iynE zDhv+DrfF~0wkZTIKQ1OHoHRjZv7k~2#|NIX&-U@Jk-ckcC58X9CF)1||z^vFUWWtQYC;4}=10_EBA zkE18HMN}M0{dMZUR`V0p?*>vOy6ri;L-(xq!GvcEjFtM`(NH|4c6Z^NC$I3& zlRkRNwEZ);{;D!JV;E*>$}}p!Y;4T?+vnTszx>cROjOge@7&XU8+>liK0mtdCs}PF zerN6b{OB@PjZTBaQ$awa4|AW&fycQ(?bL#h$kx%sF z3f{ddD+d|X+J0%(o5>WV>B3O?oBELt+ZOfdb!*jX%D+U%Mb$ppO_te+wXY(mVFx#g z*TlVhCVB1yoH+lnoRf{di%lJJI89yAt%U3kyuo(nxqz_?DC)TMg#@NPxt*@p0Rr7| z{&~Ve_=sU21cg0WI5ESL>bHEGymw5LovzZDy&9?XRQ=wu@JZYFfplAEM+Z!PjGqXr zOD@r(2b`ROh{Te4+;QsdUkNW#=D&=Tyi^IRy9UmLm+5v1;Gtk6UlgG+KfOEklSozM z{O;6FhjfekAzuV_E~T#$1{<1+26%zlRzK&NIPsMu9Sbw)k9&J)THdj6d-@}9D`3nW z&$aF*s5-swR=*uczm$@uayWjy+uNb(F597JJCt+6-ozWVzJ@P85S9O_nG#XJioEveFbc0s`Z;`Z@U^Zgr(P_OJ zbDAql(ELd98WW&5E7l&YcxRA1kY{7*KiC;P&dEm4K?tB!Q(fu6Ai8H}UiJ?<>ua}g z3uGW%>Y+(Gpzcy#w|-kqSeT2BW60oLz7ysF4S?yE8DLneT3rj})CrI9AGJjuoLV0_ zN3xX_>MtooJ3y(>97DXB(B_i@0k8;}Nb8;*?48{fuvcJEHn!0b;#~@cLAkV*n=#{a z!Y_=^MRAmiC=we$o7}`ns;yfFIEW&nqfvm>eb{!df^F{=H9ZXu3gM^#q)?n8?LP;z zwba4mDy-c-SwLP$X^7D^ysP3ombf!@3WzXfJ(rOitZfN)Vu$QUBGBO=;9m0c2Za-B z%5`I|cMnW@7LyHTst&@Z6i8|wO+xFrLnf1s6{|aSjZM%-5TtEcKs5AlFM5RP2XZfH z;L%qNVXve{b^<=y&RV#Gbd2ib9WjKR#?8*b4>(EA0HWkYFdNVnpN8}(wT8ogDo%_W z`ut#pd3d~`0BR)j3{Z4fXB0lqUFdNGv~%IuLA!Z3u|HdARumD@Bl@6wM7{O{NO>$|mb^5+G3?EDelgl~+ zbawV^_fM|ZOmfMK%^w)k=*hUN+=a?*SfkoE66yW_)~g+owtAFRo@aX&5A^3rKcJV( z4YY9TAV<4LB7$4^7tKdVi9jA#fTYh~9>5Rwj?LHglf-6c@v2lcg|q;!>^}Fm%ivW_ z=;7SM&1<_M%O*)LX@b5azQFnlh)`{iU{sFA%#D46i5(8GcrOq)Dc0U=CV25M_ij`7 z#6`{-C;hszc=U z&Z|vOt=Kv58KGmVGv`1zS`%M-Wx}UtyD<#TieE~yj6O)8_`1EsX?{4er}wn<-1tO| zEN+}5VX#;0Hn&}??S!%}#bor)zm0Y}&CON+xJtFMqbz0mpPklx#EOYHVuz-$;V`W~ zTebW7t@%q2#u82soSM6MZoziaovACkE44H>!&9l$p&MN^KbCvmk2ji<>Kdt>TVPhd zUGH_iTx0IgdMlP*`@-4C*=Lb=VW*L<=Or^qcY81yYLTQ}M(0}TZ)2Hp52Gp4{0p(! zl(?C3i}4^r-ipj*wtnHyDcP;f!Z6bNz@V?Q@$(;F35P*+2JFE3Y^3wEly?x(%ibDPxQdWr8o^Ai!3@9VIHo(|)pJ z;S_Hs@KP!~;gdFx{hp}Xr;Or_EE&>@eCPG6>nsqx8w%_zT1|L?$DUiDu|ZTfwd6x+%_H+;fJk|n=4y=FD)fju^0yFjbn z&mlMpzes@amm^9Wkzzc!iD3KzY3x6y#b79lhqIwNf%zBAS%^R!e3b4$)>vtnOWQN+ z@>}X3+(}(xFUz7`3Xfqw0&GMDrimN=hj%?#FYpE1{WLFye*wIzyrWrW7u8?h{InnR zJq`i31KpWyNutrld5Am!LFouAIl)y05Q7|#VmhVn%Q|-w2O3@j?oraM_>oCcq{NOd zKk>8%U2|8UGPDe!ERy{EWjC{>Hi!mloh5PQK&G;eun3@oFcE?;eSQphJ`~;xh>+8V zQ{amUydku_L5h>M0qpImL7yLQBy<=6Z{li@`U%goO_7H91L% z6o0!qNTac_Pkn>+MY1nTgqsAkEa4umFFMzWe zNDUggvL4pfY05V0)4`Tg@P>5cBznh>#Te2%^BJMyYxdz(QWA_Nv;6A&AycX?5ox`fJWWKj!bO&5Ep8jv7j8>5P8mruZo&iS+~ehqiKgB$ zNB;c&Q0j2?TiWJ7hf^45SWlmSIu?Rj`fPpVpD*X0hR)w$y((I3NNL)GAWu{_J>Rs`xc+pyR=&vzxrr)*?FEH2TW@@HB{HHgIvEU3sa&Nu&@j z(;t;9{zdu>@~Zzhu;*+J-Hd-Znd8D<0yaBp=ysp8tA5fnZFKIN(e5c#=)B*2R^(r| zkU^AdgCe-pCmf2EJTX`fDcb1h}Tqo_PGPVc?d3o3e0dEdML=z}ho#I)z92fv1S zma5BQ{LjJR_9s%;GwdfJV@F_{aR` zZ0DZX^SWU8IT~7yfGXPhuad2om-8NCS?bfi6(3VvkWQ{C&n_9L7}S6LNz-rlP#^sV zNKR0Iq3{S)t2HWhz-dXO+qG?A>2_0B%?iL~f;2>GOA3`@UpXHE&`)ivM~V}=ICZ#I z=I)S>uirNGt%GaV3hLb7#k?w#K8#dDOiWsX#dR_cu=<(ipF~q>*NiSmQgD(@TgC# z1G+F!N9!`NyU?Pa$7cSxyk!%~uTVsJU#Zo7y~GBl3qZoa&-6m^>szPr9$@w13}yDR z2LRp$Vk+r5ZW_zL+_w)5XE5zBPnv|gGYx@2o+*;oGEU}$MN{@>jZ>vAvIXg zATL3poWsVUW@ctk1SJR8Qgm4a7*jCkVa+ zeBxgssn@apO`ncNzNO$h($hD(V(7RdJipYSy^L-@a@jR5r{IdA5qEN?3NKWL;LeG7 z`8M*C^&Pus4%yh|?*2-@Ey^nvP_hc=@Rsom_Bt>>XNQ3MV z(k$ZbNKRk%3P$A75*5%^MqHMa-~j5Wv_*ji1wbCmBXcVVjwwOioXKFr38B zAUc4g5?w`%(%KtHB7>L3%Js?e&Ca8te@;H}<(LfprOn}PKzBqB42it>E*o31LDmIn zU^L5&{}s5%VVKmxsxq)Y%OGF{uV?yI+M9Car|BGgRHh(s~{m<5l+dt&P4b3^?N-~Lw@bR1q zIy|v)LyA;)WaixL-#QdeU?culd9rSwW|y5+U*IlQv1z{UgUnN7=TtN4B~Jfc87U1+ ze|>HOpuEMrWp9P~_ZM5WvKD38?a8~hWDn%o8m9D*Cig^~UYMCqn1AI};WgLWej$b7 z?CsOJ@aOG$jq3Tm9h#$m-Dvx1<^7dt4rvOY)P zX-?WHnQitX&y`WLSHAI;`vVTAHetsSjV0jm_dL5fuZ3T3!w+l3>C4uX&f#CJJ(t;Y z53`eGB|?UCoiZw8tj^aVIT>cJ7};mnK6bRDG<5!K3OY)1cujE0(Ttq?SGp+jZDsnV zDb?A~vAxTT;&M)MD$L_8xMqAeSMb^EdybZsr;5raJIXu$_z;8i{&dKSxbt;`f){Emzy(Euu;WZX!RxqFn9O zmj(4H&DHOvtIpQL{;0VlRQ}xGFmbO=6DwF!f1;(i4n?CJVOMb$&1}aGY$=35tws+R z3lUUEZ&DLN4(cCr06z|AOnULaBxLOVh~P=L zlv%Q{8s%Y4(c2Ytxcd-UEnJU=P>S$o6$jD*&DEI;@y#%OrY-vM6!W+{s~8ILYlq>| z^pdSO7HW7Fs(b`B<0aIH6Ls$6^0NW396~qji^-^zy$7IDLYpxc?=0kSf876fGVj`( zNo&nFgyHtadx$A0Bg3a?a9tBzMd4hUL<)}xG6vjjxbOJxI#~{}q$*|C#S9R{3$kYy ze7wcYj(+}M0LhEJzv#ZC+d5zYZii+Fwmnz34(b{IY(rF7JfYouTV}_7fj&1eIqiyu z&*K8wE~s>lH*7jtem*uX5j5Y~0E(bzbqzj5?dwn$;`-jTdMG9NB^xUCLH$)i!v~nF zh(toID$4m$E}QuwdDV6EoU_6Y4ResY5jCv~;O!fA+;a+hl#3n$d>BR4_z9bGI#68s zkFk@6zlbj$1mOdfQ@kOw-|{0k;ft?6&q*3bzrrO*@QDT!U&x2WLBVj;o?O}*Q z&W{;|#B!s5&)APyP_O!H=iIueMcI>i9u9C|LQZ6VLA?hL=-I{MR39=0dH4*g+pTVWh9~bSBEf-yOxA(NXQH? z%lwd)Y*g42>gE5jp9`1OS=xi01ez0}^Vn+o$2f9kn~t^hqmqTg10fQNRXA?8=u5S+ zM;0p<<-oK{n=?K!92z?Y@BWCFb-rD(tuIMKOP|ln&XG6o zM&CxHy$D@cr~2~2JNeKY7VjBE1U9DKNbgIbZQIT?XuC6=v3tzx?f#DPgn7Y~eDe2I z{++-V$)3fcC;I(`7>R=QR3m0+U7C5V+kWoBe72XM`mMQFp~k_CF=L|%oAp+G`I4;6 zL-&k^y2@3i>BSvyH;nc$66)(pgtXnvk*%5r)Q*QWL`>)>8H4RkO6kDZ$}eUZT2l*E zQ_tUc&D@%EPy26&^j?;B`-@lehvxryqM}cZD4070jD2J?4dbeQ`lNenvMW(Z0RJ?+ zsWM6(eLL5CWxi21|2g2ZAZU1jWwmhrlcu6^C3qVRyjdcC`4vq%L8P)#Fz0P|1|oZMJ&1q zJsSi!tOS32NAilt?A2aDEsKG@K59H8Uvr(q-64DAc6Uv=9Z@qk_(sJoUKepI+@i6` z8UIVk<<(ADMLeoi5o=uCTt?J4I zYE!K1ne=lS=uIT@6Uzm!7ta@MDqX*|xaKR*r!yU|jwO8c{L8LY_xcvy-NyWZd#(@l zQMx5$Evj%<|0)-&GJoxfb%rY^-^RT#*t7Yc<|h-lLV;+s8x`8RWK7*O>Fov*MW2J1 zxM=hpQrH4$QC>Tfz}kqp47w9V1!nvDXGo=85_S_xF4a+@b6d^)Y?ww>VA zmf);FNi!oD6GW45F-*G<4Bb$3dcnRIkR9yXf5PB(vMq)cs$bq;vT-oT5o3mq!XmKO zf^NE|3C$wQ12d$wnbU6u^h1-cvbM34t`=UlZ^3T)ew zCot&Kr#m~>62C#J*E)nSaDh~y1kJ!0YeXGm(5nkDoo>C6NqQeoJbQ40jZEQWc{NH* z9F7=LUk;zsGR4mDm)jTV@f$t3X`lPq&Fxgb0%pToQmgFLkDPMnBx%sQ$k3)9mju(9 z)Ae3X+G06xV}tgDN^_Nq=($HEX@&4e`MPONJu zBeXY%@o@yr#(TI$;4c#!_vnbC8;kR44*2d>Z1pdpr+% ze#GHFs^uBSkG=T!>F6`sv|Uy-d#hdT>#UZSUdcAUm>t4%&GBb0a^uR}aZC!(uF`bM z)z#K0ixI-Q%IZ6>C}tQ7g8dQPIK=!^Q$uf2-<0H>_HrZ1PIi>@-Hz=A?o{(bb`thM zsGdH3)L^yyQg)*5!1c40SMsmOqIKeCI|`n@`O zwvLH!PWAXHt(UT$m3iK&rlU*rpLbSTCms9g?xxWV)}xZ03U;EFh9+}#h}Gh(WfR`{ z!MO5;cdhc<)Q?mPfAb9HMrf`n5ZFx~Jg+@zT}88Cx3_$dt*Ncerxib#*rWmD3{A8~ z8~)Jz*+HI@_k5C;mSy*OZ$%AjaJq)I7W1{0f9NdM@1VHzLY{DG9&Z_bKg(Vw9CdUe zXfbr)@pR-jGRPIDD*fcR!Cb3=qDgrWnWJh`KE8vSv+8U1-0^`!UHQ00$=IEN0JScC z#>pJ?B*VV7ZzsaUY!7KtuT{cOieAXL#<0M?3Z&O_YZysyQn;|_?DZFbcV_ALg=a#6#VXdeA8+>eMJ^09Ov`H?=KZB))*R5}-3P1oNbo`x)9)Iy3Du zR5lp-NfYfe6irQl93_es53I6tWI2Kk+Wc(xAo}#r8-N=q5KOpd`EC&SWJ*tu4(daV zhkfh@bse9>sf7m*!VUyR+wWd3>HaN8ooOsvCNjeM-I=rL%IAE*VkK^@- z*oGK|F}^#4uxRj_nGn$?9-7%ieGIs#HrBqUg9*{>Bz&Ai1Hu3!v^#g|?ooe!C z_2(nt$BUg!TU{KhCAD2|-)?$xg0N)X+`(|}&l_p|C9J=(^h2}B1kOMu)-7ONN!MV_ zjn>)pdCrYvF0Ks8^_UCA!}9uJe;@4$oNs{?H!Y47&|9vJwVR6Gwzpi%AI5-7HfQeT z$e_My@~As8O(yNkPb8CJNuFHZ{^hURan5NEq9G%6MHyktdWlLcCacdpda+J(OM^`8@kbrR zkM>1*u<^i=D}xdMbH=W75nHJCFihwqvmh#JGfP02fE#M%?WqcYQ+gQ|zjaZZhrKvz zJbL2r#KqY-L>>&71-A_ODd*V_m=UM@r5um|zi2W!w zXt}^`#qS3jLc1Q|U>)=xzWafe0sVKPkn{OkW(Lz5Tjl(nMfY%G|N|U8fTXg5o=7!R!_$`oveyzQ_Wpg;hww1 z&AB3hU4bA^a5QJ;Z2$y;XzV-3U5lZ{F=ms_EbH zAJE1)7Qrp@paf*X810h%) zHfSQ_k1molTnGLlKBE%W5oLq1Ab5U4t@}l9r5%1LG}RgTtMQvy7z5oI6;AH zxy!|=4Mgqttvj`mYil&D*As3^S6T`Vj3&h8*cFld?Y9W-MZN5OlW%(#=F&%Zay&;q zi_e2eY&SECXL@!NM>OI+rVW`cO?}s^F5gma1S$mizas z^GO|V5}sK8e*eV&MOWDzR$q2@55R2~nJX5kMK|@60R9aDOXA?UpS--ylXZ+|(0j_A zLPIBl=+p+vq~jKDhZEL6PC7A`CQr9*iG}fHEAG zs~UM6f&`0%UOS^%h1^5~I%y;pa|>9WLo>Lo8cDxR+mJJn98!tgHoPMV{Oo8YMq7*9 zIu_76v0QY7&zVDQ0}Bavtw>mp9q7(o6yxy=iZXFIGyA#Wo)%csJo7T4Uv?qw`WUv_ zfnwoAegkyVQ-~YI`PT_HY)5)hu4_u)g$a>+Yh^*sXsq4*Pu|kpD;)0k7fZ_bSXmS` zV{sW`k45ny(P^B;+ajE*J_QCLD?}N?R@5m$FpzuW>es1B*TQg($Ikmo8O^7U?G)(8@_&(RHq`V;8GG1waD5Q0iNWQ(Yhp zRO~+s4yjgiAjIEr%}s_21O8}EA-O|~`arXXC5$=j0Ci%a^HXrej z1>hh5_Z!KkpD%)1$dIqp6rIMzp7LRdId`q>2!fah1G4L7zJULHj%U0q@jzT+OiD?< zAiiiq05=#sK8%4=rv`v!hvo45IMw)cS->9tzM>_l?l8}4#-{8YyYK$Auff-;s%$uR zx#$ccDq-$O4B>A6hY@$*Me~i+E>C;)3t@i8b!^-{{N`e!hrWiv9x|lVnlafl_iL{T zH=zdozJ^~ZPvl=TH_WmtqT8nhlLbF<{s&IWXV`~!MFX{+N5#BGk6<_bww!%MmAvC5 zhDFPxWwkNcTe-jm@he1`dKtV@;fGv%zC~4;kbdn|<|z*TW@ZJ3*unnYoB9Q<7`T%d zLc5n69>x3x(vu~-tcKVbh>1jA;2$dz>NW21X;>lJ3V0Eng27&ieiF#i0HR+9NNPGW zHh}tS^!OZ%(XI;fW>XP~pxR)x*5OsLk0IX35atPhAVv}h$c3W7-U=OyBaD&HxZGyM zF(KS}5vNG}RWq$n%!xgASuJPg&~j<#(LdL9CIjDs$Iy=5|3%H1D<6m4rXmIvSA*o~ zr0K#FugNsYpufbT*Vc)i4#1JfRnc|&yJ(0644ndypNdKZcMRAbi-_A|Jwf94ZTF%N zhdyu#viie!tVj^;dF?1KJzaN8thPIDT@f9tt0I3`64mMho4V#=tPoi0x;uS-WTHKR zNxtiXfKC-@Uau9oUyg5v%Hv=hCcn27UwOL!@6Rn@${9({3ZdZW(;xQAl%0hFg8=R? z7-L0N1Q%mJMi|umt#4S+UMgU%4r3QGe4WQ>$%Am#KYGb|p`Ir(hbICxEPR}ze4?|Q zgC5QXJ^(^Ybe|0(6C}jWR;7Y~BJ}K{Z|iUZ*B3F!8ZEx;xfv|K&G}suePc&FKlcpa zRFvWKsPO;-Ctm8XJX(`Z6K%K1up2AnjiODsMc$kT-%DIZfiU4CZmHMz3TNe`I}DQ! z^Qy8dKG`|Y7WvDsv-2vua%^hqN)iH|lK1$hd2>0L8BYZ)xoE!D%DxD2fg~^3I%ybt z-~|M-9@jw*>B=0x6@W6g5HvA;)TaE(n4Fp8pd}hk;U;^OMYi;13xN%hmabV=eT)U; zI2@0Ow#6*7>i-wqR2c4vZ6kn>BIuGxZGUA2ELPzB}!wum!9O1kvlP3S#x|WPO((oEd~ECgBWPt2?!d z6hZ(_Z?g>25zo}e8V-dZ61vFDxp|m)Q^Wbe5RZlUOQQj<$?p;=gj7wf;K;~g;t+fdu}cxtuoeJW zWdyU;M$0SR52o-P%x+-SFt^Bmh?S+Bj4lqZ(h=S9Ttu$V{IEuyb_D zwM4oLep*cc3cL$Ps7o0<47(ph#5%fN|Fb(n-IozQmVs<@PD8mfFrTTU`Y zVA1(&XDYAcCB(R}w^|j95~RtVYmpzBeE^}}%!W|EKNtG4wCq~0*}B}ERDAX4!opWB zpIN^8$C&K?!OSI1AKbihXm{!Fo`+cmk)K6jfzJL!%U}vUYg<>C&0n)K)Dqp9 z8=2mL51H%07n0v-qy2y{yxzYPwB*#CazRPg?ETIliTiro*eOf_E5!|kfFWN>20iXp zFF_m;zVe`@&&vD`q&&*62gpGzG8$Nw)6r$k-xD?KgL#t}k9LpuR9;ImS@`o^G!HJi zgT+4bDWi~KLQ?cyh{{NhnRV>SA8h#mG|>wvn8q@mK<>NHFGK2~%8? zsePlxydx805BqkK@ITBS_V?4yxguW=Ml{Rg@4TlTs2Jn^e+}`FFXW_f(InW0EM8w6 z^39~>+jBDm!r5_lOWuJ@^#2i`uC6q#T4MQdyWTqQgJr|^23IW#0`G%x1l+ZVoRU&@-VVKE*^K^BMz zfq$BpoBLJ3(R&Ks^QnuP9FoM`PWpyBCW3DZ#2VbQ^) zb@1Uzsvi$=lc=(}SYWX5(rb!4B!1`w83i#JWe1BS9?&WRWdwJZ_zVynqBhds zvG#<2`sD1f7n|A66%jTSzrZD`a5m!f-b59>x&wk=sP1;>;i?Tqlk$t^W-Vv~FVGd~ z*2hdi9AC!Xi|$AQjby|4M5-X%eSV|d4Dy5sF2PP@-_RqGeeAL_-dq|`Drg}TAUF_N z0C}6Y$UE1QScfq@yNX(P#aN2+{m7#gGir>|R%wpojxsUAY^Nl`G!nZ!1FD%pA3gGP za|JyevmP6|1(g`WHB|Q_AI`N&)WRbp)$yX}Z8* z*G1k&3q%%zCK@H`R(0l5wBD` zry3CMz>;PBy;V8&vP;rd9*#NVT(7>Jz+>wF?Yx}ePxO8%gqId&*)HvHUjU|8sA7CLHeUp0n>Ehyi z-EzRy1I6R*esT#f2q2$Lmb)R0B~!@DSu|es&i0MXC#fKQVMsOMsqbO2VB5pc97MS! zQf)|IFPk0mm#2p>WWB{(!i@ii3E8_bxG;~RE6M?ThC*|(UBy*(4fq_n4$)PU+6lp2<@unC>$&U zA>Cwa)WW7F3vHbML)F#Q;ZI0$F|5{8L3*JyE5Y$NBf003=a)SB`r8w@n?$$mQY-p*b#xNg-C zjOATHMMfSx8%fiwnrbJz_5<)YWRRqhWki=+(vMvXPy!UjR8KruKd66tL{00%4vvHe z*Z1EB@Owhtp4G;6+vt-WJhO3?>H8`#@YGJ0Bb4^M)0lLthHbP~J@7F}*CCa?ze)FG zd2vN;*?|{zGVD!`C$FGa(Lb#DaP#4(8Eg11Axo&1;PD!$SwflBMuiuC@A8JYUccH@z)!nP?BvjYon3j67 zUY02|lqBGR2&G5}S(5wGs`o|hgojt~2a(=_v_-y~Rb7PD7 z;9+qbqHq;W3`L?m+z9fFh%Z}m4Kj1tdb?izQQV7;pMoUVz=S^{ zDIRMx1BDV|@V8)zy+dmOEf_cP=1l-eH`sg#Y&PH&$Ne$E9qD!l01s!pf<6nSJp|=s z?(^gcNwhomk@bo5T{xN$gS_hTL?}IOxG;DIT_e=YN))QPdP>M$#iSkr`=rLB&u}Q0 z>W&{F8epC|PJDfC(b;gTU1ZN2ie$BAe)1qdl&YY!L1)nz8eM!Qx$m*@8s)e6bKf$b zHG%45kO&ZPOX-oI{eVvL9Qa?cGvv8rdsZx4CUXa{#4ptpQn)EKfI_(IDo2)D#w+b` zNZZ}^Sll<}+|J?W$&1Hw0j&@mS5hO5s@=eY*TH|twzhwNHuvsiXKoNCZ`LMvpJxqk zSf`cSmcMjP*yb3L>*%b%tmnKhr>>X?3DCT5F$!aB5(OG(&DGCyR){eko(vrrpGmEI zjVYbvPWi?E(*m^W*-+mwl3ZQ?o?dse`!V`b7}SaSFy%Eca+jnWl8pk9#Pa{CBWlKJ z@W-08ovC(JTnbh2-6-Lyu*x`(`e18@y_kHg+AP!tnHI8Has~sEBX=lYg?_nXh$$p^ z{^~HUOLx9Hkd(x^!R%c`EewH~PaMCFdjxMb98-p(2iAt1M)}rxys|Vw^PtS#Z*3?)Qst@+s!Q_+JJ zu(d^PbYaL}VnEM^L1V)*Ago_J>~Zu`%n6dMT5yv5Vhe@&wcx^cb3v754rd?ru*abC z!l`hr83K>ER})va4#;6+ALQ?A6R!?IND7lylLQgb1==R$S0fDq^a`GGc6Jobna9r0#}2>kB__>#Y3(Eq_fQi0CZTDQ?(yKj?7SSox~if5MMi6|SR zy)f=IHCxz8`3LA@F0YDl`>8?XtB-vo!=u~*u%a;zT3^9-#A>5*MKw#>GsJNY* z>VZ7g=t<(xhJ`4gbiyubi|lk7n?bfM3!pZal7|BVVXpb<{%b3%%3y@R-332v9KCz_ z7ro`T{oeKq37-r5-mPWQBlp&)P>myj{GFm@k+%F~0ka?Q;Bv zB}%aB3P6|wOd0|jGG<{4y`Hdlue!4Z8%H>KK{x}K0w=c+`q4F@+VDbQ zVgXc(vDO{_}T$_8mJ-!l5 zE-T43Es^=GjwwbWBc3&p7he&sYE(sMjM-I91P(0gdaUUOK8i*0L(Zr5${R;K?+C@#ShgvClTSGMo54i4(eXb$J5Vapswvl z=R5)w<_w70421xYZB9+eVsr2l@x2YQ@l|Abm-}f)AY(BzG6_}l4m&{E-WY3&-OT(5 zxdXM9{foBF?jrl5BjUrd#QJ5Tvn}grwqCO14*_R61+EQmtQc*Xvtk*Tf1B zb5W?Bnh^TD86T5V3oH*lGk#+a%#{ES^^t~i(s_3c&B`e*QHWFK2SFi2vXnk3nbhPc zZc0I4wYm!od$%)8!yb7{Y>B~mDztG|*@`jtjR1*lAtPj)sn*qyY)djv&@_3d8yoj3 zE4&ZgWDqVK7tm~4^E0Hz?x;*6W?#h_3Beh6s2fIH_Xh6<5Wz$0_Y70u0TL#Lx&?mz zsQHnByePM$Eu9<>@-biN_Xr})Igm}Pu!OXa+HxvAm=lPs`o_Dg?5#*XE3Om?j0B`H zWA40xNPnp%x2%%X1LV>C>C$>0<^y_b$HdLPWKui1zfFHPc7(9v$Vc|p66m!lt)5sM zcHF zFx+z!;{wC&2j|4gwT{Nohh3#ARB^CAJ;`rgg0(a;vb$Z%BLC7)6J^N4#?s6 znF6&GF5~#|b#4WkA(`P&Dub4bM4(Q=Weq%Tz#K~3*GxY~#44<6CnWXxiW-ha7R@m* zFW5I*5dz}WI9-Bhj$K)BrNpMTGsmx9hUU+FBf;X5TtuxcYYoR&%hw@1mrvXSm%O$8 zR_+;vbrP7+amdUFHrdbW@A#Z=AzK%(gDf!=_YM#Ay=)5xWg9v^QiW(vgvz#(D?*aR z>c{zgH?e!_jwb{ShI0!M$c3Z}g|btcIIaeay^QmgmR#WpdCTTPhHd*KA>G!2-e+^Y zB{$AWFV@I}xX{;yMz05L|*J~ z2R6N4)~w4tT(c)W=VH!yK%CA@oZLO6b4dBa*pa#2jXGJbaAe!D6J@czyLS|B9U5vLx3JlN5a0 zO(6<9&8~%8Qo+znGE$h=%s`y}IQPljs5Nb^PV67c5gOu8t)=Me0eM08{BYWUT6k!c46x&EoP5uyUcn&nBu}qU2Ghdqh`&7?Z7G z^In6+lGOUm)B*b75XJGK-OT}>L$WBD#E?~lNTOpW1$EF}5DRgzhHRfregKceS3Zny`d_x`HMD2ekovlqLR3pcb_D)|aCUb6 zIjq?9R|kqVO15jq*=%cL&Iuo;64?IK@{ta2=+sFoe?ZkupN;_Bs!t; zpuXT5<=k9<_Fx|pDG3B_KfNqOtpKSksYM_+>YKz(g7B{Q^k}$YASNIwAP)q)y^WAq z&^mrpRNyC22dB!yiD*(F7oY+>_re#Ot*a&`58)WBC!s^Jp@?)6iwc@X4w8$uom;Iy z&3dAXFg6dD4&HPB1_AUiU45LS-~6>5LDQXj^9e}^F9?JwA48P55iOiet-q0jNMQPH zs>jdwYn9I+zpho*lfxJZ26<}qK=dNv9=InpySQG3+S$tsGzqZfBXOcH%)r2C;#)Ui z`9sICZcc>8JFF|5EL=d3=V7a%iKd!aZd_F~2vbrmP5U`WlFdju{xtD0!v#Zuaa!O2 z77^{#>~2I%qU-D{Vc)~k8bo}=t$HGP^n=(rELsK5spt+TV~o_RcvsZgQC|p{rM1as zTouZ8{;_$(vCX`FTByf|y1$0T4X>H}YqtYrf0;oW8_zXT9%codVu;~HK{HJs=#e^SDQ~X zf5zPsv1ZGBf%oup6341PO)XO$_Fp{?Em0BBFdkeaSiuS;ckpaf*JH8PoG8#i)=p^C zC7Bf!h=N8C8!-d^e)4_CryF0_MoL^f(YPC~ zM_&~{G?N7a;i`hvFK@P9z{Z&pyD69Vf?_dQh1EHHv7|ocMGUweLbYKnle!v=OY-$onB5zv0o*Gc7uEhL2ssT;Xy)* zwP~1YCpj9h1fVzUAk3-yLEuTOH=>9Zi;y7trR+zG-3Rqgya~IJDXmq)zEs-fHhA|` zey60V)!R)5*ajp2&LEq3(!|jQm2EH0M7)-JhT&cdCI@Mam{FMMgzzo(Ly;BD6m5M; zr13*aBO*eGb?-r7jFvt08;euFZ*{BNcn>UAurd)X8CsSI?GocBCp3_fZBt$nU9pUt zEytpJIOdGePPJtZuqtVyDg0v-Q5PeYsx{5qac`&G(MeLP#75Xn4G)ymC=V3~XaSIj zRNSkPiO-Dnfrw{wjzD<&76UOXdk-P$ao0k*Ta?~p#w++2>96*Jl@ociwDo@ zRbcI?3tgLtf*6FwUc?XJXTkbF6M-c`*?3kY$g`SR8<67HDhXsP2p$GS$TFbZ5a>~3 z#P=YPX5fxNG)RwxnglifZ7h1=8KTB6xJe>w-+7$H^k%Ut9)kz&<)Lvw?sa+Wp8OVB zq~Ox_7+P{mjYtTG>7f|xp8(^PozT5$Yt%*XJDw&E8r%(1ZxP#iiIG>LBMtt)AoWn^ zD)Onid^clpiH*z|>@$*hA7q9*vZeOx*Bbc|8Al#cw!RtJR-&!lgsvP!qCg~Y%BIXr z)dq#_f-7{|B&4d#TDhz6FK()T%5%#h;h>3TOIRCLuNiop*nMsy)-%Rqq9YPiN3F8M zUj?zQP0p(2M$!;aZHjLhAE6H=i_!15o@Q2^$5|AUKht7XlEz!lAr0s}u|$Tb5()sOBU{E#6dg2geH1NkVI@pPSd; zNL8>_vs_^y+?DJZ(CF<+wck=YXOMEXTK9%q2NC#LG{b=7O&%KZ7!&#^f1ZA>-c5l3 zAshwBsr%=FoN;sWrQ6$JnABWn`YLR!2b58Fb?KGaqo_dRgY9~{rD66LX;(HEVh^l< ztEs?%$d|lF+_^d6@z5+Xdxh|MB!?x~AML68#2&yRbK4qZU(@IaU8t(U9L&ZC$)l?} z?0Ed*!919<*GGcjB)e7VpS?*ZdW(GaZwY1<=64dncr~~2Mk{r=_DgdeR*sC0j#+T+ z@yx+B%#^*lLv){Nd&YbzeY3`kEl&$ia8Uj{gRF~LH2PN@sf7Xlo-~CQ zsyk4$PuU(HsCFyNk;ubr+85)u;HOXKpcVTt#KlnDX3TPE+cdh*1m}@p|DZN;;kd})!@_bNa z^_tkf@xHOLXsCdTDq}OF?=~;pL-;_I(SOfupZH&Lz+_Ug3kzVE{gBel0MvRE6O z5%ZjYc!>1NrfMR#u}MRF?lX|`uSmj*qm$&qSRH}Di2zE$BpO{Ad*T?_rY}&fO|xZZ z7`t>oW@jiX+8hJ%SKp~MYcx?LsYv|)qF2hAsxkpxgd{eo3Z;ez8`i8|v&;x{AqZMu z?RA)M#z&|nc-H5sf5%;KVvdzQE=9(0z5(-HG|qyt&D{BW$r1p8&!{cj0NGW zW)%h4V__9e9mdWl1ttW&=>1W=H!<$N_&3ZzZi+6Ep;=cbFhD@P|5Uzm`>3ayq+&uU zrIi}lC?9Eaj)GpTImeD-N(##-qt1q$EY~xS&8HQ^%dDl$ zh>*_P8IPT9z9a9PXwsX_pigZ`FeC^9E`_jLm%ata$JsZuA<)K&ZklXniz<>!21(_? zVGlYhLOB|w)RoQhN3Mcbs5C`7QVX`G=P??3j7)*aOcs{YKNhz+8Fk@~;&7fChMO|9 z{yH{z8?`xrn1QeQhzd-nfFzW6bF}ETy=y4yZQ8hm;3;fwh*?%4(tXY^okBu^N<9%A zq5+B|r||i97cBg>@Pi<%HcP=yA}8@&6Q{)4l_bT7dLDzVQxw<4qy{0IzK=A9NM+`u z4lEG`*yC$nYtHD%C}QxQAhCRF1UEPewP$tf1oQ-G@X?`~{p4!3jG+jgHD`|^V3~8D zLL|s-{|aLbh&-(|R$HW}){9ia+3$?O^)U#a`OQn!0+(7DNDmP8uVnTV^K7A?f5VzN zw8Umhq4-jL$17E@Tzn=HMIcw$OQ&Bbe{n;`! zUS<>ji2f9zh*bD79cMhJk)ENYWaZ$^kYvZGlil zyKtOHEeL7@!Xv8@FF;DHOSs;&-(EOJO^iUmf@Qe5nRWHB?Lq?(+W){3?5B4{!G_ep z<0e3olmS%8+fbJwnD}n;ZxW7TFEg|YIjtENdB<6rWwjmDZ=ztyp%4ajOw6#L+X;j? zXgKa*xph}}&ic}l%>}s+_Hpi_%aQP5a0Qn&LI*LCf{G4_CZ7^bDSrFs_KiXdHi|7z z5_I);LE0j^f>NWM??mzSG9kmT#IHtk1>KBd7cE`}F~k(oMyD!h25c8RNmQd7Nmnmy zlAKo!D#J8TGtX3B+Rwf_ONX-Q0%Lt-w+kz83qW0Dg*Rf%YN=oM?r+vURH~B!A!-O0 z)CWR-FxZ9GfydbRI4;SRr;2Kn(ege>X{IeOBeY>)s7es`sA26N>-d- zk0vC<70)l-Y03PxRu`c9g9LwP_}gV0O@TgDJ2inFw-ZU09Z)UT`WOEya)q*Fv*` zN8$>S2FaM2BYCoj6jJo3V=K@=VXa+ta{LZ6zAi=y8f-2)7V3|X0V`)A8K zqkzc7El1Ati+pu zICj3{REfU7oeot;uZCcXUo(mr%2a{#`e9g#A;xR4!?5WD_lO2C8whqU4jsBv?Dxjx z8Z9tp!g!D8JI>hPCcX#=Yi!$&4o^u5xpUU2^<*%bY<%AbMJSS$Sb0SV`U{z7UJ^u0 z9r~m{mf-;k!3nb>{E8#!@Ps|^n88`&4x>y4qDyp`Xey=O6$7S4rY2pVGlI7UDKon! z9yz@HS1&Ztk;_Q~kHlTrQ+U8jmrWtcx~%c9Z1he<>qL*t0aOPzMhs0?8Ou;GNJw;0 zf^1Z1cOJC^#7OM0>sVr?ce`HL%zz%}`NS6hv0e6pq)og@`2N}8f!VC5Epu9BLJ(CP zvG{K>t-$y;hq8ycU$~8w5m%N9Uqdc}dFs6n<6Xk;*GqG6u2`_}eA!uQ3Sm`HvdTzwV`fV8+%3$|sKlFd`~XkaAwVPh z6@bEy*ciJo`h0EMZs?C7bn;i}EHa>Kt?+JMKpqTWk^e84anL0a>9(dQs{lH0MM-SV zIBG+Xff)^LM^-Fc;jPkAVY@XxulD;m{Z>?tD{L07SZD)Xl<(8R1fU2Ag{fROl~ z8DPvJA*uB4%fQseZ6=Y6#IGFFo~RKxH-j2Qf~T@sBV#TVT1vON!1)Bjh4Q`=FP%e;zr~-xcW+J)zu-e<8?u3 zz58-*{o?sPPvYSI2tq(q5(EKL617l_ zt#niVEr3mAL;~sk&t>m_)YRcs%qkGhb3Ia_F+$G8rnSCsC5-kb>EaCG*Yjrf^_SL$ zkjd}^huz0c1IIlWW9J_>f`0Ms&w-d!YpL=2Km6iyM8hhGU@#SWX(S0AL8MBs z2;rOknR9v9U^1mHT-_5KSK}DONEF$cj73yw7{GIt7U7EOsw%5Qh(5H1)Sz=QVgpo( z+0C;y;_QS72QGUOAE%PQ166Z)VO9GU@47PLKYd)(kU``*`$^bBC4;5`mc6B?ooZ9i zvcJwu&BjxN1gpemkrEFA3_Ph>*IhyL^9L2v(`)=XRkG2rK`Xf$*khVd>zweQBLbI zFP464jSz#;?Vh3o;Oe@I?%^sz{PcZscAw~R(SgfrnW56I!W9P8#Mp0^{*M0T7}%;r zGylKo93?P61^6BbqBl-ntxs7wtw#ON%L2_J2(VfRV+XYYna8ESdATRQBn7EW3kprH zhk7o>P`6@;Z+KI9%yIGMR7%!Cs1y!McP&tYuyMI&?u-U0r#$K2T<^P9jGXUUug?q| zf2sH9sr!?vTg>Sx#?rve=RvfQnK7yoRYhUv4`x~HU*eRqfW4592qJVVa#u?k|EzW= z8>If1&2?zyzr|B8;vg?C^jnyUy^W9n6^T#41G9)_KAzAkmGeu z=$3}OX2)JYp&T|7E_k&B`ZYs+CZU^3L6Gi0#;l(>0UHW}=3(;_k{8BvX5JFSSi;v& z?+7+-l01oR8!7_Sc!U6Jq#K1QHWSzy?FuPrrVHKkg)a$e5t>}%2{S5?Q(XvV)&+&c zr1)YHFF60_XG)b)-C>aI$II_4$$S^?)C>x0ymTFQp<2i~nA|6#oH95d)nd=0(|*G1UD1XMO^x&9Cwm*sggt5AO0Wu+0sHN5p!T zd7ODG=59Eo=xmkS;y*BEb=3o zo>q#I>WLbYlryA)p_8c>ASfeceTHK1P1GVNfsJTC!bAiRc}tf+xFCYT3~XSnuhd1+8{Y&Dn}gknp%&BMF?lbKEo)5i5j1VZ+!ryDaI0XmQz$u* z6*u_`u1S7C*uZIc?yrJPa(Yc3;zCS|JDT*9s>Ff~Ob9s0K&dlIhh%I__lQ#+o@v;@ zC1V!@O3Yvb40PUEoBF70Usw-kH1Oz%PTmfT%Nm&ak^H2~qe5=G^ia$;@_NC%Fl6s0 zmE1!Dnz#^dK87WHW10yFSs^pxkiR9J=*HNGVlinN==OCts^ z4solc=`Me9h@qbvO`V!lYhI^C1xpPW2Whm}TuK&szLBg;ay`^<3Xz(Gwo!vkMG^a% z08d7Wg{P@#-~kt2#<0o)le5}=L+;K{tToN&@lusN<{X$D5dktye%`0g`0MEV#b-O8 zqrQ5vy9zz$=v;a!5t<(-1^oZya4BDF`U9bPLxG3Up#IP{kamx*ayIo@>}&Udtromfof& zvs5Exqaof*noPJD_j8_goIDdX&>35TO?I;2WmH?>_Wb)eBF*nRfJ#-k}aNx< zgHS<~3g|^qRT`sVKdZc|74Vz%#?E$f20>;JB)hMrLJ$pi39+3)!RZt0VZ)zDnSxA> z7E{d9X+;ttjzF#0oP`g>LlXgvp;p0IPSjdGPzTO8=nvd_3Nrt-gQ`hfl!7LFsb&+> z5NlBcxCHKm_Sp=!2YiLw??!5j$UN_1me1gTAo=ojb?w_wW&0}TwgudLPYtUm$u z6}p_r=r>VuKk=)u1tnS6A)BrPim5=Ua5ao2hC%3^@$`FpdV=&yKVCbzj0W7^hAly(q;1S7bHiSc;Mf$yvS!MhHLh=|qk zSw!qk$lFjFqI|)O#=o2_DC38YD8rMI^LL}8o7^`v4mCt%7D$w6nP<65Ni89Np3R^T zTY($mEc%zk7zd!1lAS@EI#DM!1l8Uv1!?t^n`eo85q|c99{1AhZKO3o2@QD~6SXvO z5z&t8SEQNnr~9<s(X7(dW7}y0Vt`QwM2$g$64_ETRgb%xkZp;qWfYC7}>$a+|Y3Lr;on-e-WQ8$v4ghfTrB24#p`NKGj$!{JXDMyd75K_e$m4(#ds4e(q)Zq!M zg{f_zNJ{kW+6ESyY3s~wyL&SwHS19FpWSTlo^|& z$VYJsXbHDUq&%=t>iUV4Un(#7kv<=VD`>2_mT6EJn(Z0Jv&(i6S4sqsE9i(lB~Mv6 z0Anyu?=+)2E?yt4W2V1c-vJGOWl@goaG2;A_$2%BTJms*NGl4XKit$I9d*g&J2UN3 zj3FdaTvJurJM`ybdkvbeEEx26FkkdAvIn^SFr7;mkiA8CetrSD&s$J)b?6=l47xm* zo#Gv!3Zk#Qo*+8Lmr`+OZ{asGNR>8t-e?&bCgC=;4XDG7ba`5*T+kq_rafZpr_E*h z$`Gg?NGi2elw?(;ns&b*=y8r9U)T|Nn^xnyvb8yqG-a+R+LfGSr8uO2 zDe=?-(($;ZiEzFc;>T?@*g*mtFB}DU{n5Y^yLJUO10G>9&&b+mU0xZKONso|L@QY? zjY2EA8cr5qU>*=Ek!#E;LGwAB(w&RMj>Zq=4U98xClfjrP8X^J)E7YI)Qz-gsT3o` z4&->yM(;Lv*@D^t5)wjri8}zuWlrC^4S!6AA7E3WS^&+`Unxgt{?EtbQKZa}2AKf5 z$`TZu7-oV0r345F_2V$#b}LrNqC=|U7YJ7C-23mUpdLz4tF@E&@{bc z`2u3bz-PAYbR{S&pHx;Aqy@npDGZ>mX2uOm>b5Cqow$6U7py2fFbA{BQwCHL&rzA* zt}av#!^5%q{8)Jc+FZbkpeA8}so&$MQH?@!duFxtbHaj)0gD!?rj>aA1gvWU@l9o_ zKj_4A7fMz^x~V6g^VGJf6_3!jLES`v9bkVrw@$f+BgdnT7=fz~ zUPGCZ1w!VYDCh*)wrvc^>|3F8QeZ+wE)_ZaXs?K%teY>ZJBUgyGj^}pf!MwIDFfzT z7&kp%!4Wj0=AUagV4mtKUSO;C$2#4Gm6z%35$cfAfGGOg1-*D2WU%l!eLe&lxIQ(g zKZ!~gzaoU_vB=Lxd}sD*zufQ+EmZZ3jQMDl$cVNK!0b}mc@F3zzi-t0Lq7~_TiFG?WhF_bb|1TE=ow z3mr$>5b}SGc3Tl~1M?uhoOows9_ep)-p8HH5fJ9-hUAm*4r?xAfj81j3DsU(cTi2^F@ zsWZc^p2=4Bs&~MAK*2bLUq;GK$SYxPmeOGW)J$AWG}(mIiM4znZ4xI(EcPZJ*4{D% z0Rk8#>97uBF(1ZihxyeH}d!-Dy<0T0)rmpTB;k&+OA$q2a5`|!2t&XC8%5e zmjWCW(c$Vs?#u}Qh^R#G2^4P&6rWmqy(%2JqOvhJwkLEhu%y#yJ^DI91IzH4A{(b5 zq<+ZYLI3Xlpc$FWE{${WXzv;sD{uKuk|S;8lk; zfH)45ISe=4|IRgxo(T9@TXp$o24%f3!&r1k%wpPl3p-R0wHn zj8f%K_%7fc)3j*8EIFMR@M; zixfK%m?ih=^U?Z{2A$7*kwMWxKp_YPC=s?M`h+lxq>-9P&@MvXtdCmbV4t+j%^IdS z*cSk`R6tmvYLdGb26txOQ^F01#NhWIH^+56PjAD4>eOEWSr!8RNR&?W8XL)CwJVEt zvSh3DQ(~9N^U*Cs*^JjSK;Xu;`KZ68&p@`lTWD;dfz9T=CKogpa^Ye^Ah

eKih8!DP1M^>!E7SA*v9BQB!YE)bN1Sl|J!lwLJwn2P%OK(~SdR8${c2#;q#*g)1 zZDJk2o9-Bm%jZXa4BSTP#P)c2L4%L_qT#33M1W0lHB;70(h4&!lBmK-ffY!GyFdwO zj}TfBb3IFtzoy2}vdBLnLHIzTZy4BYVM6(Zt3#f-2N!*CfCR}(nn*!OF)oSujAX;J zhY43b`GRA4e}o<)FBdJ~Me~B_>wt1>oKOUecoAFU@2zJor(%Cw@0PRNhGqnkE}hd&rAKizF7qoLU_#NL zkH6~e1V0rbY-#kJns@ziadGw7{_#Pm1mY-3!`NX|#X8DFVm>oKb~2*@Rmw9z*o8+g z(wmal8Q>gt`QK?g84U6#?g;rFX!pj}O}Ytw=D#S0TwIrG^(lm%5&;y2g(P?MZfWUy z`tVbk7pbz#Rro0QZcLrGqFYl$v|KD0{sU1LcI33N*?gdr%>J8}iI`VKErz zaglKABpDhX+DnRmd5G}^cB_FD8W%~h`y|S1_we9eghR5=GUH$l0WiT4OjzvYybonH z2sKW!Dg-eYLV`9yCL$v!klVu?td*5AHhgqC;%~ntZieppL^T1(HkMDQo?*#c?XV<> zXg$N>?xgf7f$g31W%x5;(6y@9mQ1ZpvFhsC+^GY$@TW%6iFvdHYWU3r4<>CV-seWJ zyJMVkBGKl3E5wn94xMRiRaInG7tK!qbtQ+e7*G+yS;9Yz&R+xTpJqMO9B9h1EfQuu|k**oZim-l(nApo6)j??;8}|w@-haC7P@q+pyN&?8n9HHzWq=7rU=hIWZJqbR4htGkla2mAIWS=_ELxtA$~rmry#MsiQfBjm zJvUtsCID<$aNcp%a>M*}{)bT53D)>EJy5bs9zodgl6Z@Ks9Q!sfY>2;S8)E{cw?id4j#)}643z4HSO^>WPRytu2T^R`nzzP{af94nL)qMzh z8lqad8|?tx@>bf=R@H|u%{=D#8+Iojgw3N@TDKLZTw$ITc_?d&g)qk;uMeCQ=Of8E z(mimx>2y#s;P6vWOQOAlU<|w_JPD{Vaa4Q!0d?b-Xq0coci|0Sn%E8Y0lPbPEBSmC z9CfPUFKJ|$C|U)PC4Ww}7Tkibx`LF>?BAQ2u1yW>w_@BWT~X9n{{=jI-N9@I!3&=m z!uhXGYa&x(Ptgyesw&6zgmObTzHz~6y8p)on9|rrzHL9zSHg|oZYvNPkU7yeAV6qP zGx|zliI~S-T7IQabxSzjv<841xQPj2+UnK+-+XG4_Q!ljj3<5&;mZSYpszXh5;h-* zXAx%+3wtJ(oia!oS*ZpI_Wot%QGx`-QSQhWcu)gHm{Z3hz~$g=mpP^s9neB?RhV5O zOu}9efJY8@&MDq~IqVw|=h@@9#A!W|GUxaaxR#(jHc8O5DeWsz9ssHX{!`kPRBj1N4lz-Q+Zs zGvgLv9539AyRJwB@W`6g*s3APB2=A3+}T-l7fS=?eOjp6`2az|k-3^F z{DRwLHr?D+DF{O`V58!I!XEZQop$r#UO>_zu2q*h;4p8&gMCb&M^H_@rM2im-}$sq z*$U&o^~I7EepJ2vt6xa``NvV6!J5m`rIa*u>2VgJ$yXr|twPf82c^pzol;qD1*RF2 z;serYpnx@az1HC|MQ)x;HX;#_9X_Zh`b0(QM(!OEVdkyvXM(sGD*+rKkInrnrKAbZv1tTKONLlkSr2GmXw^N zroz|8PqH|*V|+JZY$>}5}u_n7R$m0do) zQ9q~!4 zh)7Vhh#oRZ%0^v)k&{m#Ka;(<}pvU%3 z)*VMeAvHDprHKy=OzH)gXuY$>i3hE_aRacu*NH!|x+~ z+qAaIrt&jS;Qqz_7A^B<|M2{dI%+rH#W;%dFQ&|%y zoq)#aX*w4zvCjCjuj3nl*Q7wq^Abh)pMymQYC@G34EZJUG3wkhOf-0L(N>-NC&>Q&lK@ zi=d-k+L%JI#K14mt;F3U*@#KtR!T;}kR%_&DbnvfFIL6$3*^3ZA9Y9*&;lzb7`SRz zpms5s&nr2LH*`MiaDqtr(wUDk=;|0>Uyu|s`LXSf*3$H>$?rwC`3XXKx#$nDz~X>; zzs0pt$C;p}Q>uG{TVnl4RU;f_>~T-dh%9z5uB^vA%<9FuxMRa5*$0l*!Ik_&@2j8d;72v1AaJKPj%^3*xGq5qK7wSj+2K+_g}bN* zP3gR>0^dS+(L)Mv3aOZTPLy?)yVMCAZ77Sm-2o;`_}9jrfOYmnnd>=0b>+Qi@#;`R z)ABe2F%?q~+`Uy|W~FdJhRY zeM;*!(3V}#wK=4j?U`O3PxCi{hvYoNLg|*XgnHK%byO#0FQXmLM5((q{GhphpT-pz z3$x0u7Da&HZBXlPSX3P0yn*Cx{0k{AS;@kT3nmjs@IUoyv?mjXo9f4K^A@3?OeF?S z^fi8_gbbzOlq+3D8~;p3r_z4lw>@9dx*D(0TfJjBun&iFFmqQu%0_|85bsx_wn(3E zSvvlRB`6;{cM77T#esZgI6@zX3b+M{|^2{i_iq9K`ucM+eoM;;FA8K<|iTcm#t(T3!3fz`gQg%l%%?76a=kf z!qoJ=aPq~%);NGDF8%leVx3h{ z0A{*;L(|V}$(fD;Hu)p}Q@jPH4zBdykL}uUzia;nd%}!H#kKO~cYQ=#0GEW`1lY7; z=-#vs#P1g?LIUz{Vl13S7WVXo&!>X3H|8mdV8AS$j6|@D9YTQ*N;Tm_u2-)=8^&Gi zFPxZA@%8U@c7#3v7da-~XQh(k5wp%dP$$P%u;FgaT>iTjGn@S$aQ+33k?JOSdfo`h z^n!n)l66baTW|ph97sA7J`;lmW8l72+9Ev-=(Rl|r;P)P0v8zL`cfg5%=JT2hgC2) z!LeoAg8V=V2)<{s=-5qQTk6H`gumh*uFX5lzf$Nv{V~WbAZ~pG(l*cmT229c`h++s_jpcb4Da+tX8J^yha< zk2{Uw&_iTrK|M#z*9bmNdZ$`gg`qG0)yz-4j&NjXHg}nbkr4l~s)#iS&ZU1MtH(bZ zgJ0unXzqNhURuoCXZ$uGIy$;Jqr(AYBKdY6pRfgfqTD1Td%=2>?4zyyeWgmGWM`N|US(TY(~=$hr%~&%vnZ%T^)`R? z;?*)~tHZ!dzkotf&s)B{$>C#H=e?l`>KcLdp`tLgvk7Qys8FX=$NDc78ZI%~pQ8!G z$#eKLLV*f|n=VT|=#(dS}1S6?g zuWS9q_cTWW2hf@(@c?*sn%frzAr^S7Bji@~LWT2E)*O3z4dwFZeMoTv{&lBtK^B z0w>C@)vM3jtkuJ4`7(X+nvfhDjKmzggLL$t3!6ony7PH?4>m2EHtSW9nAs-8eOwRN z@Mri73y0#>H2->S;1bk!r+xyv2Yu;%aUZ*ye7(;(&Tyn$)#5;Q#zoMSO;B=RAaWD! z3|1osB6pV;6)(+vP_PD$pngTHw%wOClY^_~QG+g|0_Qh?wE+OmJW7TKp*Yc;p%f%h z^jvgLE->iK8c$-1k0@+|EL1lA z9!MsrBc?kh?t?F~(q7FWWN#E^HjmQrW0=Vu&kr&!PW zdLvCS2+mO6f>%KPMaMLCYa3?7R_1UM#2H zwKN;B1IT+{q({LXa~v`-kv>Iv2Ud=1tuQt!wF0 ztfh_J1BrSSSq1f!L%g#WtYQoda;G^r#_!x$6qx5;g-a^H8afDpz@W{r*GA z=1v}HzBJ1??{3YSEU+^n7z`WSAR7T2c}|k(wV{fL{}iUx!L=BdcVo>2dT=!DZ1NZb z>jS$1jVft__f2mVWK8XHW_gr0Vu3GzYv53lhk)Q>cv8%4w3Knn`z%*n*$l85or98F z`M9`oiv`;f*g2e<@swmc{=`43!NbBnuF!4zoDZz{ydm^4g`wBiV7&RMoi5SWPE#{b z1veMg+xdX5mNW^nfv0Yd!z>?!yW@OlNUbx`>H%35VsQtG!3FcGw5T<3h}FprOz|jb zL>YpE2AByo<7T5w>1BdprmC*>j{97+D1txlo%NHbdCa-|9x|ixaPWgTsNtu%eE<8! z#g%Jl+XJ6Y45I4XpA4-Soyk9np77HqJoL&|l#F1Ii!lTuJrMAeMgpv?qu)1%*<^8J zTNs`a`f+1l$UuP5$$nGJ{vq4V8IH6an3*%*d&*CGg7aVZM5LnHC4CW$imddo{IEd) zum*`mlHD;dQ=?c^Cw5V&$tO(Z9$h+-YwKn<)irVc$y2Cu{(31lM}=B2c}?+#Gs=<9 za4wq48eEz&MUMs+jcPIoTbq1!02OIz)Xkh$T&R1$TTW5@UMKf0vk z|G6Yeb&)MswCX9e>Sq6_dps_G(~5G8p-PBwvOztWYMsQYuCYS#d%?&{`AET_flFI@ z+;{GXG}FXPXzpS?b#-l7zk$o^0@)?SB~$rCs>}sHO7^DJrRa2Zl3VDs?ZoUjryxWw z3K9Cr(p;Vty#F_3bfzvUddqoZD9}`?%Q>Ut@-y;0#lH^I0@FCtYR8`(4F8;eI7KsW zSLR&H-l7%A{XP9sKgDoev*`@arLh#8!K99d6EEfOIgcY}>*^ls#ZRc|_eh@^)O8lT z|IwvAMDEL3s4fbdH|!>Qn811Or&!9Ftef5!G?{2Y%QT&RGbK&u47m(mR2bD!0FlX< zMfxGrj}?ELPR7V<6#05}6Pt638r_vnp(h!8M)*cN%tq4sM3y14D=w3f@?-K@&iFuh zV2U|b^kt? zu8V*B0PXQnX*&{atGvf_s7`u|qpr1Zx;B9$)l)326YIsR)h49(spr}}k}l*-+sIO7 z?<*9`BzU0{dYnm9@sy%}r!*2QGGwi9WIhW=x*zU_nIhWA$d-dlF=WZ!iSzwL zFHi9-&Qc6Zb@_{v_okceT$sCSt;f8qk*CauKZ-sW_6WLOzvPk5CR z_P}GG@H(tWXJJ-&GeG>UyM;3*mND)o&1zV8UE*~rEZvJX2I&*dd=PC}H8`oKkckRe zj4;TSsjDK$WYGCwY$dby1|%*P)u1*JQ_^f7!RY;Hd&wzU9v5R2+$0(qMv?tHPFZfb z{MZ+5*g@PU%I+vVuz(j1Z6(YlT>IO%F?*eYa7n86R4c#EcB|ta=BhA{Qg^|@s>o_% zV7ZS;l0MM_4%jD$W9YoW-)QxZ*4NaeE(4IbGLNe@Hm3XJ1pB_bAY6DjtIv~o_8-U^ z`Bo_GYZw!98+5LZYOSQ9y@-v<*T$YiYEsY>SI^<*|n9fa8s^nKYS==$naF&rc{a+HOB(wi~x{KCoZ%F6>b|T7NL8>&SKq53MlF* z8ph!8dwQMyo2aYVlk{gp55RX;@Wi1vg#f>+@d%)8!JG58;zwE2{OtK?PB0bWgNzGf z5{BS0*T>oq6D|L3@#&P|8;Hob6yW#!CeNoVtx0FylU%zgoI@%h&s5+(T~QyFXz2%n z-N5(vS9uj|^09+Dtze2?L8_N6Ns`4Bz&Wt3^9#ScvWEsb}&TS-zc~@?dB6Wj;O7 zhxyk?v1I*6PflE2YJKpX^~D3RH{C61c@!rYmWiG%!K2H?OB@ccGiKUG-%-h(n=u4$ zwV0oRe5`2&>9Aua?WLLy)okR;@U!DnK$wvyw}iy6a{{N1ZNHxs)|As!itH_ zoWEz-FVn}v(0N+=Wix4@kQEGT*A1TOtqK}JGB1w0%MT1%!skCtvT&aM<(3S= zKZZ5+?nLcG;|be!#PlxOQ%k&M*pef#WeF`|5@rM8FHD;h?`IgNokpI1va1FQ4%}R@r5P!L(E3Y z5o}c}9?3OgV!Bzznw4ETw#>QB?ftF&E<^3??wXL;e7!RhozqPmsmow+w@cH+F>~EW+v6tY|58zmQ2P;;$Qo#ARa<>Wstw;dDjcKx@J5Z;|1; z5gJ!q>kD0zvVGCeb+k$!jVo00*<*dzNg-V3EH;u|b(x(X_eL#*>nea>4rMa{ow>3e zKiOi=cxwDPgZ|kSN2b~mUA3u^cC{rZtE=uBRn+}Q3z_{aq`d&CDQxd`|D||XO9wY8 zBvTXZdHYAlUXAuV9Cg%vVmVbSe}79B!x7s|^c#c>&Y`WRF|F;^Ozc*?9~jAtpFY^T zdB!-8JK4TDM9Ll?+Vp7lkE)|OddC?>^+_SK|K>@3Iny;)aTSk@tzJ6v>q}?BxT4rb zxYAU9c;p9~zx*QSeYZ5#MRJin)MvxWFJhJVxO*0^C_G?D%MHJrdo7T*|Fr0{N3$zU zU;D}*PTA-4gK`s!co)ye9HhPj|L%6o=YXHTj%-FC5Kh%%=2KM4mN6$LrpIUKqzIdu z{!Z_V)5JxvVgI&dACszR zhErPEXI%+a)VGzVyQ7Wizb7XZ#@66?lQc5EE4jndWG)kth)G-aahfKPD(3Aq!CpW0 zl+O0Fjzq+JKfI3nfQ>JH&akUqgMA0R-$%^>W)_q~U>07wk7si9PCI*ZW)LFhg=-@% zg)6EV)d<8fCn{^qBN@^710tOj)A)QxDFPqZQqdQf%)%gAN|CVmF0plkwGqu4Pzi;q zDOqB5;rexc)w-4Hlp0H7&#S3fGiBV`kU!PtKV)~kIkB>#O^`D3Ja;DdNEIwCs+hLG z>=Nl;BDz^qlfdm|UT+q;V*m9yA6V(Ai0}776 zC{-OnGH5GY;UNRA{~KfzYdtC;lf{Qrcu3J>t>%zNs&%5EGpuc5*fxDa^#DG+jaruwc` zF1iM<6AiYpCLT^2^&$=UjT!{8X1($v6VPEc$&ICLhedhgYPuNExU`?ceE;+y_Zf-FvZ%zih9D5 zy0N}-E38}dxMg6paPHOK@M(WeBVShyU|55C;X)IebCJ|f*MlUoEtF@r6%q$SUw{PkMADkm~iBq9`QWRUvk($57?8}c|1se2|rZ#$w(x+13|Z< zQSmt4=20s9wJuMMEfVEPQz~Xl;(py7pRlPvqWW^7tl3XNcaeH1j0zOfb*XbcvZh%w zqF)8mzAX}t+!PKL3fItdhfDp=K^Z9;CWN+Fl@cl6Q07U#flo z-iSUWo9xmNL{g~OB7h-SV72-6(anDSu^FTJ)x&ktZuz1|?{7J`ksMbl3}7T`<}KDx-=U_ zj*WYm@Y~Jo`ya)PPQ}^ONyQ<=DAFGj*sqhmOVC3NtwTBo}t6C3qh*! ze;%xBnL6`Nr1;&5@fBg}yZ6gSA}6+oC^p2sNebaMKVMI?{(55dpk@4DN2X7^$VzG_ zZco)?5kkWp55e=_M8{~<&VU9?Sl?S!NPgu^c*G6AlrvHmfz>cn9FQnUH=Wt=Xr?00 zrMqs%lN>kEkGn%&&(=+8PyZJ=b6D5aWbMTzdqzrJCX!^GoY{2xOylJBwHki=IXoMg zY)UdJf9Gw;?pT))eZo3!+*`3*{;$pKI-A{P{7s7``eggdUxWxhv`f#sgh{5HE0gLILo&O%;F(?5s_x=S` z@xBs3(M;ix@lzXYO>!}ZxqafJG|K4k&6S+G&I|)3*mHw}avq{pu zDh_Ff2r7B9z$r>s#Ml@ZW@ z_aV>{BNb{!P%rv&-oGO~h-ClE)O_+_<#$R;gJ&bUueJfVxANfv5`sBr`2xi3C_QoMA>NV8?-FifVu!F zfZpU}z%|H13O5zDWrqIpa_0w8jI>jjO9K|X2eq$xFGC*<6r1-Jsns8tZ zLaxA7GR8Whd&N1O^EV&NyjOUi)f-JX%yQIZhyzNbRmH!#D<=M43| z@xSXjx(E$L-4lm1vo9s%iXy$Clr@pds@Lez#;}C^@KX2qA%)yQ_T%_Wd_L#pY0@AK z@4*u2Gt-x3<-oX{|DlGod{h8vY4u=%e570KL4Z!+Q>H4nzyM?PzRRa)bzWsUGVJE( z^@&RTW;Hl}8Oa?(#0@qF12vviy=f>Fda;Mk)y*U+5;)Tp^7-8lC#!XabWH+ z>H4_Roay?GE&1z~&1C8$Nm5+jOSv6__ls?w?ppKBrnEUT ztO|sF@-#(Gg|t4;Hf}F!_ZMj$7Af8?@=GpFE>dsBm6$rI^A7CBrkUIzR<8&?Zm%Zu zxml;!v%KBYNg@AINv>O{+k^ulxxYxd$wk^Ed)KYd-XACSd@`RmSv!iN;;hSbMo6pa z`=^?Y((NkNd7fjto!_guwAIO8D)hP^P0;tvqqG0s5I-HBm->=(x!N7l{2HyY5W z#!X9FksKW6P+sM>s_Eed}C~up|aby%UP7NK8n*|`@Aou_! zyG&V3<(3IXzeU_Yiej+$3Z9QNuuyKFX4%_cA8kkISSP5_V;c4 z>)Nz609pVSjXXF=H!P3cEASMg_};(-<`>k%2;HZuh;w5U384va*e5v zMTH>kdTUU%l+jbj5UeC#_yN)2Ym6e78@IXLj|2$GN&JWEeptx4)U)7ktODJupuC|oR% zc)4oT%^;zgy|FO9>deBFpLtxHJo|+CRYO9dOp-}fwFK&c(i;CS>u-(~?DW;p3pvw*N z{0M|O5VY9qksDtSR=lnK3k2P&#e5)=xJ;*zjvUh{A@Rc(jM$hhGUKdoq<38N%HKuM z)Qbr0MUowuift2^UCg=0yQXFbN;gdl!V5CyLx!@99z|-+2wLS&c0Xr%gXpJYwWc#T zpr{Efh=Fi9v!_U%8L{WEPdLd@uQ-{ zs!1ac9Mja;wxGV^?{4edz0R){q;x!P6NJW8^XWeQjj`z?Cj!tyGkc=;>@fLE2W3{8 zCd2N;1nCP=W^e&Y=;SFsO7A$*{P=7Kp86HlOAjRsJrA;`sQ?8mkNpO%8fzin(fCx} zT%Pm->I5vS&`Z(mM0MaUNMuIo0LR_If2T#=&NK#i#tf}Cba1L&#G?e7=;-BYHjVo< zd5Rhe{r?BDSWAwf(CO0gyMzq^cyT&+n^D$%JJe!f!vCHXorgy!p))+IQ=j$&eQ(1K zrb&Cl*g8$7p+oyM=H6=bX?%is?oBrCt?K=rKLR-Z#-L90-TE%KhDsb{`+%@oh@vPI z)G!Gl@?S$nYwD&-=!(XgL^a+_u&(Iemm#Gy4pLLOFl4aLhOS2NAB!daPM06LF!mJl zUJsf`3+g6oq|Igfho(mhQd0o=F|8{e$+pS=agarS$Y_zD6|uCWcM7DVvWbhb)#Ed= z?t{bI|8D=H;-RX}NuVp5d6dPl`R?;f@jD}VIeo%(dWo}C6ry^=xK#yL&s!z(`ozP5 zDTcE=EiZOxItGq2%dl&9lr0&NpUkJT8~Y2GZyEp`@?P&KLPy3qt|-$oa*gS%5htDVuWwzm_W0L&T_4q?w{(SC{zzv_&dpf*@niq# z>bpmu?7i39*Y|9z`WE%m-DS>ltGJm5@!BEs@Q}tNQA3oLbOym%HqtFW(LeL3`$$an z_fKcr(N<`jhG(eNh2zl+`B}?zDgTZ93g9vZ-z-iH7E05?+I|FuX<@jNEpz$B)3^W+*THL_OxNq27pM=>B* z&#yBwH(489Jurm+E@s+5@z=n_JMHd8W>JdwZ)N>9GGx3j2O3qnRF2rHthKEbkK~Wb zdV(?A)}AKvYcY_6PT+VTBBS0`aaskdNnz6)v0GQd-&g%?AM0!Yc7h9YNcZa zQ3jTw>_bf}dEPWC;KFKifEU2-9aiE`EKDd4r==%i%T_1w zF6*SATu|TE+kfTmi9)?{3Q+ak8hSucRkPak1?i1j@bceLem|Y-rF1VxK|FHkaHWz} zfRu299Ql$Iqr9@Ekv@e*PFHgEbzfy1ENWDv&HX8MJ$O`<+x+`ed^&faNa%&TQ;YFO zKL{pwS@v#3=gYd+F4z*D_J9iviTE463ML7M!M-Uu8skJ??ffO)&PL`4i@{z%6GVbD zj-C|>y>4w1*Y_-3S{$gf$Rqzt@I3E-6%q~8pqf>O!){DH8i;&$B?fw4xp? zGOkofTgA;v{89M*h~_G5!xgrVUxXeE+hP~`iJgYA(Tk^B?Z0_;eX@7c*ZmhGzgpk* zbl0xiR>)MFsNkyvK}kX3J$L(*loroG6xhPr(57Bgx?+S?Jy9rHk9Hcp+M7bw0;+>< z3?RG4V@`1Ir_pxMXqt>@w=tlcWD{dhiuMBv*u=WRkrojPWRTxMIn4EnFsALGmR%ik z^A)Hws_(H%Vf&u7Q}7WFHdDY)(KTa;r|$FvBRb6S2Y>uHrlC1@KMsS1?SuAX!ES9( zWGtyX^j;fcmzo$)RYxbNAbWUW2p{zlNCQGi@S5}8e7&U=e3x-Zb#tBpsvEM znBm-BvK4w~GNcKlo1y)99epz#^Y=2x_)u4GBTy)lwj+Zny))w-_ltV@9CnX2za9-& zS!3)T@MeAX?}`q9=41m}vEkpg3OYA3cTg|XE+a3;@j4L<(@efSP2DZ~YH76i zlpfQtJk-NtdL?0?UV(oI=!*wlW34Eb;+10!8-=%t7DL1Pj)C~WYM7RK3ED18ZQjr& zxMiiRWv<>K{&OyF{7+RIf=>Duu}ZIx>`I_ml{v;<>ENN%puaPN#DP`?=UFp6KhW+( zK~zEPon8{YqHGViTHmBt#n|9R01AIY}PZ6apz0so=qA4I=l_l7zzh~~v8 zKkr9$dNHU9_o(L$edR{;Dp&Kmy)kDulGm>vzIfsYj?$6R0JkQLPjSs}21FlGzWFAN zZTopX^_tGIH3Q=OaZ$Eq{z!{A;0+Wl7hM#Le#z^)mY1BqKdvU|GHJKHc2HY>U8SdL z94|MBzsi~FSJV&t^?P`RM_B8yzWy_LG`4lO%#UP)Yu zc+@JIx+O0zO$FXm&0PwB#lTq}of6ykHvhH#z(09aQzJWLm+t@iPYY*B_C<-@MQUcM zX!fQ5CtcJ_e?PBvVQX~3jLn&|V|8tt>f~QYYrAK^@UJgc^=))}=iI0#yJk8Rqj<|1 z6 zE0q1G;NoOUS;2@=-PjlGKKm(uc4-1@>V-?urIN}7 zg*3gcqfT+PV7UBrH-_rspO1`*r6m__*VqFZ>-f{nS7%%?m?~{fpW34?`lqoqe>gJk z**^Bn?zoQ)4xZoFbW2NmQSs+XshBghKcC%a)RS?k(K~{qo%#6Q0?pm? zsd`zavLe&b2b`%oNzWy}1-2c&HnsIfYXAIKb}6PV-Kd&Xcs64@;N$qTso8hk;ujCg z$_Lj)8OO<{FNz(yc>j&yzH#iljLY&Md4r{dybXE}Y34Q=KJi6vCQEsoo}MRH;0# z%wd&^x~atl|L!SJF*=c`ZNN04$JV!E+6wxsld~-Qh!%T9+Wku^Y~r*- zrhW}cZ29v5G(EjgOqQGPMvRGpC}b&=#&&HVgXVk_eW631QRZgHaunTsggl<#JrZ$9 zSS&Xjx!>Gg<+J}=R+;bxF7?N{AU6XGMI*F>My~-dj88c=rXoBVNOWGk2v5JH{&~H#%eyE1=a#z&v!N^8mt4S$>H zB>9}}C~v&@=pQp)n#+nZT)4Btu?cv&qC-KC!7TM53+p+{c+aDa(Kde6iR_+siGaJ9 zFq`9~-v|;}m#XJJd&gQ6A+Qelc`}8C@L|I{XB$&K6H^5?*uJ|3}rEM>TnN zU!V#C%4op|2m*CNBZ7(*&U;2N13$0={&Ck2`$v0;e>+1i z%wte@52goQWB$(kiJi+Ga5jv1(QrIt*DBjQ&LLh1|0n1B!T-&_SGSfmbb@es8P9E{ zCy1%!zqWfAQs35Bh`tH%HBDP&nzst%f6*?;MybBh;r=C>dAmHijd@Y&x)#4~02BWT z?prUhjj!pDFY;qMv?};a7Y@fF(m#Xkmf_t@svI59BOmR+PYa^rcNzq(r1I%)X)C$O zx)d|tmOPX44gM=!+S8Vg&w) z+vL8Z`3h%{-!*1EHM{TQNTeu6Eem(_^ng}>F@+6wtHF)Lp(73wmU3+LYG+y}E%l)D z{Vd!8aZwVHUYGPSLlK(z@Of{;EZ^@g5AD)O8Zk{`PpIy7Nj^TgJM)Ex-NdM{>8`Dn z_<8S?L9jeCXFopEF0GDNcSk2(RG43=emw~bU2r7)WmO{=wZ=a;txXe7ISJ2%7bT_Y z`TGYitdrU#O~xj1$x%HfHFc{$lI{Ay%k6{RL{VaDr2J#$i`#wUp2u8v>)+gF-zmAR zmIf&*idB0@Hcja(W>csOCfuYN@9Is3?|xBU5x#fg$Byn;^6Mqt3zJ@;x~LWi<(cY? zM~ky*4Kdbgv*M|O;`%#@jZenpi`j|bNUXq~^7Uz@EK(U>l=$N0ThHcbT7QA9_2Bc~ z_rA;g5AIHp{V?=sH*c0@o$#X@E7>UVWh3q6=yAhRkt)+cCMX_TRy%No(O8zeRB=6& z?;pUlEy+`VP#MW8S^Zx8_@My0;o$|Ys_xdf$)M9NjPZXQ`qu_OOW{P9l`_NG#R>sq z=(JGcLsR_ys5?GN?aCNCe`oB8y2HZUwMRpHCFw{e+!H14UCgnkM@~e4D-{eYP=!8? zRJW=%HD~{waxm_*nK}}odTdm5q)XU_%jerLwdrNO=7?~7k-F1u>Qt}%f8{PaA(~o` z=0i0Hmz%})DvrB6BW2Q|wk}gWEmS+XDR#Lv9`U248Akkh%V=cmmr>QSBEf`nBja56 zPfrhwoRF1d(>jInUq=TXwiay@|JE>N${6}Oaw@S_)+s!<&)%^+VENO2P3w>DswuxI z9al+;k@V$}>=>`IBk=?1bo_)<`{N#2FuIPXI-3ohN85}M;zUiL)?(X1s^Ir%?_cxx zo01BFUbwP_@2%R_vYQziyb34817_z|`^(hJJT%qmaIpaJ#Y7wn#*E9|ao>0Af_GOT zzYR6^?sMq={iA;a`#;KC^*zQgK@`V_N%#6cUjX(a8w4^H-@2SXu&!n+`q|x}u~AnB zSsBgtKi-t}h~1A1Wz`)HP7qlNK9#JcLndBMhO?2`^zJz%;-dlw4~jaTdvU{-OHDh_ z$5+y$7Z4rr(jXH` z;oQqRcViY2CgXs@bo7&Rg=N#@o5ad$107|6Q~^RI+(>PWUX2rvZgt91XL+MpJI-~t6dZb zX834ri~cO8F}i!0DL}FIrDB@ptCI^0E#N2fIdv`l6pHa~GkRRkqi8!+CC=IVZQy6Z z>5qvT0xHfb+gx2w9PO^^zdr0hJAi?Z?JSV4&O2K{N8d$mq4Lg9=ksDZ6bUOJeB9#; zu=~o=1;}o5-o5#e@;*)btuQw!rfJnE5wi4^yD!uA&x7@omhoh+ZSF2aRPNXk3iUMAhQ1k1 zk|-+Np82*^1A!q1s7$0$x_%K@4c6yqM<7VP=213uop=p3zbd__|28!<7(go%4-((x zj;9OQlvLY1UBx$4ls1{JL6Au$@aH{S(vAcKxO}(K2V!h8^Qej%=c!%FJq0Xp-qtIicCN)EegnUv?<$OtN9dZmf}VS20DnB`j?a6{ul zk_(R14?iUB4F44+W-b7H&-v8%+fT_hzwAiBp`kCqgBG910Y7D(m_Mo<86Cc9TRbcM z5?n!I&HK|#i-rrzi~3oU<$WEJ9nI)zQ}F5LHBN~pSued5@6@scnrdiMKAe&x?C&MF z${JeTTAmAEcVY&p)ylK@RAasc-FK$jq>r#Yf%Wlp&B)2hVVhsiv&)P4lCN=`M#$$W z26ZnznO8aD-sRdFn>d^hr))2ew%Q^-+UetPw~3E^Vhy`X@w3zFZsXniQ$`yHi%CAvOH*juDPB28hyRxOfjDBnD)O~S36uFuEW&Z+nK!Le3s@T%2t~ZJv zeHG4gJ}qiCm47u|{N4zE(8I$|S$`Q!hFuy4>UUGtLkU7Pir?Ec-Z&?QT|e55#!b43 zzGlc3!JhNd!D818<3l|?db+P`Y)m-55)~CRdZQ_cpM(LKL;TxzTb^?dOX}e|dAqmmPR$z&fn-Oz zw_dg6nw!c**%CRm-jAl3xBl`-pL*82)2b(G#q;>aHzRATx)+e6b!BJ@D5rfQTXo}P zoTxo~M#Y7vIur3voRU^WCQd!NJoFf5ocWxMg?J>am5tdF2jN&k-1tpf5Wj6kgz`m^ zQ>jj4A1akz=LTAi#}?=XbVq)n zZ|m+Ect!tjIi)eJr&*8pO%%nwIrQq`%-n8FkaPA3en1!LT%kM;AdNhX&iv&7Z@(R= zXY1VCoW?B?@@Lb% z{&dckW_)bS{AV~FXz%Bi!#J17ey0yH4iK(eFY9y{Qzx?7h34qR&0o#VJ40BZE)`WJ z%nkd(BKW@t|H7-g)zmz23}!4iy&g4ne(^mnkv}oA>Jf|PcD4(mEOoN(>04%Uw%9Gf zyyS!Tq`g<86jo=x6kV_}y#dJ5qs(!zUKf$F3$ueQY2w|hN;KG>9;+Io_HAw69GZi~ z6lQ@r=vHiwo~hMut4kWvIow0BDFgq2BnjlNp;L0zBXmIs#!jQnC_xqeGb_l~gkil}+Jd?+6Zl!4HYRlg{eq3J2`hr|e~L+UH4AG01%7q^ zXfH0OAWBa_xpV!K*b2B$y4=@a8C2ali&_p`RUja4Xn|`Mmy5n6|3WN3e%dpTN|?Vy zhf|lF0}(c$|G_W8u!5ml*!2TPF`xa$Jef;hf@`tBWhZHBe!{Aug_LnmG(c?n(aT@p zBNSk(8@mEi=g+}Am20No85g+Ydiq7bYs}YsT<^CXhrberIpf$b4z9t2T%PamqQwiQP?q0G-?i`@^QWgsmK9$D#CjfgDXHvfTgwc8^^90m91({AY&C=D zk15jDcG?@>#Q?&c?x@e0<>Xr8)ke@F(KT=+hbtb8s*)nC63!J^d=Ib)?Z$lTsWxkw zSS=YHD`Tl6V{n#N@hrWZ8&j0{S+~R|6N%P-w5fG*XmgSa24rmp<>z&3#v5XwHc-0P z%72Lzzi7x?wO~E(vSEKXYv4)zsGl%9yjP-qikn+aQ^+OnMpg5z%zqvF2R9TdvTBL6 zbrlXz=`Q6zEY;UViLcGa8-5A3wgix=)jRcTq-ZDWl~v;^#U;*#UG-aVuDZ#8XQ)@z zO7w)uwpQ`84Df9FM!fYnjNK?I#d?)UeD)XLw-v__m=E7ddy1B9V4z`NN zZ)R`m8lCDLl{Pb!>#fWMi~p~liTmWhbML)zIUnk2)h+D0i(ziRP<$nLhTQ0=?-Qcvs=eR=&z#=v-jddf(S(>cH@ zetgaMdK7Bcrip-FX&&Q&>1pYH{=h#~m-Y3(AE0M?w+T;=`i=PrL7SBhZSuYLmd%b$ z>e(p2QT$%}X~@vySvA86tP4h)CZk_4-8D^z6vM6^T+G<=pByH2+8PnVGeV~~MJ;iY zFLrB*RQ)q5`TJ2<)I7>tO;?pNCb83rr5UN}7B&Q5-J1UYEotK!t@s3z3_r=<$Zs|K zWEl1}oP*!Z6sjk!`>WOOC!*uWqwTp~tABO<(CsDXI7|kr>iZOh=Q3M%I1p0XigJbu zC9O~W_hg*1BAhqF9R0QN=*N~yaaJX3LHtSd$7FkfLgTxAOS6uf(oX$)Q(x=-#o1^Q z8`yq{sdw&*$K*e;l%c`1(d!|Q`tOcWmZULpVq$8pQ#S1Zh!?B7)lHd+55k2xv8Nwx z%n_$H)wj#P!8rHj^lt9pdccU@_;RL?b~<&0M>pfyVNe1D`qTDb&+T7a&N*ukm=kOs zB&e&>uL{1jA*8HH@6H##YnK1XL^29W1pN>Hy@y2JV2+5pe9#P*W&jxD7i_VgeatQz z?E=r=oHUCA4X<9#q&hsu4n`|~f8)YDEo%DNbw9f|8{7oug3;+aZ{*lqz)FtTj9&~o z#%ES+#wAA80lbt8A|GHvBF@4+%5z@W^eXj|WxX-TdE_$XM&|)-A}&ol%odm~$~e0q zrz|n`74WL?a%7qd-p%WVyO%Ep)}=w(c+oSQ|98a$nfd2Yb4|C2eVY+M|45f&I&{=O zI`B{kOwdR_j!A;ei?nm`UG7d6AhAn;bxl}?XSrr#ClX?u0LBlVi(R#zA@M+2n4ycP)HLi3k)#4_ zRY%$eIuAb0+;U3ypY_R@Gk_Vw(1`zg01|h?qnV!+(nlH7Jx1b8Bb+ z^I@Fz#^L0XuYcG0r0VE_%&!|uw;cELdAsQGKl9fZFH)>6xYzw;^8Jb4;>@p@ers*2 zhTjezf`zUlG3gB~(V@Iqn*vz~fWB44?=)a$iMv+QH9%n34ySQoWB(tmHZU67Udo2x zF9RM91V)qWWRQ<}$3W?n{O*)l$S1*(Wu=Fmd2JrzcnEW>!Q_ZNTmudZhKsZuOj>iG z3()of{c8GF<-!;kI*9I{yP>&+cH|l+HNukBU2hyV6wrJRrU1H&0aydCgD%e^JDdn-H<~ueYbR-=9sH30+U*GqOtrP#a9|4I9h>jd;5jc*JH-lykw<6QHy5g29gR zf-F+kvnU9ZHM^3vZ6g=2!dd`q)KZxaN;L{IS}A<8l};vf_*(2rit52Yn#$_m*Il(c~zyx;88(iK=0ScG~f<-mK~l+ z(aXEd*Utu3==rKhCt4*Ks;PN}8D!I*X+ZfrSYMyXKemLR&P3Y8(P6iEh-D6}!8>wk zv1)efqw;&*(aWk})d0Y}SJ*yf5h>xS|H_s;X1xskBlH4zN6d@?EBQ)ww(vpt!GtTe z4mGo4{G$U1sBxFoV(O~iTRU7`n-!U;o^%=6w)wEUbd#Wf?U5wqsy-1)Cfr&Q4xWa~ z%{R5})kUu2)}$eKn)wAC%ILPVtil}5EM$6I@`~(kWhfvJiI-g(T`$d0Ncqi*akXr8_wjjY<=FusRDW1~r zo9tozU{tF<-NrP_2G@@k81QL8ZEDT!1o<0y2~Pt3iO#3ykmx{2duF^ zcpAKR6CZF878V{JEtYEbO_<7^gdcZ%h74Z33c7D2c(aKz$KpYLLWhTVtnzez(&g>&20S> zHPV(hHIsQ!RBSlx4E_+A%lp1|X)x_A9KIt!(v+T90 zT^sjP^Eawqv!uB-su!Eaj`F@wpLFW$@2RY*W66)WrP`S|KZO1b&uxS!=%>vdO9iMm zbaGeV&ZaAU;dOW!$SL`!89Fx~*?Bl{b+4^sE$Bfurj#p49rDwdp@=u&gwVR&GVK(JWDoBr~;hDT^xK}rl(jp)TYmviOp z932QlxSZj3w%nUKZzfbnQBm#0AQW=BuyltY5ZzJrI#;c6B=8s!iaFBtQv*u22IgFC z@J>tbfQ7=HOr7cD+$cX2ilQ*`y(fg$EKM=+)W3KK2NRd$kfC$9ZnKsij=^VZV_Mnb zz)la6i-OO5xhYh%3gYb2K$sGfSV0tM{^eCvQ_Z}0vjCEbe=Wfu*ag(DiLyt)WFW{> z5Y7sY550JX^9{duOj3||N%I?9IXW!v%c zPbYJsG{iNt!7D8-5kb6%&Yv8WIHopInen}3N2qz7zQl>DTdlW!u?aLY(8KBHiB_T}}%oJ>OsuAc6`7B;CNYeAF&#}w3`%flHQ?_qp5@V(wr#+Ux?q=z9Y zjiU)gc~uFvSACV>a0W(WPUL11#U_pf3|3ewLJe}SD%HYNGy6Z7wN&%~uS{5A{LvwP z?z2OPpou*`gv7ll0?tD3K2nONez@I+Vl}PcyO3!R-l^|InhlUq#vbIOor23NDhmG1 zpLewm*YoLtbA?Mizsro$A1>?ydJOA+D)I=3YJ^Q%C7ZDHy9_7|hchPh#nr7wR(9M6OTq3f6XjsG z93#B7_^KR#yxq8}D^d22QRIE2lfwZCpE>$D+!LQ%mGMNSvW*pHVq*sIN@OTx!L{0$G;q}CXv<9!7|z+^hOigJ#&C*Nb96NAAiQ9yGW?__I4f!K$YYwr-B4k+IW(nF z-Z0D<&Q81^G=`J?u4OWf$EWv8GSyQKV=?L;ulOeky?O@dSO7}k7V&>oGdxy2xvp>Q zKwpcFn`GvBw$3WnO^yg zhDM`ie07|Sk;q5&Of8+0^m;MtESC`vcZR%8qwxdD!trZvZJ*AbE-PR;XLc+tS!6`* z=C=_YajK4bvXYf5lnxZXD2o+##Cf5J-45@Hdyj+nrnO>jtmYq<9pv6A1>-&76DXzQ zY)0++uL&h) z!AZNmsd8bKQ6fOVwQEy5v+PUFJLlZA>$)&mUHKjHiY8HiX-KJL5PIM(1^(l9bhKs_|iYKexx+;~qtPVYg+A|#wC2zAF zB)_x9zmltjk^|kdW(j3C)GJw&!>awLO$UbRXG}!a*1sucWkIDeF?NzM>E%3|Vr$>B zpHB6+w^rw=)3Q}}S#_BXckk^8HoSg!_$;e`GG2VZ&pc^V*RvPWfQQ<}^80xA(2siTXYLsG1S1`)0rKI=!8;^-kP%h^_iSZ1NcmiUWd$k zF?i~bg?;OPGnF&EX}M!8+NQdZ)LS6j5mh`T8$N(U?SV6Xt9X%-=t@P+&ghIv`kD?w zr!Mt!-J0Lf%lAN^AnM%BqrDDBY3sovQffxz6A)76pv9+d2dD4pByNBWM5WaZStf{x z5Q>;t*>&CE>oa%s!kGi7(BW=!Sfdsi6G1l~J3gL>U)Ubd8OQ`r}@m?qw+W zbSbT5hl*JQSEwS69*tXhjE2@kThKiUd4xX=j`};uu5K6%$Z0hn8Lco_fZu(y8r1QT zwVL>2q8mJCk=Kcm31=9`#?TBX2=OC1-QZ-P@bs^#gD(rThPjXs()?)CWd&ps?`9Yq zmc>ZT=AAOVFuWUm%LmnUQ5-W$Aanyoea>(^4jyXQbrB813SM0A>{TfDK7W_GHxm^f z`M%jur;x()bd%tv|G-y~5md_D4Pfzurpg^!g-;fWl_6%M09lP^cN|1}OT$K<9yk$z5+RhpAZx~2Go@EJ48#~XWof>wDrYmY@#D+enM^lpPDOp>&#ueCQY=3kSCJvfWYJeUK9)fXCbPD0@)KPl^xr{*KCNnB0zC> zzm@*zQ7HIY;#Nc1RF-OxX9kc&H;??aHmv`QM?be}dfslj0@))<)ja47!oSZM3#LaY z?h^&$TFTob%9IOJVsC!xFx|D08?6KjO0zRd}op}QWXSUcI?gW=!#sI z{%58|(xG;fn%qK@gOhK=<+W}TJvHjnj8+NQE@>UZ2NT%p@k*uJ0Dmy<vlaQOb zp6)CDx$=<;#SWhl$k8O7=Z zVcW`4g*z;4t0!tc2)d;2`aX`1jZS4midJhE%rG6yoS$cj1Ja#d2i|jFiLs6FYhvNz z#Tq!0sI*q^!hp8vw@&f1sZD;xmWlmu`dan;iU<-x&8E)BTHdbcF3R4(6r(GFak^mm zafWw$)~z}}<&YPoDz43)l{JNvT6qt`Yb4`y7*mfKNHBH|rWW1N!?V`&$Tm?mRy>Ra znXrH4m5KL!=Sy8lA08!k6)R5F4p<0_Y&A9hz@VM)e`x6dUG<_X@eD)VWD9l&*Z;U* zx;)cO$*!5mE1!+i|I^L0_wJ~643TavpHC0| zaK>bdqD%d+pQKRu{`kSTR}@H@yUmBo5r&?OmqwTpf} zeT)WGpsAw8sK(kL&#A9wn5%x+8vo%1lO`CvRh_8%y-WID{lI!SK{)9b;}mT^h#ib0 z&B013Q%?jb6b!iz?zkZ0vh`gqhE5~ducnOT16T-hhQW}C|M1p8^^4nwlZlTL`m!*D z=XuQ(N-O-v7)kQ!D!;7VwAq3or}Zff7+tYRt#_Da+U+}WJu9vbjQ6{#zjA9IX0UPv zCV2<=LRPMu@^z=OjiKDK%*?&9;p$fRvZ1h{Fh7WZJ=#$=kc~GT)3O~Eiacv*m??mP zc97ako_l~C9Yvc{+=k3EX@ zNNT6pE-ZZ}skoTFyxVQKvncEB!*SrhweLcF0hDmGjYm@NW)C{=Ih=NFsntFGcZk7- zyVqqHkU)Ic!p^hg^$W0OoSGz>3{|C9t>@EBd{f=!ohB{Au_Om z3=mL|)1!606q;*4h~qOfE1c)#9TDt^!1bVJW7}&+o&UZ0+ij5Vw;9j1)C}j*{yOCJ zk9czgWT)S|Jk2@@zDJmI21gSj{PUU=Cw+|K5FM^g(X}w$?<2X45H)d-A|JURWo#P^STK9uN?6nn&kYM-U;2+*uH|zI*!aIU zp2Y`-+h|};H%h|^dQB)8M5QnTZe3X2iCmFT0dD&EqGV8T=huFC(Xx|vL3i-SQjus4 ztr84STz3#7@U^4ofZs4d6r1B#qmw$C5+*R?mvqzDUF`mzPn3zgpOKPAn7Etiq$;k5 zAA%3`JhQaV5kMZBTHfWR5hiq%x`XxbnG-`f&vW)XWojNl>Zc7g%#iv;1g77OM1i?S z5Z#!Z0xK8jHF-Rb+T}ZrEvXL?ty~uvZSy;#&zTPgpu-0|!5(;*AA1;UL+NrvlM#2f z+X!1j{X*i@`Uua6^>k2Z=~lo{9dB7=(_ySP7#L9hT?ZH)cr;M1+d{=HS(!v=!Z6PE z?cW^oGI*Ua*iEtV*Z&d(TVmUJ1~<{PF#;(oq@m0hE_l#j65c6JuA*x$b| z!dU0UIp+d%fAB%+)DQ^h6Oj*8w$+Mvl{9$qON>M*n`wAOXpW#sgv-I=(W84J7DNQ& zBv`Ff5i#EMJa&e&g?K69iLhBZY>%LaX$Qdzoq?ssMgSA2^Qto)Ys&mH9QFzd`0$-) zV(#>OcHj>(MW>nI{gK-NYmrlW`c4LXWy(5UQwCJ|Lo3Zts)>oP7Y^cROM)#>vh}G} z`sbDZ+Pb#)$t8WFG*d>Zz&*5jIIY?i?l7k*!Vg~wTXNyA#f%~&LR4%WO9oz~gQX3_ zSdxReMNyn24vLrNO{{jL!EZe?A)}i}7Mu-PE64yu1_Jz#&Ghsc&s7QVJ6}}D^HKyR`ySvc3_QXD=pf%^x$>gML{?aa(`aE z4Jso2{r$JPr8(-4LUE8v>NX(8aJZ=It>T;$gLTDPRbnLds(oP;Gh6#?G>5L#?l-%C+$z}o|QOm>e|w(mi~t`o)VmZF+$hW?eM>Mw4;}%?V*S8>3_EmyNw-B zlIyrNO{(Ni7ImSw;U=5NGm7PVT@|nV#za1&qR;Iqr(`V_j2TB`D^~M(e7iMpcL3kn zuh^AXFb#!qpDwCWh4w$s^w=D_lDtu*1juZ--u_@ zxR+~FHRIbT8Gp6w1%EJ5im%5^ z|yyI1w@k6w1W& zX>$E0h4M}DV1oK>?AR)66%w(A>-$$-(kDrx@;KSJ$LI7va-DkPu0$$YDupNeb+@C}QN6$MXnDHDDqx$byQhKh9Vp~9zZ)Tv(_U2mIW^5Q1{Z1S`vjkWb`dZYm^v`*(zc_VqgxtMAOa*7DGVNe zF&&m#31(nc9*z~ntd4+u4bCO@v4%#6V^_dr?C1;wh_gP&+KM0TY)4jk#uOd6avd1o zEKV}DH5`g>x&N#^^u=Z|vyT}S<>C_Hl3#d6cay*KUSg5iiJ9pNb8newGm1DV$S_^0 zl5RJm=I2rjpBk0d@_6hq~kRF&?owf{lEk5Eh4M zskjf&Z@3h72RsxICp#?Ac=|V)x6=%>={8j87#EVj*mIn`JMCA9x#-#kfgT*gR-=8` zk{}FOjhg{?TkJDFDFfKfVVD>tqQr(4jOI3` zST{gJ5E{D!feAOI+n2_BVMhc$Y%K`S4lOnc4Q=?U&BcrA5Kp>u^tM0|+yoC0YaouN z%`$}3hT&ea-w>=nGI2ep;85xV4>XzeZOw>e%G~17fHsVG!j`(~-lx3|z9&i#+ZZte z=3MA1fWd4E8AEMxi;pgkxP%qKs$L)TtLI@z+BT^Na@CwH&T$NU)3Avm=nl=ys^U+{ z%Ubd3-cYefpVB(5eKFu)rPpBzjW@Q&5fAuuZn1`E#cY2?&A=_$AE6q-`vUf!?fi{A zp|J!^`pInQV)wL_MbZtdtg<`AcJ__K>*&tWYkG5PfbW-W^)T#h7Vo7vtz5SRMx0Z| z@Jq8E7L@ztko8^ea51ZB^kYn4yC2NdBwrOPPM#kwLRZvTJoTCCrBjk-pR%=fX8c@9 z1w*B;e$SemqD`c5B_oEu7%h|fT~rMWc|_9N$SI>l8P~NrrfbvLn6tyOe{U3vpVz*> zmN>MS(by9eBl%$?_gX?!Nv!vcZcsg9UPuiHN;BGtdlsj*~d&NgI{ap zV8UD)kMKMy88x;g;a5CxNP7KGLEzzQ-tTq@Ma+h<>y^x=uZ zk@fnyLR0-=)T5W7)iDQ7HEu1oZd1pLYURc&`8dpSLwWo?_+lP3i0m%&EiHL9*9OEv zNm*`+ReeofwI6N>c6plR7aCyfn6svaqI@h=P1UGcm=nqv{!RGK6>pUL)lN7_yBD?% zuljV6k%sGs#l`)PisK6gM_lZwm9?_HwW_b&8tx>GTjYc{u@}WZFAZSsJ#2nz;2Zfv zKPBAkSW>+jiE+t2SF!S&buXW@{JL#A^YI=0uzgK0)z02s08$0PL(-HpQrh3TA zuGUO%jyv12Ot)hvs;6+Ok%ic*SFE~6ri`s(y|i}AK++?GwLq`i{a5D`SwBNUx6Ry!IIktD8zkk|&GU2{HfU|%@ z7@*KV{z8zHIIM&E>@5IvdlMIS=ynNIh&2Q3VPtlwI)x%*7_HpUkr zLcZmG6MNt=?MSltVqyS@PPYb1nfB|}&a~hMi`Mdf?!>B%SrCVDWdcpG8-4)4E&hvU zGE@GDmnL&)PThQ45ZHb6DUC4oq}NH{+=2QcJD&v=8zN@6qCfu)%gMH=BCIKM3qH;7 zghRCL97jzAZ9l_M+t5Jx-re~zxtJaXdD zbhbBrbGO|nY|C)!o*Md&D*rDm5O1w5e3H3TDukPS(pIf34{X`t2DNEJKRa4j?}n|Z_R?sCMQ#O zRdf#7Zw4|Sf`D?0`E-%{OHW<+ayX+FtoohI3OJvP}v!kofiP{*!^M&BLQZkd-N4{&n zw>p}*uT3Af;I;}-n?^>?6M8J7$zlQyk;=VUd;*gx5gcG;4iMKQ8}6wtmQ-Ttm2F87 z`H?PEeBxH>iRuo&yI}ztVP|7Vyo~R8{w4hH8podpT6U(Cl6WNX(f=%fd@G(BP;m2k zQ7Em^SU1v(c9&>0-Y=rZwQ0uZ18$V<-yMyq?$#MjbS^A}2ynR+n^J5XLJ6y7mvlQO zRvaSa*2DPk1shEi{(-1=KJiSN!3+qfDBF6q!5kh4+7&>2YuvSl$Z8lfSnL`+>wKQw zA(|OF3+#Qno0vKEDMt>utT;ZjC&Dx1j$l^X@aMrBwloW_iQuY%UU2JXR4H~G3#!oW zHuek(hqx5oi^}NQFDSSw5;fuN;SVAK4oJ~AYT!^lumJR#Mw$Ie$Hw_iuzTC7i9U3x zV=q-^X z?PG@Z;HyXF$@D*EEnhi|on}cB zyHux%7~Wai$v*4zMBiY75vORJeUO&ZiIUav|1Vj$>S4Xosz_seq!iUi=9vZB^(GGP zR&_8wjwMQ(hcD>(RISnHYNVYD-_3)mmXiTDH&>@|8S9;nYFV)=uS=rTIk>H?bZnKU zysLK9K{}phs~;V`RdaqurasD4U2v8`i#c zr!x&rofZ@z3d-`?0UPQ;mN-<^NG911)^Ojp-d{u)ZI~J?NYhgp$~*>OO4qg>QCmUj zx*fM}bF&88P~TufLo^vaE3q{EO4%N%2&?_@rk1mDOUNDo6jr;NB(Do2rLe7@xZN|* zQ-6gC>JT?cvb1(0p*AxINI;xTRZ0WMJ|>AD9UUB7O<)3a_v2cI`giMr{caz#+8jj- zpO=qndN&LR23_X!B*`#ZUvA>myO8&Jlrww*{qf|5ciwNYh^&3U zow5+J-6q1->sp%*nPHTptU9eh-&wyT*)HYZeUp1#-}@B5NGrF#E;?*GF)>l2XnCV7XDPbIHVWUy_P1m~TZKfH zwQa`n{?TUKlNJ22^F89b7}a)Te7jhKay0?_C1@D1*ux*AS>}XSygiNkX_eJ40Mh`I z60_gs!UA0ig`<0^&k#NBPGD7lyyjD)u>r2&z*2pt7c@C>K1BsFJxt(VdeU!?C2kGVeutCFHt#bTs0d|JJ3V0AdrubkYg$gs*c?C`yEf`0f|} z1Naa=SblJ(ZLx^LOsfgZ24F>(==vCrZdP0RVQYo@J#2FbTtinsIFMeF`bpm1Y+{=&J)d*e4P}Dt06_-Xz!kv4lNvU{`;-3-8ExTl zAi2;PLF&T#)luYphRG1cNP7<{i1(syeSTHbLLUJJ#*`%#eT+EF*jTSs6fJ7U{dg2F ze`!cEP|yim)G<3#xWyo&m{VDMQ|dzP48$gMGGLmmSZf9&YSb=dIhpXjvB!RF0m8s1 zLodM1`*18+8U}e2F!w@oUa5$=jCyLVBd_}eJ%fyUg~io7LxZsxw>tOEjV@W(erC zAIu}x+f%F>!G0iUW@bl%IhHBy4+iakjY2*nZ z`4$wg4ApMvdr-pgy|2{o^bj+baT|%lD4qiJE^w|x$)0{7={1$wAWw3GQT9pO0N>hl zZxe1tEb18$QKukcP_}1QSb7XMGr42qC5~s<8Aq%8+wHg5wKX<+;=9y{ z1@(o+~$}wr&#O;BP^~bnti-^Jz@CTFXEQKzUUbA|WD z9BO9kQ`j}qk1G>LClXB=GGhKIZ39Voxsy4XXHH>G=OVrB+v=)pmA_ld3ll#Exi*ej z$9>|dzoGANSAuG6bkfyTK0fE0(u;aJk^2odZ`L*o;r$s`h51-No4Sr*k^c>3Q`YKp zTvz$08@N6#r#nGXEnPG>awYNZ4UHvRoyw_?m19>}ANX0NC0?~~6e zR*sj)OUsOyeOuj|Px;|l2MwZ%PTLnBmCEsK?%s5^qo>aPPf5p(;(_O&S4uv!R%mw5 zS^V^H&DVG%{|*JYP3odHySDV?4x_>QhtHaVsV7%$U;73wau*2dHqR*OrEqe;QdG{$ zvhBKCcP)sau!r9#q$Jf2J{M+He(dP$sxqU$+@dwd^9s*dM{A`L zQCNQRcH!hi{6~=wa5e4tH>#as$$3ky0QrGDp?@&p9i{fYU*e@mWK(RhNAtFKrtrhF zAcaaOb*IIvw8BQ5V*_A{2Dd)RfKk$S8?b`D91ilQ1^mZv)W}|c6{qi4q@F=Vz2iAc zUx&MP1}S^{8jIE0YJFp!t+q(tjf0Ye-7yj;pGk-NeoXS_*1<2}~wtk%NT7_#Asl5Dy}^^)hH! zUL>xeW{>Qr|5$QZ{55v^CrSgag1HTx6(ki?@z?mKc_w*Fi#}r#hUmivB=6l%_fGW& zx7;q^Pz?r7gcyO45Rev~dsWs9ZbngPw_S8VZ!=8S@N39^O#mWZYjj9A9bn!{o@E>R zP|Bfcawjd=(r;^tByiO<$Mpc`Hm$NIspUD{-khs3O?DFQ25MFYr96sV{BLly zYaSqWEP)T(jI~XWlra)Wq9Z)JQAJ4M-VwZv43Yr*tmxeaBm)-^vJPB6_nk6bNIw^g z#T{lE4Q+NX-8<|$_M||Bttx)5s_u3nKe~kXbF^TLczn`>eML+=BW?Pg?R&0?+PiO7 zFQ+Hdro}WSwDgk|acg1uUCMkU(!UWra*1Rg?IlqjG8>HQZ3(+^D?e8wX<7hRZm29M`zrj=zNN_E^~Y7!N%%U zfF|Nllrmv93ZR1ggT#z{#C)tZSO8vNerFYr_GMYdz^!0vh=2UiZhH5*Y0C5svr%4% zN2m+#-2Sz_0r=|ESE6#^cHW5yI6|gwzkO7ZH4DDv@ZCk65nv6hCydhje$vfj0cpls z?-yP_-sW-sJ$>KqzCK6C-_|;wnBdtp3YBSo(wo*(`)TU&70VqpSH(6>Bz47(iFA;1 zWMQkm&rm157>Pe$Z41zMUgcfcTGk6c^@>{2$|NIoGfTnv1fG-eR+Qim_Y+j2Shb5P z%i(lJs~xFTIk^u~cfMkE=v< zcDornCVnjIiNdFEsz*8EFlqeqXxQvy8r+SdMLLw#^kXD~qrYAf;ge?7#1>A$SHw-B zV0HLdD~$<3>@8_FD&?|1_ba&3H6i?>YxCOJjm~}F=4LDFD__JWJ>#M!R@8*%eDQ@m z1umd|Q?hb$^8Z|Adt!pdiiMoRZy@-T=`w8eBbH&`0)Qv+%_y^q;sl6XEWg8+&?8YButm=jM&6R-JcG2SJaZG;z$<=!sco zueXV_o-hW}h7DDZMv)z19`Ff||4oDbP-&|B7ESf@uBjuc2YzY?+G(jfR5yAz6BVPX z1GIQ%6^fJ{c2feLzJD}Jy^JNfA>^>$tgN*Z*ipWf{G8lXqg;SU3RZ5lscW*;3F)z} z+&jJBX7(glfts|$uZUJZcwXxi_u__%xHnl(oRdcgkYz~bJ(e%Dt6NG}(v>CL{Eiyw28!B8*rf2(N$`|&aoBc1cz`UD3EfBg* zd_^z@%F+0S#8ttFcOC7kOUR4K=`0(XLd1A+K}ihEbTN?lMZD<85e{G5gW7Y})jZKP z`MG8gS!R2opdx+y=x(geFh>@ZVWM>P69;}`gt90sK$?!Bp}noGsT2L5Pwiz%ROEe)Rlrft>LgC|f)pcwEM z{Jh$Lx&W&~K;PSeXcgIJ&krycg$>mr4-m9bCrZcjp}iQ?2=6BwDiFRtNEw4m4AWtw zT-S0NVrJfImrJ+#=7P&-Iu66kC`6I?3urHw!KX9=S z6w0RuXh)%z5Mzi&y&~<+CAdsCv@{Q%*WClY%{2KDU*CVpO~G(i2i2te1W{!~n-2v_ z4c*gyS~LM~|JMwx;!c9$38CC9lsKTEvF%HbK=VkZ($A>N0#IT%>(1vnpX(7n9FY7I zZxn-uc6&Hlrek0Q1TPUSvW=E($FD<)ULfF;HVS1IzF3TqqiHLEm(n+IJJNyJ4?EChP?>?Wp7)z26pd2pXg0#@IoImOz`9;=Kr zslGZoIx+lh*y*rabFWe#e{ufXqjS7FfBlWWWpBfx$3?1>Qze@=9iXq@`|o%2Lg#GL z_~OrojMQ&u?bZFPeMxTo$eXc|;J%F$Lj{M7ua;MGgQ>kg9lmtOWCE_|gYQTTlE!?r zrcRdb=nv-^X?(#;4&5`3R9j{w=$=+mFTk+o0-O0Wtt6b8jDV)6eEAWIS$qY0QuqU zd*>(qasPsxciX0AA*hg(@B4;yl7_tEKct!Z2NWDWCwzaUuVrw!_)rQ<+G+iw+*L9L zYKq=+ItdXtn4|~=0O_H6TscL}W+dux_qi%ww<S+SawjR4s7pWPJQzW&ez$&$ROH z=nA%D4?!`*g@f72N_w*LTCvi`Z9-3diQA`e>E?efdEM$(AC%P09Yeh>`IsDZYy5OMVrI*|R8#KAdO&uP$u1>>Vn~k@j;oDz4HD)xH&5~)>NJK}l zX-jfuuJ^|9X=QC}+se}yCu$}SBzCgiKY3PdlBXVCY%Lx|X4LBJqJg+^l1&~}6k8*^ znJp2g#) zY#R+C7VLMkYa03{YlU66yM)PBG~Vivp<8J?nvJ=f&fHCcrVvR+kZZ>pS#6}sv$o$a z(Mn6FGDh$$E*D0s=9xQ5h-CY zOXCZF7esz9p)Tva3NFgTENYUqSdF{}Bs0 z1a0SYoX*kEK~a0X5f?WhIt*zQjKR@86JRI`8nv=*9!Fx$4MTPuG;O}$aUa7c^-5;z zRmoAmq5%v70&|xPpN4C|!R9=$jkWBeiI`8AHaL16-5W+4*3d0cb{vsYV@owai36^s zOF57E(8{GMryBu)GjJK%<$!6aKZCc97Yjs~Y6 zimgZ0n1f+ef)F<{j+gHy*%O3YF0KdTkBo}R@TB6QWrqNdeNhv~miIKX0Uv(D<>7^R zE+1hR)gulY0+)W8DnU6BjF>+i%6|#Db1{yPbU!da$Q9Ts7Oku-s%R?xE42d=r51S{ zzf9!mlG7lv99UwYbn*lb9clK!&h;p#X6e9$rVrZjt6Q(78hC~f**4;%5G>d6=)W}^ zxwoO7#5ZMShItLwh=@P7H(LhY48M1cz0dwX0C!q^PWg_r+wgh}BBUsDxh8Q#e+s(w zix*M9;(c=m+rPS~y>%HqDE3Yk^baFP!`iUu#P$^INL|YPr~*;oGA3ijuVMIrU86C%P7v$0J^o|Q7Onh&cNGX5 z1BoaS_G!nlMfSUa*=+Vb{rz~<0xHn3+P_0L8I2tHz)wk7GK!gO1zMN=z-)MN|1QT3 zxCbd&MOCu@iDkz~Y|16_WN6|(0%Ha|PV%*yQr45ekHAkFn-R;2kG?M;`Y>Q{1aw$Q zN0X-d#-`k4$TO0L8gA1%d~P(U?~Y8C*)_MS&Pdrmsd(2nIlIes!jjt)_wM&6aqkiv z#=3-c_4OkQhkHy8ek*lReTZdk%$}8EP&;up=~AEkm%bOzOb_;VmzfkL$_5jAf>a*8 zlVyx1%g$zlO{)(&{k;Qxe|PmcBh~*y)R(};od5spHXS03PL)iD(WzENx=2l-!$elw zMa8n6R<)&jqLMC^BVDuxi^Nh}x<|Ld?$U0z4wmgirK$Np-|hGJ_&;_Z%XZ9s=JR>K zU)TG2^qdWwUq5jpgL3S__N5Os^Xsd)^$(kUDvTo4m#;p5-Q?dj3(9kq{R{D?yg4<| zoIyQwMp=rDkd>}ZY3kfz1?>X_Gb#tci-tFaWmr-T{E6|^oQ-$@H!u!O^TQnITsPUKQOeO_w|f4Oz{> zeL*mKDD8|=KQ}cxm14LrF2fSXj;~pEb;31Y@6c$)mdz3N!TF{Mo%6g zs$l)?*Znpbr>E6S>sNE1dbGce8u73gcX4BGt2m@Oez&xxW)5eDO}rN(VM`^s>^F_V zUoJRQ;fFsTu1+#vEZ_$1c3cVWB2Ny#xU^ZxJgQwZEARf(XAymiTl$xN=x+`Th?QKd z*PX5_;90{e%No3fk@1!jrt`yhB439_ZZ4S3pPf8b?zDRKImhtQI^89YntJo4_mb1d zWlpzN8y5g1bY{V5W<1msX2GOJgDb)&+-%L7*^Gm85&g5X;a}!uy5ezk;aS?~BbMAN zbQW$R7!~gT|LVd)k3~V=i?L`O7{Nyh6wHq2%31Kel~5qv$+S9-FNnqjyNZDojzs5t z2(vk9fWu*Z1ivG>71gu?xf^VO^%ydI}d($QIuR@^0 zBuTMPj%u93Rc0TPibU9LTpLEC9Tvc{kPO4@+s6Uc4DU(?TJ0O@i6dp=lB)Sb zunlHKC=RItyT3C{ym@VmIR3#PPJ&t)3VW4Z90EYu$r<0022VhAJh;kAdkjx$%yvcT zV{Y4G*SLQFVsII8+Wp=%1kPrGVIiZUem8|&Ki>qsM*0*EfFw{qBJt80OKQb*2`-0_QFz&P*%7)9t40f)q zYy**xu!MD}zwFTy$>X3QCR1Ffl1c$HOY9(f$zZ!|*T&pUOi_{?f{lB?BFCNl6|9bT zfhI|W20;w>=Mz>@Z#_vs19NF;;kg0^ ziKaDKAs%@hN1t?mwuLnAP^h+OmYXynEf*C=@-ea2XI^sKGTvf6FHKHSehNHL@jcl9Nqb58L&vb0IoC%ivedjS48%LbcNr>B02e(vYzEA)0gOeKM5ThfL1^wJ#a7lM2G}_0rW^ORSda99dJlFCLEvBkO%ri%jIx)L z4T0VGrn6Nl!fmbtFvWq3;~=;XanA>QxpsWUjx)`3`1jB zF>k9o!p_?L^I%_DedAS>n%Hwp9n!dsU>X>$0`|Y^YBZwfi{py<8^&KY0$G_8aSyk4 zAJc7}?0Ac%kPdNgf_Jq~_`|_`JI=(bK$7tVoR+gP0e7MCH-a5+k0I0ak^n+OWhgr@ zNmRUMY9cyif|oHn!%fjG0#;8SQSO7$%=BBoH7oxs)#vjk#x9TLH-!r}>Y|QI(&%Do_%&i_ZA5+nxmsMR$wimAyQ|w7O5|f?sEPk(9cs@6j zx5!%=qStBGX3YX)akvQ`(vs*>eMHSlpgxVrLf!-BYb}36?{s2AVUd-!wS}cuQhM~K zwaNnp(Q_VCb0eWc{0d`zQxL_Reo`}Y*cj?;my1;EEYMevx5SV1ITi&4l%JeDIye#8 zDLI7%kA9H5CA3npHS4umT>=OHetJ3r&m%-8()9gF$l@3@k@nSQlIm|>G%H0?~^*yOeT>DO!6 zj?Al?NS`nxgXp7IJFpR<`b~HRqZ~U6JJdbAPIybgHo!gQw0` z&8Sr`p6PF_yZQ7q3WV9Hn6&EYp#1PJCi~(-D#!wuQO1=`ub)`(y%1|-r4`SvLR^F& z<%r}=migkts=1fjN&WX+zwm(FgKhE5v3}A=! zdJOzCji6Iu1T$yDs`aEh18X7AEiqoymAS6s7z*-$ii^#41gKDKwPqIPDr;ktS3pD% zKMFNb7bL-dL6y2(j!lo?YCM148EKZVv4Zq%kNL0~$lwW3pkTS2wk=G>=2ye+J!@Bz zgCW$qY&c{uvkOR3O}4M2e(U&0gp-zfG#7am@P)&NgmwHKHzgcerCO91;%JkP=_Y@9xDTY(+VSG9 zb7Gk8!@j5x9|Te+%~EZFa_dlHMI+y|#k%EO-$A8Oq{Z9bI7Uvsb~cg@>5NBaVik9{SjCkWChu+Jp$k$NJl0w_qF90D!z?>*p8S0^MuxG@2^Z$H<1$M62m5#K^g zGQrz7s-1>@D?siDkE>N?gS=FL~*HweaV_ChRFjdLfsjv+AM^-Cf zE>s+emRJpy`L&Cm&ub(;wc=%sI9!%M`Oq+!NeI6n@8OeG=CldM)BgJ#ss*qswz<(G z4Ke0LJH}2|vs^XKV8w}wwS3?o?kKhxiABlrdvU`nb$_(WI+V>u%N!9VlNc|05A_M- zLj>IPW>Mgry8)-lVSquB1x+O)1bSAeNrr#6Vo_nWKE1CTm>P1BZ@_?P*AD<9Xmn6hcat^x=VLBQKHq zw}=Fw&(5=k(Llp}-m`#d(i6Ieakt>;XJB_kQ)tb^Vc7imrAP27bLXRtAF#@i`dyZej`N%BnE8E!@8J%!4PqG+Z!u2c{mPVgM8x-)u3oxg0G?pRv`cm}g`#cHV>bXk@vuK+O7VhQFUkKpc zH;y^icA5JjdPafUmBtmwKQkzVuHrl?AT=U~-rk=)SiSUNZbtq()iGi^pw`JqqGb6+sojXT00#`G^V1I{GLUEOIqtEz28N9{2*(>XN+ z)ie!Bgs8X1VS^Q8Vca?WiO8|-^F5u5itbVGg>*y;q}pqxN=t(w>Vy!h-&~?vacKMy zsiYy~1W^abi(#+2LB@=p|1;E;^x2+}Uo3y(27Nwab6s4o)T0S#n;olm9ewj2jHa5O zYA=`0bc73YacCZq>JekTta9--f~i3Tg5-;7T2=P4+67#517!nFC_Shw$LSQBNn}#Q zS=Cv72zuqih1U?>1^EZBBtr$VRDdMkC-Oo$YX0*3_}5Wob^MX|_6=`|ZDn8@`b=$? zP%+HVaV!m;l4ZFJg3Vwf8_PjtW1H77v|+sA{R4q#otD(rzcEkp#KCBv9iZa13zPAz0pi=vKl(!u^=i!*q@;H_gv-tXI9%OPrkNS2mE_vY2jID&r< zvIySBA*GFu=KX)bndbmwSdqTtzF4;C`qSaPFVER=1QG8iJ$(VkNmh#-`8D-5@sfq+ zrrhB9P_1YR04zL4{ zTr3}JY)MjdOEfYVPj#c4-66vny($-$usFIjx8Xu)Bh3a^K=Q{Rt(+;yCTY&yg3~^U zZ`@s;h-L!?x=xY~E0JQ=+N7&E?gL|Dspglulqc%G;RRz0QGHLxOfy&4KM2Znkvb{9 zo4+XDQt+&?#DybX@ekfUKJhu=!?*wb^Zi5lwFw+csSPU?Y{iSd`Q4Q-WZfuD?38SW zSMXMDHyNC{hu@dhrQ&Mv2n4sUvVGP5vKF#GMx zGFMCMvlf)q~2r?#Fq<;L2~f0$U5xY?OkB9v_}qcfS~QF+ysWNlO|!*A&-;VL=rmfod%T?gms8yk2b8-O#ZmU9UUE+y3@k-K);Y7rajzrk~plv?QzM&D?pvdHB-K z4{f9KxtCWB0vyB(H8pOzwg2WN3kPGx;8Uk|byqDGJk37%^dFfG>47eew=ATbU-l*p zwFE?8P1~_V$*-I=9ebWPVifiEUv7P8O`NFa%HI>Dq#ip@&S@+e6hsf%=T&|_@X{*a zU4EX~k8%CcujBKKwS=2!A8%=SY4oytY}F|CQdU8~4?dMVb7{itv-H^WYe%wt^^AXu zOp2Zp3!S_=F_$Z@A>UfcKKbj(l5?w*??=96D9yhs2>kj{+tIS*BDr@T0xEJ}b6?)k zw2;??nsmZ7Wz!jc-eA#eLmlIL@!P^SHV5Bbw@1hMWk;U*8UBi-RhldLq{4>Hqt4%t z{t%(4m|w`cQNgXZcAx$0_2lCxJ@ypp>679IsiKrq^)%C&k3vhm%1_heHDuqW`)cgb z@hGp=U3|s65dB$!mlyy2Zwf$#PBsJHlUwuU$LDz__I8)Lu5R?N{48EGdr!pV;$6XS z-%-*`zZT5>ljRWn&nG!4hSlGnUaZmBJ#}^>T*l9#pirE}Zd9jibEHh>dT_VE60#uZ z3s;-w#i%#^t$u?0Wqa8C4`XX=<62+#vUjcCVCloC&&Rn~*w@Qr;r+_dmm0Eerh7B$ zOWI_@8m`?R+ZzzMo}XXHaJ5QI6}$c$e#Z5(n=cb+AJr^J;44oXG|r|OI=XclZs$mC zpwR85ZYQ_zE}_sFjujbpQsT5&(e13(OhIQ)fevT!%q~HyGmSs>fBQm>V&u%IcMsj~ zLS9XS5toc_WCmWx5*4P!O4HxayzWQrbm8M*w_Ih!k>9e)TwQVNa^V(Pt(UtlWt7w( z2)$lh_UNRGg&IX${6^&(TdSDcsuVguW99a;wfLgF6x06(KB(f&%mg(G-3T(2K@8V# z9dDIpXLk7Rba{YfpZxZv+x3?T*Gi?WLtiD(of!NSdy{wmT8@-VL5NQIGUDPgXpP>8 z$zC=W?Bhfe*3TcmolHCVqpPaXO1cU|FJ18a(pR)W+zvLkysP&-JyXS6>PlhRA4Ruq z`8oUI?bc>GHcM6P_CZYe!ptn>-$2=&IiQ)DE|`6>-NfV<$i(E(v^Kr>7tTz$ZB@de zX)$DN{|gZ)#J=>Aq4*;i1sOiS7@|iD;A9{dybFx@D|mOo{bVkdRF zzSvsI|DqxN+fzm^)?#}cW7R42CKqb2M1l`f-$+7@o`sJm`c8$?rFD7ldU172HA;%i zy;JwBeDEaOa@LdJ_$9OSe;b$SuTD9PH)q~^UrH;weQpC~`E^|$bf09?rGHbPph~N=kkWLz9J1w^Cs`lQWKTKZ^YhavtW!o8yx;rZPR6^o zy8FJ>Wd3%Q6JsZpX~DpUPNzMxWXU~~rENI=MZM_z^o|?1U9sEu)W>r2@XXY)jGYTJ z@zpL>iY`XlMYkRC=i_R!)D2}JGwH`PztfZJ1?5(7L@TAeaoVpE8 za!NOvC-I40Qpik~$`*a(=0Y2^P{CgGy6+e}s*$1WMDE?&Oh*?i^=qR68`n^et?PcD zaJ#tDOPYF*!7sf%we@AN%R{UHO~xC8lh%%i2zF8zviP<#VuX|5GBa05NFUx*>hzxC zf@^aA?drC4T9>6-hIYyAcmB%>uAHV-Lfa728idO)4mMywy3cA8W9943C6yVmRDM^> z6aHxCbAmGSkl)datoqkw|nrujarOdkW18adf&HN zGJH-TZTjwn8Rxx$-*L;4R!)lPksY?D~@VV=n;Ho3l$o3!v$xq9QLn}xJbKk zH9oVS_q2bokx$wvHzs($g!Jk-zU-&nC(pdU<1scUY5wf;VgCktVRHiA_%Ao#kohh5 zqy8`-l?bTHI@lAnovuccSVwWI3QN+Bnz}zX)5#OEd1w+eEv@bL6I=o-XH$DZXB9NB zcm=t|2rvDeTiq(66n-(chD%LQb)gmUlgtv{c!$?=2Vu9S_1`D`^+#{=Q#4Iyd&Icr z1q;#h^)fZK>+=Q%2GXxz-`sw^t?J*ql9QY7hkqlmT2?|ZbM-xXICpKq5Cm9~LZ0;Q zR`)cx?>5-e{fb*x+0URJ7Uhpue*IDU^;(4f%!HDSHtYKqxLDDtiyXEPmzs`BtO+;Rk7F;$DqCe}QGd9vWi#g)ayMjQ+tJ zRyK$^S{(m$g@ozCM{BdWqNeh|_gl{1+*iyWJpa-f#lh>z6SI9Ri>cxS?U5@K!LUyo zmB;RQEUeRTDDcMdx>#EV*@P)s}ZyKe>$_KkjsW;TUG;}^0V`DyT?6LHhk%{S# z$m*gO;E2ZrTMT&k`u6ZZ* zxShS5i9L;6i4EtqdFy|fG9jte`^_fo1gTixTlC+qVv9r{W;h;#_H<|lA_BvRj>z;5 z`x}Y)sijbI0S!BfPNQUKXVX4@vpwEYs=3jr9lQm{A}i!p+6J{01ar$0eiB>g41@+v z`%Tv-v)Blm(TO5H5YPMr&0m+H4x)ha;}c_2tQ1v<=f6Em?`Q-z{JC z;!CS-3l-KRP=Pji&kwjK! zkMCw>;!ikLSVTv@rwNxR4U(G($ z;F$`=-sMFvTMHk_%kw$o4?ad=oZa%Bq;OOy^32~Xg|5)pC#mfA?(_P#R-xAg1mtr} zG+cz#7{Dk^tKf(B ztJw$0+dSA)@3p>b{cRNr38I;T)Rp$Wfzl{e9t#(5@nh3}Gtv_I=AFOljf8IYT#wTj zolf$R8l_1MSztfXg8z-+jaUI{$YAx$g#_;XyYvJc!Z{|@#ak-xU6=h<-I9ZMFMioe zD-xn^XIt1>@zYsa49DYfc4Da8R%;gGg%qtr8#L(_XK#CVe@fV4Q|ob2{7JlVc)3uIm{`c1hp9>O zK21EuM1#JaWp|R)UY4v?WRn$3g){JHoY&2xSdWj%Ta{m?F&R>}j&cbm8cK>Udyk<{ zvlC+GFxd1M0lMn57Szjs5O1LO4m`pq7npt||Xn+dC zwY4k3M_qj6rw)>;m+L{U7AoM(yV5Dt+sRlU*576p7H1})PNaElQls!?mL6=CI*pRo zO)7_Wv8?3dty4zy6j6%(n~e1m_NsI`<4sBjeqo0IeeWCOPVYC#++8l#WO-YTT*0e; z$(($9<#zE^nG#2*bMQhk<1CoZY5H~cT8ZIFeO@yWHQ687*1dlvZ9~Qi1xz!4I$yIi zzF$#MF|#?(Mp1ljah9tyw(nZ)o+qBt=%QaANeK3Ve*zkbmGidK*`!1n(d6FdyvS^L&Z$$8}<$B5(UFkAug{ZdKLU@ z{xzNLn^oWaP_4s#t*w4`+8J(EsS3ZaS06l@%p(TONCLNyp+s^W%s6A! zles-#$_{p+Cgp!v5jLgz*22GL@$`84qEFtoA4S)@RRpt?%@zf!XP!=kjJ!LS<+pF` z(f9tes>zQARqw~Qhqo=x?oSj&gJgA>`yPUI1<`}{c{TrTz0|SgIDJygd{&fsMK4iY zvTFrPc>OW9^qY@AY*lbyD*L;9Z2a{``z%3C=9NI7R^=U^_^NroOBzQnnPLZ*r07mc zddy4Cy++^ZTC~zR^;%ML-5xgliOh5R?O9haDi^R9R2lnbmPEJ zd`lCZi$eW#qgmX^ZW-e%9fL_(2;!$-_2z90Z%$gPp;uVO{%FW>%}hUceGbXZ=efGt z4M&r0+lB^8jeiU~XK0hF8`RkwFmP|XN85^FYrg8GyA#t*%0FFfc;(ksT4QS)-5e36GkNzT7a98s%y#Y<7ruHurHcDyhWk9ehBIiHkx)Vr z-Zp)+fU6t1q?&FsVtwDU%la0CI-2DZkA1h{P z==QcL_&@!8V4tG+9{qHNW09czev7Pg!kU>ad07XSxSc_r3Q^SgAin&l(eS?6SQ}&0 zAkmGCV^{2RJqA+mFHpyyj!B%43EmsCS{zR)ZdGRCV7cSTZqo8I-kdm{EQ9XRmx*2i z4bDl0Yz2)0W`3rfw8T37o$dcZ4)S{J%eL|Xb@N5t>aU8lF5%+^Z0mPzaK zN-8Xa3TigZ!u64B=5Dn?d6dxPy&SRx@eVAly(BJ|#-ok?mK}(Cn_QE%PnK|ftWd{+ zgmui{6y&70vl@MMDM*K>9Bzwlrxks#M@dOukEmRD^f(FX^l!DY)F~pZFOgAqNoT54 z_7-`o({Vc)2DuB@%MO0?=H%8JyI9>!stYGi;kGb(zl(^?xd}V6(V9Na z?81Gqm8YiDm{de|r#nzxZ#eOFfAD7utTS*j@y8WA@(HZT zbhO3Aek?538x!1BA`xFNZGSSe6eChKHO50Gjgs~AZMLmTh9SfDjq~M%SSHmzG~_zo zB!Z4BSnm{@E|~uG;u~kR5P#Q1YbjNBmt_elY3jy|7@-E~sJIv;n4%O4+r)63XJi%z z8z9o6@p&x1>z=4K-T|!|^V`StbcB3#DqGR+i;^2nx~_%;QfPo=PZ?zedU~l)w%J;3 zaY`!OLOCtFt~b>#!5Gbq3v2xsbYrHwH?4$>3dzBz0X?vXlPML8yl2(*VW=xnaiL}{paBcd$r>i zPQV8Z-Ky;Aqq>xzT@7g);#$91kIuA9!o~XJIsv*ts-5qC7rZWtATlP&w+m2ru|9gU z;bp?@`ci5)CN&tt&@^d9($t8Ty*GsEExTA)l&CAud;jdD?>Klf^V;M?r$fv8aPBz% zuy|mbC3sOyEk&D!iIj_VXjW!PeNL-t$IApwb+`N7n{bz=ov~qVmeGpRX^vz}v|or3 z>b2NS9bEhfh8TaixKznm@SC}qy*Y(wBHtwnG{3z z8yM%fcW=?WHnZ$5^_)+(n-$L9bs?+nK;4s?1?dUi!1X+nhn2X$8p}DPkK6cg!Xf6<4Mu8cdDx)ZR*;DIp;E3N-vdM z9n&U(fa=`Wynjv@5B%h1qf+Z1*=+XhEdflqtj?s7LXtWI$mt-GHy%*dl zeUR~zmY$EaRLlEhzI1rs?*kSpMHq2CNbpwWg8`ro`mE}@`NJN_-m`(pNt%oGdd03@HoM(yXegv}vi51fP<6z()oF6m`Q+yYjwp|8_E_BZq~~j} zZ2XNwkKXx@_LO#?^xWFp(HE$< zKE*KOHRhT`v}x;IEs;3$$jg5#jn79)n6pLeik{Z@m`X937cS_8jJF?O8Z+nau(OR5 z*34O96C2H|mYn{*pPL>s_8fgcuI_ikG9KX~6Jbp?LxmRi?6MO0MGv9pU*WOzHH+H> zx=E73n4|0w&jvA>{E;65D$+cnK4a|aE{(U8pPN+(LzBInbKDnLDJ*Rh$SP3sBvTc8(w3 zkTX@YY37YB`~6lRK@HD~bq05$^*i-9Hs8%G!|i*uzA(33yOdgBwR5?8Kz;;whu17Cwfo)t2Ka zchA|aJzakRlQVrxs<1~50RP0+K8_I6nwLfI{{FEl=}*edn*~#6XTx6YAY- z%_Qmb>eKPvV%h6d&kIvosM+Ibd*G`|Vhd(ef>i1@yuo3$O%JZp5W{JD$)bl5YH4+b z8F$y=UcCM9B}%^68#@X;?~-Haejkyct$;ofs5q{}o~4bK{g!R9!s&e?-L~HTI1;Lw z5QE*k&(_L`w!zAdj{ZpjA&i95wWp8X${gRFGM?x}^U|}8OQgv@R>fG?3K{LN3u}3x zil~Qhi8A9S&c35RKaKf6EWks|AkCA|XnwR^ZrzaXkk>GFvv^}~^#__<>?tM{16`Wi zAE%74qe^LBFEEQn3y9alH11HQg$OlUt?Um3928V2Ce)eK*QeO@D|n7RPDMMVG!Kcl z8;Za8U-bdAnV8m>NNVwz;xSyj#0;}`m#CgPhgzo0g>Rc79(Z?h;A)1|OE&wI(OoSO zB~O*D^vfLw7^F<`R-w={?(Q-~T@k~7g{brgwd`z9+i948MYEfhoQVv#b2U zQ9Fzd@N8Whk?FCfF?H^+M|U^1>A9lAdOgA~kB zk1l^YEGUL6*4<;(*B?kxg{^_t#(a2p$weAdK6~#Ka*WWVh5@COl&IHM^vuf#2-q@M z^mGhG1}Es02)b^II^}mhBskB93D+$i z*0y&Pj)mIR2$b*3y&#i{QOHs?6UBVu2Wl5t?ars=v%B$4!IStf71WFCT!tvV=Y8Cx8B+djQ+-?%SdwrZ?*V(3#+ z><)CcEJHq@<0;)8;Gy3%o#N;Qef{0!*&sueW*IL^p{Lk=%Unm@obFu_{9cNud}4Cw zEkF-^vA9v8vD1zpKDBaL)m6}hv7ST=W&B}GJdTY)z zh|b(@X$A@p12&ESc#L`QrteR;-cg34Mb+m&6(Tfwh&zOJCvF?AH+ zN>tO_&wY_LT`%H}xk<87|D1UAWJHvC|KzXA-Ye#-VwC4!)U-jk!DDEgldI`ZS5cyZ z2`nQ_cV%Dl6grqA0*PXJb8WTz-Ru3gb!&P^&9nt=XjqlkMrbw_zWcx$tifSP$Z$k_3sss}@P5qkz2 zebVh~9eC|c^M5NZ1i3HOZte+%0M^5L!Dk&NPKC}JM9LqP^@fx zCf-Vc=7;=IpI@6bcr4W^6Y=;_=b-SnpFPI5SI;ZVH$RCM;}_+0l!2Emt5sB%P}g1x zEQ{>#l#oC`^&<6`m9?jS8L68rfd`sMTgfgVcyGqT^6}@v<3QF0hdg^lXAT|pJqDSz z>?C-(*l}bGT76Q8!hHttXW;8sYvzi|Glz&v0e%+paB@ZzsMY|OP4tNWP` z&_gQ@B$5e-jy?3USt{4$I`H$y2~FS?UIU_FxU;xDa(S`}ZxDvBV*#6>4z6wivC;<)@w#ffOW! z7p;XLJ#c7RMdz#ttXen#^Vtf80A)=?2Z#$&cz&4pNv$AbpeyOb5sEX%-{NPD!$ffO zFY_Ip9WHj%gW)P7-gb16VoN(!@Ps%%Pf2y3#q(7EULV2JFT&K2&_1CeF8m}qVb zfeN?{I8qC!n1fpY0fIw1YuWE0Zn`WBCq;kOA(cyI;y7Q1=r({0QO-0yv8+&qeF>Tv zz(4?lv%3cSu|1ZlFOVB>2FD7rroc)qvo}21F(bvxHiNQsrQ?J>3SCj)TmXDw*#%z* zMg`15CcJB50s*N!VW3&@Awi;tuTrovh!|!3e&FXksDy$ItpMWHMK7Dj0n(BeDN`Un z`2ucTZS90v&-_Kt;8gS$0}HTE3>#vhhylep5iRI(EL&6&BF%rWrpiD?XDH`~w%clh z&cXt0DA{H!`*-NgcLeUoE8*_Z)4=Xfl9)aQc_%4?C#nm4sBs>^U*etw$Tb}xYe=&> z16uR@bkrV#d&Vg{G?IG2xVUQtUnJ@%h^qwFi%&^FO;=)}(#IsE9EdO+r#`D>=I2zM z2#viY_ZJLO9GD0435_R>2|;ercnY2;P~3oj1M=kqFBia*o&r6DZ$rBz6ci~Fm2k4IJ55kZ^>FX~RiKq`!y!3H5cXsCGL;8cqq$D8Yq2G~Z{|;h0NA@vjYRU$o7Q}O5-B9m9H6Dd zolxePn1N@I_hh_(uq4-gXgo|QJ2|^k>Ks5*ehi_;tkAx}yHENC;+45})f47(?q+i% z_w{4*n5GzEWx-*??3n}aW6glT{ilfvY5R&H3M-)}j9QeqBaBLcdUV@sc+ zTSEkeyG!fAyRDr+>1tY{M)5rIAh^ zzxnhNvu7#FVXUlj#pc7%1XcceFKu%0{=#ahcvI224CTd2ZVHjWd-`chWf4Ct-PosU z-01Qq+i&T?$VN`f8BY|tSdjPiSKn=d^f2+Y`N`DX{!d=RmbHJ+PRT3{d5m6LfMM%#kN6R z@}UMbc=C%JI53mBVKe`RhApvVUc@haHyU$hIzc918TJpLW=!^!*7wHPHmaJ>;DOmJ zeOb<-PL7-Mf333>s1(C9zn+{-fxQI)HvjZLi=J+(NfSu-6M_QnnZ%mu_~>h6?vWHM z*rB_x%^O0w)d52r`Z~<@7 zFne1#6jtF9SmfkXOw@fd6cG;xppKYym9VXzjr?qhtdj<SN^Y%4`rm=Eq)Sp(grGn}P04gj3hkj-UCffS} zM4Ne4?pBxONLhV&pMk-ivP#&*fo=tWIfSjjF(at@G~XM=b9rGZ4*QqAf}y=ZXn@e! zyv*l40Vz+&pMg3@tcq;=TR*@TROox?vQDssgxAzi2H(bI@ywk_7bb@kUtXo9z|@KpfG;LW3Lh{x$T`atNE@?}o0m!Iv|V zdmWD#dS{9RZMr14FQ<(rEY6f>YXY77QAdxAUEH z!A`NB;Y4&PwT&i&ROQ1Oe&)%aEt)RMqN>BqDp{c7V}77`mgzZ>;6pn(5Z~@4f_jH6 zku^qW>TE(ugs{4>{Vzd5XD{>Rq||j214eN|>0Q_XBlE2!;f#z5GJA{_*TKnW8Am(v z6pS7`UL`0@7=mT<3PlW*`Lv-1pP6FC(PJKU+XIClSlg1E1%NeGa@dJOoO;3YB^Nge0<6?Yo(JxawXm=04EDU$%i>)S;-!T zp9{^Sae4`Q>czP0#C?+qiNqc3E_RG1ip`8x>*3{e7aBdNI}PQBu2yTGf+|k*g2!Tb z^~dboA~hK(PZ&vTX0rEKKvq|ZfVh>oY0>ZRPl@qf-z5D3JfED*W&)y9&8N@STm|(l zV3!gi4qI!@be8#Nhk1l=&HGhf;Q69w0Cgx>y(Eif`gm;+xUnw1H|wBBR4ngH&5~}# z_C(QC%F$b0KtAVqjP3BXSKDa&PM~|xk>pdXrn|OdZ)cD=$w=G$r z$0ox6&6b?J+dsWG@)Zm&LZ?+6`|#*eA{MTVXuxV|)Q^`I{rqsi(}oaT(@yX#Lqb(V zWU@mF^qLnJr=M@1=nC&V7&V_e)qzA!j4T>`uqEnL+v2^lLI!Qjzv@SEl^55#pZT}# zy_+nc%I9q8DzGjIAD*Ice13S+GwppRHXbA8{qKXtlz0`U>u|} zQMI_P|8qvb+ru^Q8=B)|(iYx_zd?H(R`)uL#~ zIU{f@EGxdg#@liEbxnDyCd{6inXSs)4v%NiUkZ3DLK`|DR#IfTEh~*T<1lH?OI02n zuaGgmu$>g`EhJ|XZ@}pt{fi=(YAM;^a=eQEV!-W;UOYQrd*?o>13^8iggSo@q?QPj zo^bRQvos>#g)XjI`dF~ER$Qf1bna8l{EtiZ9^B2QydnGAY0t35*F5e1g&j2o6LWtC z?A8%OAOy|L+ZU^Z39>Q@TBH)x@NllKc>r3XQg@(%^HezUUL8Q@v0g;jjZPn4fsnsB z4OuDA@i=iOx+JHm^g~hb@nNu_3A+pNgT7Sb+$}_P1@&zE6inIx@U##Nu@BZXJJ+!UTtAP+KyWWuGmqW8h@s7=E7+ zK!|D-SXdiYOA;BO%YznQOr5%m*U0h<(hYG*OuN7^bI8aLt<&>RA^9QHX_+-YRco<{ z?HK+n(XL)}Ez@w?)+a96Mzk_zRj%AEO*0LpW@3cL9&#cEy~*&{IFEoYDj&3y6L!$b zdLziV6F2|6Pjon#$4Wr{%AVCkXch3fg(geBhD5t~UJ=nC&(osoko-zN;0Tp@uZ!z) zTrH8`&;S;Bvo04Af8!j{^#}Z=E(m2)Pv=tT@=nXlLlNp;(<|k-^jwEVW!2eXM`0Ie z5D&YB#K9;TSE4eS8S3&&VLj0~5CXekGkecY)^6MmxHAuXo5~W`LIK<&D$^Kug%BAN zlfl!s=J*K7>p=Dz@%;!(O{YPR2#h1v?OT_#S>q3HX&O9UV*RsP5%DQcUArYC;eu%@Ml}x5=V~z`fk#*iydZ&TQT86Sc?ev zxNjp*#YxjfT(g)52tB3^#7)AvLDDfh!Or@YiPl%=r_x!C5RJ+d3=$ee*CNiD-gX_d zP;!yg3qIsE^sF$>B*sT56#UHHN-n?XlS;+{9nY@d5aaTx@L-a$VaB|cnWshV>{w5Q z{EqxBRt81^BhFoDvsL^F4HFg|*eS<_&;P&oZ%5?dUp}BMq7m)j-*2sZx#)>J3d@1D$Tog+knr z!)6llFfq#{dUW7qC<(F$FyXTHuP_?3MTB`i8tYz`f2r@Zv{P7o*C<|H=)&)-%b zF`}suSX`fIZwk96wjTT^yu+g#V4olY_s@rz-&kMg$MLv5r)1xS@C$7<^O#*pMsYPv zvM{}w32g{HGiEafpKyx|F>${jO{yU(op(2gr*TQJy7}j{s4E^zpY9I@1zt`J?Tg9^ z;O3m;9%6qEAFtvqG3}=XGm}{d>V)U4V`<|KjT$BdLl|;`WHCIUsoO( ziyGt&V;pJRS(39n#9KNXEe5&RW%;RmjnGxOR9U%U41;oHX=h^`xOWQ1{(UkYK3*{v zI8Z+rt3uCuU3j&foUK~?@^|Fo#L~8E{FuDX zH1S&BpfNcc^-*K)_nIZ@g)xtT;^1gBc2n8+r*`zuU+aRkj20C$A$oXIQ`Eb)}L0a+u;d^(z#y-;mV4* zmfWiICfF>z9?!sNhVb$|#i!i^s^$}j=DBZDaxbw4=to~W@?`OglP)RR_^8(jBcyOqhzK zRmof?@m{qc?dV`(ToUH%mD?RFbfEz5?f3xR4`puZM5+Ult0t=nU3rAob4gB^NVnx_ zWI1w%g)v$@NI)o8+0kYec?K_)Om z!cVn!TqAyTl8{!VubsFp3;Ayj1R1i$KAp~6~GsKZtQsEe(XT)bdTCu0pD)`8jsY6ah4L<04B#W)i zhOUoSpu#BqVpxpbSn-hlN1fGlPAZB8?X&~_>WI^Hanr;sHZCV}@!DQ&aq=adUrp0z z(e1M_IY!SuZH@TiOj3(^ug+=qD(^zDv&5pGe`7Q6dr3h7CAO1+!t6vL6y^ z&Rz{_FnIH&5Hl|FnU;;Rh{S-pnGG(wK*nLSWB838X{h%>gA^{eURCyL^Ze9!w@g2h zEmWAuws=c2HpG+|^n1_*{(A$w1q{9pxb4wfRa~4TDw}^m11^JxbWA*+lH7z@z0%#D zJ*F7ElPa{$z);DBbcfhFqW-moQ;)DptbO8oIh6v`gGyRdy`EFW#X*OLc)H8U61o;p ze5F(M*j<51S(m*WaGhjG>&844#*F-PT0Hk^;;g}PRT2DR^*O(m;G{uSNl;Bm^gIet zJM_ZE#lcY2;JqgLKFb(j#t`N}rF<4Gb2_ATDK5XO8 zu(vR@9lHi~ZfIF?XF6x5+jOVuXGBB_G$wSFFe1$V)uML$gy|rd1imuN{D^TA_ejLu z@vvO(?i~A;@nWe41|$tPPXv3h!t|`P>5_u{!vkWJb_-T(1ZQD$tzJI-yO@Pl%Hh#` z(K9yYtr}+Y(Lu9ADZ~Y`L7`?zZmD^8aRU@Oqcs{k1hv2e)0+~K*VMGoG-lO&jW=(+ zANBQh*dQx+AVwgZ1bUoDDIkP;q(!=$+N+p3xgO;tZh`&Ir{*X(%5KO zQoD~inyeYwZ5eBjr`N@1cg1JM?A|&T?HXV6-FLGydTq0dRj-mxyo+6ZD>zUJ0#jMm z{7!VAwYR9u;!z#br#R2U`H35Ib+sKD9vHEk_v`fgAr#E%KifIIG3Vys3Fd|0 zUZfnjAmy5OX;1;0M6E?zHvZ7Ke`8M@l#1DndpUCuBNNTOk1b-1)1NdbR&s#&w1yZ+ z9PCTb97)-1rk8V9lM(k>cI2O>R-6pI=D|ce&I292Jq@pdnQTZdZ=g=xVk**YI9S3d ztqaAugYGi*1sf&Qc~xv8gqQXH~sPk%pQp`-5ZQpWKE>$ z7HBrY%VnqnyP5P0*=Li^6489DJV+4Cr>NxiOHUpNljzI@+#O^iky~Bpn-q^EKRa^;G5cDS;>}AtTYmvY&bCX z=}BlMGXID{ARAaf(!Ql#Ad>{7klz?!1qkn0fmu;Q$CXmB!W;w-;9xn4R|xfily@vTl% zKkj5D+x2p#L55cq6V)+f21-cI7MI1f8k%Z5#PjuJ;o}u+Hh?M5Ha_XpJz|i((ql(qNDJ{2t{dR1Ec}`i9VLjl1L|8DU8B3y4C=cV0I8gk&|x$@kBb+}60;VMB!2+1T+mpt*l{ zMak(*H;nh(16pL&pZTZfmNlyPp6vjug5Wn6L0~y{F_YThn@tl&!C!PV9No{*@c^^1 zV4al_#S9m>_64yp9lc?EGO?X@=a8lztTM@;S6Nkv%$E4XRo zeEp4L@%_8JHV@$vNxk4k;!VdAALI40YE!Rr zA7rksW;{_#00}qcpj7rHSmedXVt-iZ`v|@X zJC#aVV~GTrI~b7uR0}G(^-d9-;!YKxWjvqymgVj4mFh;-edHeXeUUBY?zg7jMtOHwu&6J&)^Y^3io*Q zz#%jWmoQ84!wp#K95l8fdru_w{kyO>UK8=s(<^&rq=(-c3eNg|=UDo3#QRh?!=h)4 z-`y=o8SsN%+3UISa(OVoN}8kIi_%uYc~lY$uZvam6F=t0G)63O z05*wYemBm6cXl#Yh;>|;39+H72AiqY+HeJO^6LlBA2li@olV-=ij6R8S(hM?SX6K< zpsJ5H8~K_6o3!s#-YyPDvamRln?=z52FAh%ySkQ>{9lEjvQh1Bx0r&_xJ3GSGemPl zaMkjG5W>P{K}VlTju7n(y7xMhrl6=JoNSDyg&2HaN?>P znIZ5sX9|UTSckGevHSkaUa1xb7@f_$FX7Ce{~ON7{G@s#qhmz@<&ME~00kQj6L$jB z;lh&5uZ zE_aD}xRD7k9|5=iSdxqj5*Keuw`BJYf#6ly)9VuH^V7qImM7cl2?(WbVgQ+Y*j~-! z$5Cq!aPDgM!S!Tr$D#>?n$()W^3$BO0z)(r_Dv2%AmduuUHZ(`-fMQS0^6Lh_in&H^-%;(PMso< zX6I~|Wf#*n>w*r|>`BV(%N(~kRC9cAN6S;cO24z2Vmw^{|Z;Sdgu`=orv+cye?W#I4XO+B+n##t_q{c#T$=`qg%^Nin>@Oprjk;A20B)6mD zTZ0|E3Q|gxiv_Wmaqm3{|A?RP?RgWX95?gw%QrOs$X_IAhX6cAn&55r!90i`U6uBL6hZiN2 zwQJ;K>U9uGJ#?W?;8|FizdWj3dmG6n*dV4euLoBrVclzO=k*{Z?a+PiM?N?gfkpQh zEK9kVW1w3Snx}kMvf1wfH_d~^?8aOh8qn#JgW2g$F@<|#V83DOkDWe6TD}wGwXx}N z{HS}}*-D1DadX&)op;It=;};{$W|h)Kp#k7G|$~8tvENl&-Z6EYHXUg&`?=Cx1eN(`q3FOLq#+%E)$SbfFKB)l zA{d^L<&*GL&mVB^`p|aQn=?0I{M*E5!rD6`;U~VX!Ab905nVpVQHnuhX1}(L!M%&EiU;CN*A4q}cCHM2W zq@rXGUsyAr-cWVU%B+m&14pIX>4yvFy?!2N)SGUKX_gLiWn4+{D!X=jd~MHS|1U{v zGyPu@4PlvMiAs{5K0=>m$*-Zw<=l~{A!Z{H%H_MG(`I{sJf6EVqgksE4OeU}+42wzwu)xv**Xm+HHZk2k)qW$p*5z@RKwaHB zc_)(uBzt`n zx;o2l+`uuymNcd!)_Q6$0s;d&!?sUCF>9HA!4KvH5Lai>$^wl{&3Be!2a^Lxf^?=m z`2_Yc`7o!W+>e!_%-*1c}g>$EcShVxUPVvrjJNIcI!rlmcX9yHIceA z0SaQD8+3S*gvx=7!_())W7-plcGy3-li9YR{Qfu+v@;Y4_i@y|rGKk$NJn!%UXWrn znJfY@KBkGulA>2?qZ%KrDA>EKn32=~4LmN`qHUa0aT(taTa8M0B6L81L53(ugUva4 z0G>F^u5@*f{m-eg%b{jd`tv%xbj9PstWIh5PCew&I5!R8EkQ(p2T zLu=EK=~SIyA*Y;;)T2!Du+u~P24<*P)7h6Q@w$nc_L(5`IZ&_7}>2#L2WFu10bI4;rCa z`f}vX3Dv`t5~I_ay^jdreAbpTZupF;qv*jylVOQRg)iyfzkFX>QNp8A5mIfVJ`>07 z*bs$4mi#av5%Z*Q*_O1@s60G*OYgMhf)IZ8eziDWW2^GWK97TXM?)MSqpUHwDcS4> z0_LXCz3Nki!sj4PBrGpE(ese?0x~y*PVJd1n)t#ff_x-o4y-zPhDZj%oU%S?L{D_x z870?Xw#!gx(~2xawy{(k_f20}A!8&!6QL4Yh9VNsx$9ct0$jA~x}ux0Te1EU@?l}5 zAxOq&u63Y@yyW)CaAIL_7R6CoPncd3MHhzOt@L}KI}_`oO{fRnP@4$+6el(sDVO`Z zJi7I&X67BV%AUG49y$FVe{dBh(|@PHl44d<#I&w|#^aB7b@rB_4`E9IG19KV4w#lb z8s9w~J+p4+<;)B3si`Oaa|@qV4gK>^%A{)djP=YfxjN_3c8WF}wZ#Hz%hW*Na4hTX zRsu;5c+-D2s2h&~fnDe3S&?T9@so|}8+dClPF9U83W@e|KRK6q2#|dcLx_aPmkWit=mc7q zv_0O2M7yWNhK1(>6lFmO!`1JIgb0O%%aBka@P?>1;K!aLw1Lf95vl!z99LBt9AB)$ z<3%wr#XQj~vz9y7RAGGa4#drz$qSly^pS17AzZ;i&K+nCu_1+x(8V9JY!Q>kR$IT6 z`9?VbS%+$#e~Tr*8>H~)sr0kLG>4N`E9nOvVW3I%yKUj&p;F7xd}1;6plTtM>kT-N z#2)sBv9+(YB}@tk5VHvQED#^PsTMH5__XYO+C&}VMN7XgQV!_eBoqB$;Wm7wM*{%6 zQeYb<x0iM90enX1Kd(+l)@`V41vM+~xB)H_{Ve^Y z?%0P5u@jAYxSq37C6xLNwePwk{qc8yJ%3?BJ-DC$e8yAgogeF*x%}e=XTF|Uch9Y1 zg>!oJwokt3@_>CMUU^k{$(^|QB)URCim|-VgOV>Ja2tDNAu<$QLYlI?wge=CdKXTB zfjG*~3CSq~LV=%RS>sWFRf9PK^;>sqP-h?eA{k@S5O_Xnq#^jdcKFMH1+P7 z8ZExRX1QYE6nrAe8}xo#b)whgRo2Kl1PQndya@(1HRzHt=i~w5@{$T;sLxBVcOLZF zhTvZ{qPgCHac0<~V13vc(D@*Os!!h^mS$3RVC(K1V1vPpC4+W(6q{sR1SW^*hZb=0 z#aJ*-tL*gLS!}65cxf?-yMSEwzOR0pZ2U&x8ja(~{b8V{GirQ*i#c^RVa`cmV_ZnN z)cWj-0E~zneX<@D7PovBi5DzI&xPoKdxpnrCf4Lv4U0&6cKMBk1yzLIe7Nt%!v*JkGObpU=;lQ-zlZ z1&8f5Swn&zMQ@xqfulXFziUALBuS>8Fr~|dm#DSnRr30d{h7^BX(q#>1p%spJiY|0 zoi`k2XPkw@(`+lMs@r5|g0~wzSGo*)4>Y_!k->^!8SC*H_F^e5voa^P96JXP`cMtR zWE{Di{aH3hDilg4{*}7YykKfG2owF^WeX-Q&HQoeh5z)EnH2!p8)p6+JuUa2o;@>R zK4W(s9XaBS+PNNfbh%?JwZk`A?f=h{nU0z1bGhozZly}H7tZ`W^pEZI2z~=#Y^p($ zYCM@V694}E^@Ghay7Lj5U2_do+y-(r5v&6Gb`_@qjpGrnu@*>7ZXuj$>M#}^YnPr3 zdjD0h8x=#s1z9~Pj|UUUqwymE6lsOnN19!VG|L(w7p+%;jCM!RlKzeEk?!1DKPkL7 z{$w|i^wjF^M7oD<#AlHD9hSE@)6x==F#}h&4Y-Jl@!;Zo)%T!)w1=UL6%IX!J64Qs zB*a$nN19!PZzS(3-$%F#G)v#bDIS)pEs=r3QEVU3z=mZKk4_j2dT=Z89d58%iXib~ z|EhBnA{=r(n+M{~@%dV0fY#DKl?k1l>sj(~_f!j4bBeiGpuC(X3^WSk2NEDy8dz1I zPCtBkue*D0H@ReIdg{!ZXAsU|vlV7A@$v#~!Dzd14E*h4%DCBQ@%7=65w$Dj8b4pe z{IBeP4DM+B^Kl!*&WzWb?~ZLZD~09)LSNZa=;u!&1SFY+`og4+GHgB$hV^J(yg2dn z`l(EeEQhS>edn`nP|RDqJqk-{13K*9IHP z*tZ%iKIctNt@Q?fe?su$;`#Fl*IOdQnluI)shto?wBZ_tqqQqT*$$S#?M{+sT_7hx z&=B^c{}Tg9EKnRqC;?iwwHCBg~YdsZzOpPBmTRpIWtTUg9U-CBAtmh3qe z2I*IlKt=r?$t+6f>?WPwuVMK!xX7p=PqpLYxFEMvk{GdJg4))4rQjT9EzG|TgSTQb z*_2r^A6rC-r?w}FgBb(rRkYMn6rz8AYH0<^3oy+b1Og~vVNH^ce&l&g4Rh6*^^Zpq zGP1T4nJSzgcDMCecxuAO8~ajL&6($P|GL-Uc^4H|itl?mBhl-{)m$m3Lf7*Zt0Xh4cm!DvZlmH*OirF^9ubxU{}+=jYB6NZFi{QDW!{*v2l{ta&49n-uupPib7 zO#_5ERqdbd(9Oo2fExrA<(7q1`{ZOh#H08v z81to)R?a407Z^I6vUINY5ym|p>F(|Z+|0g;S+Y^OZ>CC3L!q-kax#0JmXp@wb}}d@ zx#a2fy_PX?m=HAA)Z8@`XOPdMAHnT;gRI(%<-a}NsJUM<^7!#7W0*`*i~*vtoD3t$ zc(c0+@w7nc^YE}2CKHk<0w5ZdVSBI*?i}mMX=|o5|)+?um&Q8{0-IJOPET?+=1MeWTJNT?E(a$ zz=P!EoSd_ML(*^4qsaG&)s8i_d8St6_;Z?%4ui18%1nHfUrB_%tgDL57`2pT-9qTviIKuvrQeIlcHA*p@{?{Y>k5nM1V;=eF5JkX8!?vN2axs14KJ_= z9YDeZ$=S2?Z){zhU$05s;YQC4Jl*cGAA01VCEdtfKSxYUG9LhmF!tJ)i|0um+2Gur zh9CFTwg%=Su=q8ClnkEwhA%?GvP4BpX=@w?Ly~Wk_G6 zK3KSbcmphK08!CW$(SJ%l*ktr3qq0#H>AKvp!@pr?ssWkn8F6x|9c$mFh`5okIQl6 zpK>p|Qs604v6U}~JKjJx&!cC+@cW*XAYCrEqtvDlVab*DwGH^B9inMWWI0sRm>*&0 zO>eFeFo9Wl1a-y06YS68NM^yLC#vJo#`K0A9bZ#h!Vt}er6dWouQjJIDIft;ZE%2!Ec2Gij769hL)o>U@@9wG8@NR#HTC4y z;E@8bIiW_K;wZBHazMF%p7(9B2nPwCC&wDQw-u`ii-hErfN{+B zt=2m{zcrYFMkbW6!^YW9BkhG9B*{LsMLVq6;#aKvK&2f<{go*blVHh1GtjPljtIvH zVZQAq=~B2~r~w2)FFSBLp;8Q0@BuJX?nhDHgSa4&&#m&h17XJg-5aSU6y6Kg|*;LXND2ApLJpiX;0e_dc#gvjKM`2d?4PYna=*U z9S59jXUq`_rRbYc|B0om{1x_-#sA-ihT?S*^<0syjI@P1Wuv^HB>d&-NO{_FOf0(B zJD2%snq)Ibmc9#^(1Mdf%#dCHK;pca9h5g}g&(GYKAIvE7=G65)3YlL^Lf0iXmM3~ z3?8rVQmZr7=M2bpBaWV7lT>(krjRF-$dI|qyf24M}`cN|Uq3@sSeOZtzv@^=i4aZnAqsfx$X$u_uJq98J z$Uy*r+skV6FeSq7wVZaEKp$P_;1MM z7P03Qnt`RjlpbF5=*&AuhR)JFjISdBl>Vqbw@LL~8%OH7mTMmDI#ps>Fh4oaad<~g zy$)t&GkhvNHFGvf`vEQv;*>>2=S~BTU|IqO7Uh+h3trtEwpol6w@n+yF@xwFXv#Nc zo)~ZpVhhe0R4+PYd6MzQ8K_lpw@C(*D&8~QJ-vKHCSiG}!HR+8L}UwngPxhE$+ZtP z>(dIxeo@3G3yNM!=Er;qfI*aJ*zZ1l;ils@~f-2ubS>io*n&VR5*Iqd+@A6K0ATw;Zx*SGH{Xx{AX{3td;ev1h(fR8Tk!S>!?c{zy8If41);f5sFA_;YfX>E_ z3DGa=OPA*da@j(4*mtRym+S$JE(%<6N{IfSZyByl(l8|uK^L1rImNI-8! zqc9Lh?=|IDGDg~Km*;S?&iY(PUivpAM~i7e;OYGT?Sppdu%X2FlDvW!D?$P$7kk8p z>9y>c>lM~%)+b(Gx9h9?tN>+LZAj`p!0(g_h*LOV4I0#6 zDDgV&3mm#qBy)nTB(lyeo$*L*gN~cMXJ=sv(5%@F$x%mfu;z=NtNQ561k*cx4yb-i z$i_b1lBe0nY1?ULOaJ~j{;XR1IAJHABT(>u*Q@+8hb+Va#IvAoe4-y}uGJ!;5dtVA zsx+K^iLZi3dTyl><0aGYc!KY7>mbqJULL4sK#?g%#N@MMk^YY0I(6i1#!Z}Mg62!pA9?BL_=Hf zSTPmJ%G`tQ<-vUDv*}1h5*X%3Y!ed9VD2Cs@xrDtCZ?Zg7VViPwZP zatDg0Bjxd`%fa|vR71SPz`+vb+oT%>LhfOk|H@u7VK<|EPYNI`V~DT`o#|{J*{_gw zA}}Nzsf};-!~(>$eoM&mi521akv8nkKklYbjXF{5aGvAY6*3s zWa1(RHH3ByvO$E_&2d>alUyQvg_#RNQcb&rvWIE2C#88DF^+7jA6R|?!xk)WF9%t! zpMEfb9fW4TQniKt?RFsy!axWfcs8 z;D&rZXW~Gc6_%DT=3vKZ8g!KR;}HzQeN8_2r^pH$6Ep$rrall8fU8_CBmr>pBB3$; zU-V!BWeb@{Jm?9E{@I5IE(x#3q@^k4PyZX2f%;Gm<_?qTjjy$#@kV2b6^;2ANPHbI z49_716bF#Q*}xG{AIFblC=eL=9e4@o)M~1NMnWMGIQp;?=`%6ZM{Xd#|IB&;dqreV z*okF$Tpjrghfs+Bn3O+8DNQfI&PBWoGDVRIy&HWKMG#=*Ztj2`d=rHk<)UT8;SdY} zrxOb8^|ODxQ^^&Ao8PplW4wl~btK@y}lEuC80b+a_J)X7T;bT|br?RG;4g#fSnnD}%sCL}{0v z77Qd7>q%K-->Mp@5+^=bYBgAW=}>&qQO!p_gk&H%SAY!_B{q;>T9YClHu=@F=kgpE z@QA4rdNln3!eU1#gm45x6=d|Mzcs2^qN$tVocNKj*wVU{Ze3tQHK{IQT{LPzNJtW{ zL+KK1z!!`GmWK>4stQxsL(rTKZ4uxkAM@iC_7Q%rf`P=gTI=gsw%p11pr+)-g+wYz ztcgC^hKS$I_Bg63V-i?SISt6@FF6i-#}!wp;)yCVZLiEUMK$2bBVrYh1TZP#Bq)jS zqfHL^*G|@}#k#9N&JhxmAgutx;zZU}uwewjBU*=zvl@+2*AWRbHN6@!$Id}x5RcW@ zz>yK^yQWYIK6uKK9BZuri#7dkjyGja4g#F-%@dlU;q!!2{|uI0io^4H<}=r2%itUI zVHqqTHH4-Eco>iiZB<;pJ?8l$z|fWw*iz1J)R94ghn@Y~LBhdqO?-ttMnVG4#T06#Q4a9A`5?k382a)Zq#S_D-8ZU#mIe?Sd4A^Wm` z5y}yyGf8p+Q!!0*t8RUBr{{79pZ439bI8qWwh0qs$@EMpxzg97MLf>%Q67!r$}lu6QO-DCRPh<<$bkwIR+QLs^%9x!>y2`qyP z#||S_8+h(pmYj2E{EBV=CutVI9)37z#7bllCJjFl{rU}0)(mjC(<@=ph?vp{3dAfd zI0Q!h>@`dj1MmtMFVo3e3v^NS07<{0GC>9MVj=T*yw8T0pcCu{;Kzx}A_SeT0ZAP_ zj!L6ovc^gb{#F)^!QS64}UqNXWOG4o>guYh4XI6|}8 zqS0kra4$CzAd?3dg{v?Lq7Oyu;i#V^NeL zHTK4qTLQLHYK-rZ@-rKf^+ZWDg*opt*TKw|%%?V*jW{Aq+=W^!*oQ5$yJH=Yk2+zE zj@zEHe#qGe2`{+g>fxy0lNQ2=ik7W%hstI#Wiw3lDOeP?rd_zlNHm|ks#=p&Yb^~j zQol>AHG8DJ4>R`Ef%b!=()mm*p9F2kRs``euJz{iV&Oh1>-WM+>{YThY-X*(xxeIkPd>8lI9X+V5?=?Aq z{~}P?;E!>7Mam=HpX|CF1v$&RsGKNKn!8dLk)CjNvjF>k3q7gOj;v0R3oHp=5>hTK zDG{DNZH^q&Q4&lM_airL5o4aAFeq*TIjd34K2a_?Kw8C@4oKqEd)Y>WWEoD#2=E>K z2%=Wt^f&8IhaOcvC&wXNG1LVA{!Jb0Zb?7~)EGfV$`aLOu)DJgl!j?R@}`Fh4^yd2 zioB1eazgbch-5s7QGp8OZiFHTwgXG&GZvUQk%FB%4&#?v_>pg^ze%fmRQyy_amWBn z4aFR4mi%ODa-5hK&ZIK}G9fg2$T)hzd%@O6jKLdf!=;&QuBnzZ4HNq6fv4TgcLMKkX; zLE6%`P}Eng+M9TCjUD>56o=o1h==j=$d5%z&`nIkm#*)*xKClc{7m6V;qXUU2NN}d z1^dpbHL=pdZa~2@$g-Kog>Ciug?luKG1O>7;GiL~S|q2EyVI!uQI~f2%hk)wsNy}3;95}~T3W2~V78(z~cswu7!p+5ti zvu`AE6nRvfe!KyE0DS#=D^yaLRJ9)d5!0s43;J$whix8mCX-=8&{?7}p{#a+H*Jq} z?Fu%8rKvHK0Lv%Anc=#q{rJ)O8t@tn=8k7)v*X1f`*X$h)BuI`FA4qFd@u-5^!>@(;A&dsTM(S^I zWU?+m&ZURl%00*WUKt1eT*MOO@X0tOmbkndVxpS^Z+!@mQe=U zRn+44l7j%R5Lyuj(yc79rM_W#x_}IUOzch=f9A=ptNvi@H%gZH(^gPVF>`CsmkZ7< z6Hk1m6P)0!D6t_bj$oS`48Jd0fMdi#WaVc<<+vNt$)EyJZ6%3eC#p~TZ1Y`(M}$X` zBbi8*Wd4MNi-bO^Pe3kTluGD|pAfnq1%ZoGvioBC=BfALg2&#UWx8Glkw_)B2BJPe zf9i!tq=;Op>O=?$hQ6)1<}jBV`>`Y@NMSVFnA%t_s@cbpXb2;ajsY3i*!2k4%|_UYvOPv2h0s7Ws^#JYgj0$9 z`Kcbj7T9+)66EcJrgySs%~RhgRlSeG*%nO8z`TZZC_r{MgVJftS0ex;%8^iop;v)| zs}&J7zW)V;y%$;UWhc772-wJ%DSlO|*3zX=;B?LaZVz!`Kz@51hMm=Ga)G5?U2_d+ z@Mn!wDhc!ba(VJ+K3|GapbH|UN$o6>XKn&BpigfSc(;J&DR=*y6Mq&8gx?;2q;{Wv zmmhnZz{epmw;?LZn-YW%$dK28zd%-Vy^|Ht|24kp4M`XbFBr8y)gO^uI{|qv;ttYF z%nx1+Nq21FY9Hfxhsh>}Xl6d_IiS`xP0z4<4vwuazzA3b=4RT&Qtzk`t1H2Gfp z2%^j-WvOu~@#@d3uMJ1q5|}os$lR2Jij>&(v=tz0*x-7+jjQ02p5y~cCgdnST!Pe8 zWq;h!&X{CMc0&=H{vds&+uaiFiDQg1w0*K_j;RS%2;^Kui9~k|P4r^u{X8s5el+_W zk*F|lHAESJumgl9vLa+}+Dl?ts$bXAK3r|gVBs~H&qJT^C40H^fukrp$~$ed40_LR zRxE@!=mY#=xDY`&Og?33koNWM@jh^jxCKzRP*ONFsnrb$8cpCf&h~^cADiaXk-ej* zGMgugRS^Y{S3kHHAzz-dQ<5Dmek~#*ZYvkEcW%}N8F9b1OPrX_gbeq%!?pM+kY zP{}dBo27&1wHl9^OB-Tei)u<>`XBGMWLiQF*bBD}xdQf?AL9JLawg{0!;lc9i45H6 zH5@1~z8Pdu1i}CvRP1gLm|kJMH=2EH z+7^fcR>dHmMp`NAayyH_LaMt{HFl)~JA!42nou}L29V-Ux>eoxfHPgKRz7nrgCW>F zg)tQ_&e=}w9`m}!)VvF~dsKzCdJt;iPx~2f4@~426FeXcp&r70A<>XkJ3*)O{q5sgW8ELs1;+Z zaWe~5pwzR#85&!(;km(bper&>>(+D&ic2@-}>8)LLTo^zvCe}CyfCu*O!^v9E zH6%nd3>rY9tSjwn0Q1+nRi<(oa_f`&5ZPJJa;XX2{vWO*!b%+4=@W#XtgZCsP9E@u zhoc77ALxi8%-+nx#5-<#7ECEIly~AXHl4EGo0;Z|z|b-4a)8lNqJjgin+n*d89T9OY8J`6XJMQ? zkliooC$rC8IVwb$hhxRnzD)#8N_{AYeW&L-^bCt}b0%CQDj)2b=9k0?6%4EL>xdzU z6rpM+43w30XL$hd?2dd>Q2^vx_)d=1 zOUq=)503|3HZpPcC#6)?LQJ72E^ibOdEh*88>^wbZkO&SbG^$3kD_Bd3S zB=5lNF2(4hc3c=7DsUz_2aSLtdXLN~62Jy}^eie7nnYlalpu2hD+DINru)|8f>$@= zgZPz=5WvFEj@*PqNUx6_P?UvO%^#nc&V5?~yE1EXi1dUcaX$jUuZgkgUNvjw|I1>>Hk$&LZJ_z0pR*>_BuYilwMVd90^=+LB|KGk-+kSQ`R=k ziB&>l*Y~}V%q`l3%=??ZQ^-)Ln}(avJ$q!NV8EzBy(-Drn?@3zJU7ok_EF_&yjSns zR#q1V(Y-|K92E#B&`&dI;sDpz^(>C5BNPZe`WmyP%!;}LnWo;z7jd-2vD0>FaG-3= z{2ya#1)~1CE4H=~2t}B9G{K&jntK0nLdEE6tm5l57twx?zfD*(CFz-fV@nZ5;RNYc z2Jmw8E1#sZ$Q2?2!Rvnr+o3Nu7 z3HDPKrFH#QT<>=NE$_jBg zuoQK33wJx*B+u+_1QL)(VT7aZm~_u-R{@NY@X`cSB#Mi!iPauxZft^R+S%>LRF`_S zvZO>g=kU3gUZI+;pN)F-=q zP=0b;sDi$(8yuqvO1Pe_`LNuH(5}1Rg@+;e!^Tx&l-z2g*xI(DfGuV|u1iXsBo-w_%-~-Mu?e2leW$wylU3}ta3NQGAbdJNZ>1B`q#j--XVcv82ICBBufgG zD%=P(A~HbOJIW)1E>bee^h$r$1>-@;K9pJL74(5nfC@n1<_z|B>vggsB~M;oB|2MgzX={d14J}cdNujTx`k}_^MQ%{0gZh4E9sdh z!=KB0$NkKakS*mw-u?%6g_rzWm_lYhOz-Chp;@F`ga^&~UewEQKeK`qCbaCGKDn;| zuR^W?7XuWIOBwz*tV6IO!{`aCWq_@?Z6JDbkc+(FSEnkUW>p_FgF!#N4Bh`NC?wN( zN)_@a?W%Pz0{9^geJ@hKyHmzoe04l`rf&63Zu6{WC+_x|{ldDtx3CGLnx!9d4YDBK z+e%87xLOd>1hW8b0k0#uBE`RO1!DDbuoG?g&d=i}?}&9`zrF%9rn!fM5!#Uv!Btdh z1@qy3`Pk|*_l`o+$)uF#IphMJ}`ID)`Ee-|-q=c2VC`r9=7py!Ky-K+aW%1>f4 z)sPifimnMGH0=QtdKLqxqBAA>PprCmfQJfpXDPNIG8-pCD6=T-&tZxs@OnR`|A!;y zh~<&%>1vH<^KB{Jq8YY1y8;>kyx^x#6i&^>)A8lNT^pV36M5kiM*LCduCi!#=z0-#CX+Djk2f`U3^=}Y^h z-34P{F7I5nRFvr+>nDHVM>f!CDw=pP%Xs7%W6`4(xych(csSBzpYoiueIV=cn$0${ zpf1coyMC0I@GeRop@A!pnWCy0E>Uhx1GNA$?ltPp#6D5R}B*MYM_yOTvql8BkRy zcIrHP#?l>IwTY)HcMK9xg6uwu*u2qf1do#N1pBxivG~>9=w9HAu)Ny)9iBdEtk-Pl z@1%|X4IO(trjyA|_2e<#9I%*a@Q9wAwyNAXLQ3T+>*lCch6T#S`tpmvT)cwvi?X)| zp54_ly1GDiV5NKd*3#MU&@K%~Sm_em{!HB}1A#l+g!(g8!AWbL+SeBDicK-v#ALQD z4I%rXrpzsfKeuc6ms=iQCnXh2&@Sgvy3=$k%_5qkNIXCwni*GS*#O%-8jgYAg)^tG z4YpCE75lKVDPbxuL%Szcyo+An_Ip56rK-$LE|&{}{O-F$T(fy9-n~at;5; ztAXfTlh9XM)B@t>O^>*_|Nlf8>n-)L?yTBlY z=sa?+_9xwReo7OCqA@;5iGR>kqdbZx_`D-Cw8QTxOaqi?|roI0!r>xy6btIE|%L#d9 zQd^Y%-CXi5BWfY#B0*gi3@_|dFDF7#ceW!_8>Z-u&(H@Zu-ZgsRy(}BdOY`^mmlbB zh`tOm>iMgcw`FS6^b>W74DHm>h7ZpU@ei0X1mXCNT(&05?mIjee4~tJjYj>lYtV-1 z;_aC!rl^|oK(hLWaZh;D8ZjF6iG&5{t(#hS{~5s_HIxy{3{IESwE~Rycj6sisvSax5dKdCCT2ukZMJ3llb&} ztMdf<(O$&|7_epGirF;lY(wQ!`+j-)8`x$SD;-NMncjqwRvjPCvRl;#kKsB(nmY}} z%U142eL6HuIPD`%4IN&R3+~#)kt}Ex=7_E#I)UkR6`eNxz0;$=R_K7qUVi?YL>1So0nQKE&i?}TxSc(uk z4n@I>|{Ii&!MDvF_3^M_`+6nvOXzW`zZa}hAU?M z-^iMK($|25@yr>YoV?o$6Ptat*F=w${6R~+L8#wIc@y`t4&Eh$>Acx~w;}y7?yTM8 zk^8fmTBHPPz`9N(Po|#~K8I(ar{AE4i1(**6D#%?KlP!}bA_rw;&!BUO$r*YEm_}k zOc()%AZ{cYT;x5SvxpVD{$>Q{Kiga8Fh?M-an7IWG>bNj-^G&yJ=!v zN?YY#1AOJ`2}Kz8cS;xzp!b3lC5y2UNY0;9EK{qZbe_5^TF-RTs7f@gtIYm|vnglc zKGK1%I@6+9aQ=Ok6S%B{W`EU35it!43cw=qyK06ns-yBWDnzkcc@e!P7kP#Z>vq*n z1=f%LlT)c`5=S-sAPj`U1Ej3V-2t7_yGc&EDSaPm5owXFW!|FwNQ~p9gEl%O1Gcx` zp4SDiVg6w_F#vq{V6y(2bRPT6uyNX~?@e4&yL3xSOq1MBp|8$n9xCYs^2yq~PbxTM~ zG3sGiWeL6owl$%7W1Bj_>@D86^aYuOcOtvkP3K6*Ac5fC zJWigl7^2NWC7R&v9{uoag5m5wByFe^XL{n+OrJ%rRbs}z0Dk3p^~^evP&Lsm&M#(Y z6r+h}NqPkbhaqy4*Jv&x&?J1eYcbpUB=1)tFemx4seABc{BMGOG0Rj=uU zlZBk5{dRo=3DY-%T7`vfH}{gG85A*4jCrE->URZ1gz?o;X*n3oAk9~qwupDHon!O8 zq=TB-Wh~+Lcmj-y&KVk|mPBbGFy6lrA@2vwcP+r-*JPX-wIOMH zV4#0tsV=&+9qgG~cu)mNBxJ}G56S6L9=e#bkj4`hOU@RL;kS&8pqi+N8*xhYdmv2BrX8LpH?$Mh^g){X2!TiCruP@ zoNC6}LfuUOPKMqU0Bw*z(^V=*0q#0clbDY%M-7)0lC=Qt%5L41pj!e0y`KfB%F$lJrbgaEZ<(WwOi~I)8`8JlPW=`WV6=((bIKeG z<)Q_q_R(wJ!;k4s6k66Wd}UH{4!$JO(=9KATFevzDl0^J zjUy-|*hIocg?+THigedpDtA=D5&&SeEEbKb3YEVu?oX3Uw5X%*CbD*LehCgx??CmA z#%9zrW(6sVy*3a@Lp3F(tK4jByn?}kw2H5ECIUrq)7FR+re-7jUAC%an3J}Zfcd+9 z>*3}5#^s1dK#fd^99sf%*59t0inlgnLT)cPnq9o#Vs)v%%cq&=0k3iPXvj+@1ByW| zLkkt?nDrk_Ms&n!db7pA1VH!$2WCoF3V^v@mCVkE&`A}9JmWImxHm+p@ddUUEV{=8@ zS{n5M!<*Ox8P)qGK1Iq8N|bY)-R6IgwGV0%<32*M^O!RaIR?;Zg%^jvgTq7BD0eD$ zDw@*K>ybH$HW53C*ZP$)|A354Yq|CBUBuC0R5?`+Rh5yjn%IPWQxo2oe$S-tmAltQUVGYi@#y^yPCi)CWC(QA-$@3-p~?^Ksg2S2gxS5E z^hG!X00Ya3PSq4`LeLCk0Wg{812vu)5cGH?^$*wX;T?epQ0;9{fC>Ak`3U9*XZ(L3 za9Hr;INOj5WK1R}0iF>-R2zYK$X(kRpi-G66eJvvOmrR)NGUS_?QI?hB}eg|RLk+> zGYttZhohhuAlt_ttN7Wd4TuBp?|gZYs?$QdL;etNN+eQLr<%}%)zWfw=DyO|+q!`I zD|PbL^s7w)^$C8@FxZ$0Csv1a^)$(L3@6hwoQ_{C+RhHkK?uBk6I-5^ekFGfyBxM0XdJ1GDezUK2)piA4>IKJx*0@;$b=VfA9#exp6zf|sQR zDZd~G0!c}+7TR(UJEw=Hf4><1Jg93d-49le5H~QYvdltMU|ClW!IyZ&ovI#tf1%wF(s$a)(qET6dlztn|Gmm+&-tK@joKDZ$QW<3AO06aM zc50?+)HBwP1HD$0z*4hVGQN>-O0|8{Ag{?xn>=TeIw>AjfGj249y$#IU4ZApv#Z8p znjk6VDteN|X-g_RC-G5kg}V~flYtn9v*IILFB=z>|c8{j1&(o>hgsVj_ti zplBj2WeSzj#*>Q^EclD4#leH4&(~XJ?Vul63Fe`*Xq*(Y2{;}YSvIe7|4u+yNBUDl zX3S_1z5Vuh+QhQ7;jzK`SL1M7gXxVVoreIkqO>Goag1S`f|{khD|2IFxXArh2&=3i zZ&Q0tw_+X!9sm!FoVIVJe-RI9EeTy8j2xG&DA;jN}U_= zuS?4|qav?RC9=*s1Hnq>eW%If$zR63paN^I9X?oNu(U_4c5wr@gH~Lcu9|qhHOz)S z*PZ+2sH#DCPK*|!5il|r2?d^8lU-bQ(OuglHQY81MV_pg*RHxmRn?4ewAHc)_X7)+ zP4K+u&q)2Qv>%mhMBTT_n)*@-LdK9-vWx1^tT*hWSLIv*GwH;YXd-xT(K732uBEbO z1gSjIa1O}?-Bl21x5)V}VD#1N`~V_8Y(C`+!28G02Hz*+U*d?@A}y6}$r_E65vkA0z=?xI+!h z1A^r{Xg;{Jqj&rl-SGXddA@u9beT_;NyUi70u)VAh7o9{T_|LNMr6Zh^5;O>o>X|I zDL=1o=^IwHt4ZRopfo8nYpDpeXiG#0lHx07RJJVp?dgfdX`kGxyfLFt?roTF-M`&! zL(cNAIlui!?DWM6ZhY0$LMGL3vQvg?4Rn35VYI7CWPfxlq?lyH5@LFRG7a6UNIG&% zw@qI+l~RBOph{WP?ycEPo(^>i(rlf42Y3w-q0?LSC|I#1w-OHK`RNc8_@l@N-E#3S zTVx#fo()9b9=G3(;Kx{^u0Lq## zv>sF1KU{!9dZo^Ds(ILIJ&)M=iY7z1 zoDbe8-9*us=f*(nc0bcNtw^`NzKpH z31N4b5s0(UKz`SrAcFTvyKB07A!+V(4KIf4Mhh(MIkXcqMnmEW@3Wsqoh&EP9!zh(W{yRgJ}a;PF@G z5XeKcaSOo`I6=5Ikn8SsA8L8t^cTXQpeFTwlzo$K1oYrogL+S){AlIdo8k&8g(Exc z?kPOhFujr6x?_seXWqBLr~gk2Ku$OxYA)E+G|USKFmk5az;aZp8j(6CnV8d4O@Xcy z#;Q4u?V@dJ<52Q9=jvWGxR7L8)9Db+ytLt%(Kgh7Oz z>ht;NCN!WpZmw@O@{r?UH@|GNA1T4XWs}9Ca<;~2qsgPMi#Yv)UK)|)x0uTLH&MPL zMY0W0P?A|J+zO}gm6SDB9YQ}g1M@_o0_eXoXuS~JW*$VpQT26#&QW1K8xw{h1!x(* zXUZg>S2Wrt8Ly&D7UOFup9;EUW%rDwD zW9y>T0bj3h@p=eM=Cyh1n|5@1R=&HrzQIq}joMjv$S{n0F6(~m1UHPK4(^uN`g)nh z#^2CJ<~R1hM%G)Bsmpa}aLP^JB_F#7;)qp7Pxw!N;Qz4K(ZJc<5=YXT$R?WOMm%sz z7Aqrl1#$q>QdXBk09qHI^(;~=Y^c&ULmq_%i|5Zb!RE#{H6Esz8#WS=9n+XT1j*YXy&^-1wn?*K{2uH&DKMiJG8KD5%Fz;xIQyJ) zOPNb4S8>83W2dzh?H!sLN*5kI+x1LwA5Kthm;hb9XZg z;Alu0^=3#Qgx5mKi%A)B4=O2GmVuQe4AZ9-s`y8R7PqdK7|?ssI-2v#sMSaqL{EmA zVclLdp}Pdz!VwSS&U|UJJaoQdi0ZC$i-(CNP98l~9VFO6ZvOxA^e%8wm+AYzpr8&2 zii{j2JRpc8au5<|Svd(9Xbm>U zRATSwE=@C2#gHv-$@7uyays$!@aTfEleZbwxq)2Gqa2r+6w@N5CZu8rn{T?bvc1K& zU@_6R(yH2bxE=ysuGn5f;VLA4(sD9uWo)EE7QQ{d)RzE#Af?UEc(JKLD+I$KKyu9K zYW5P#sUmYO4nAnO#+s%gyZy@A8FTW-8U)yrQ}%Gg!^k+w+-l+Mg_DD3hy2!z#8if1 z)EY#S_2h+k&GL%Ikq-scNAYB?wEWO6oHeC`*Q4OZ8W;}d?L(OVnK-o!)McJWpm3TML^gMNl+aYc^GlWnWm%*Zq6fA zS4!Xfv8e0yy3ek5zsN@Gn@D7iPQG3`fhtUX+n0eVC4#)4TN)mJ4OqeY;sV9TQW$cGJc2tXlE+ibix zMm&32AFz4+pCRU>zZcIb(j*r4Wxka71ML0^RQmI!fk;$uuQj>ef8VvR;PBb|Y@Vy#LN{E2i@4eKp2rHd|;V0R#!o2QgKBlcfnrZuN}RDL}%d|#R& zC2`%9m&=C52Y1p`=7PVb55F(nXEXWHq7weo328GT8oYj_?$3dDxFE;2?Lxm6K?uz%~Sl*YdPoKFz3^M$pjCY$8Y_zSjHxR zAk{>eLI!s$TmgLYnt!Uh?6o0#7ghG#3y$J0Y2&|3)oWm42sJ>6Nk|E?_V@(>!vqoB zgW(I&kI+-&3FNn~vfO6;gEc9S-#!sc^+(l`;O7&salO>+XNrpxygWnZt&~WmtJoxs z^;eAMmRZs0{OW^BOe5|lq}hH|hH)t_m&Ve0R`&j++>{e`F{&64v6rI%8Bd%w$Jxqr zts~<{^(ky-GzO&tu`H~qE+oe~Pa=JW+xo%SYbMpD5i2~B68bZyTPU_Ku^eXCQqkO9 zv0`t5acI~9WyeUSElf`{__gyPO@9~nW5HdmzEIMEv~cqiXupC9q+i-pRhstnzBuky zO}uTW9}dlz+6yJHO||dl8hMUS?yvyO_(S5tDSL~}j!x1RhgGT{;BpB*vz4zjQzvxi zR7yNm@lT1_tjik^R+RSfJUgzRItCtPR2xCLhR);%y^D?XvR2>PDfn{NoW|9NQ6L2JhVJ#bI6*yDfI~ljYlqj()s93wQpbA^{9zuj=BbUT}$T_Uk_u`zBK8ewd>&m zQx{IPGq+c7fD2kgtr>$uE63OIl=XGWFnCSxCNqeZKxkZT2$9zCfA$NtAE8 z?xEB*@0D#t?KPK<)*hHq)tK#i_|Orf#cLL?s~jsj*U57bCjZWgfou`(IYCbK1;r8M zXb6%sL45hh>Nf;WRaf;VPP~`tmf_|ZBrIcF?}w>LFUWK6n`H$V}XF6R=nFl8}5<3(CGZb)mtJ3(S;r zcR5_QG&7%k220c;!u6#ssl{=Q_TJFNJTsSisuZ4AuN6^ZtIdhZv`oZ0@T^k=Us;+c z9i%dSt@8X7kg2D<<@1E#Xp2`V?3Cw;w!1^ZJSs)YQc*k93ow0k?EKN%VqYmA9EKgF z_40FOUt+N#h_e*+wCglkb6Jk*sn7eiI8wjmE_^mO9lQoc90sqdm823WF4zr)^XZ(# zPer-utPp}Kyecbby})kfR2N9tk6!YWHx0IWs|*K5+75tED2G~45nnmjyqkv*&-tIx zqB+&O$I@eJm1skRi`|QmxA)n6#5Xl-HW^uu(MC>bV~{pboM{fc1M_);41+ciz=gmJ z2S0eD2bD*$pv~Wz4!lhBwosuARM)epWY6TsxiV=H?}CJn|>9C7xX zf4knqyag_{Q2)A=(}>C#3g0LS*2Cb>1T&v0yBnp>jTLVTj`nkk@_-OZQ=T(C`C(Vb zzEf*V8t?$0V2STTO_=$>NvG-Ml8TX(P?KWGu}~12i`n0YB&7QJ$RH%GW?N1}Qr6IK zKOC=d+O62dM5sxVGM-23QrSAkBhcL;FbZBNgat7%g^qw0Mqn%S`P85t6~_Hmhl{s< zVIl~=>7o;vd`~LfTsgwZE$wt^c81{t7Jk05@YfpaFGps=)emOc=#D;Jv>-? zpOXjr@GB~sTY~+9YNCQ|rIYVnomp`-uV-PR!K%ZekZn7z^0hOLkIgSKHn%F$R0Wv2 z&Yrg4je0ApQ3%!7^JEBQ;ddc-vm)-0CVYs`L_E44btxF1$ae>$zt1)y(fzIW(=pu z5qV@_maY($4}v>?pZAUC*={A)E|3x#^bEfEsjS}+X7X$A@fYXI&7}9Ox9C$27iHudYhJ9b49Nh-IKrS z#l~HGbjA+O(%7z|Gpr5KToYIFk=>2X?%^N9>VGgkmL}m}>uJW*H0=ddmuJpCH2DvA z*B0imEtyagY}P5>i%|&S>O;l$&PV%fP)y3N>|Ht09i>tCFv@qi-HGo91+JsN8~S^Ga1-74k{hs9RJVR7FszY-GWjs}K) zTzl@6`0{?n+KU2RA7ej+K35R$Ng|v*oQi=4r>9rc zeFoM&ehm7R4(+G-HtQ9xidggi-(P@lh-o9`VZiD@ajB}385N7Po`ik<|F*}iZ+cUN z>;EK`+EKxd{{FsU$GQlMxBRdJ#r{d4?m|$b^7~Ii$S`Kf9}T_UHW23{;xzlahhERZ z!!+-|KX09Q+aSJSBVxjPNsm)g;YZ2y{r0i{Z+DHd3@U=yyaSA+r7#r{^7T|diag9r zgt;R>V-(=|ya*cq`+>+6Lz;e{8*Z;UKH^-7H-X9^@XU4%WZ+oXN34rbQ*(;Wrb%yg z*ULNMfxD|r-u!G?=T;SD&33!y;E zq%h`kvpHvlZs+vJg9Pa~1gjf^s2G#iaokYP1y~7Ch77oWtrf-uP~Oj<^m7?IZdQJ` zXvz2@`(>Qu`|{L5{dzaWq$|dsZ<7Ay=D~MyuBN+>^zUIEy5y@nW4v1zXYLD5r;+9rrTuLq$tiF zVdx<_5u&$ZV(xJCmEJAF&*Q-t=MGKXa>K+_>MU#N*myt8#7%~$pr?b4QD~SG=*%K1 zc%6@ig@vRB?=C(u4BDO-k~%S@d|hA^n;gH9e{~R4$hWmUcZRU$2@ov2VHfu`@tO3z ztFy)*6)K~TtK|R8J7+pQrY7!o$TaWAD{khsb{Z>QUHaTd|M|z?R%{+vu$aTkWCV`y z_}A%b%6UG8UpsFc09ybOe$&FcYu@cg=~_c20B=V%L$ymc*MbPk9*P|*T8>ax{; zDN(LSHI-B!P)47Pjo%c1EDGNB4x8$+&2wv)*9Mu)ZSNnu0;h6q*eQrv<5r>qTtr^7 z6lO*|>%Hk(nV-5Wc!O8BWNz+fZRgy7lYbRbG*v3SJ@17UfpCsyZX_4Jvqv3dskCrYyg}F~Oxm5HmCUb#I%-KG`w8 z66TQ9=Ldc0RQKE7mMawR#3`mJG?r@V){!#AZ1bM8zPx4sMx9HZ9R48e4#BSSaQ8XJ z(C3$cTSF-!P0VK71$*qm#7{LI(4RA!J2St7ejL`9B0}ZHULM{7NnaW~)OXqavy~pCWM=5|(O%R(IDo=jWS!en30hsSPdRF(s7`gj1n~rN_@u?%I4WM`y+=Mx> zbiSZMH0d7-%7TFlyg5;%UUneWwAtspi8P9sr`Z3g!3~vnz6kooD#wv8e)vT7$ow68 z*+1K%b`Z{j;?3TEmA9V`D;+FjQ~YlMe2tH}{2YUwQza*^)B#0Juf~8MDgk2GP(dy; zNAP|xQt@{&eRmO)@-O{w9E!wnEu{msqPfT`=gejE5Y~zVZs;Ixj~=!3{(5{HGr)xw zSIlLjp0OBw0^;82-29iH2-0@jO3y2MkV52wk{T#-v8L^1H(Rb2a`(jKxX?56%V6zq z4?OW1czK0Kf7G><%<;8h`F*dJoJc$>D9$@aGU1+D^pENfkHZ36eqyLe^P$Fm4P2}r zhwC-)^F{j+VC`U08(B0toOeodRBCOtj=kKMxADRul`xzWdHJ5;jF=pfblbo#ctU9? zkskVaiY!fdoRBD6!qr{!=rV~}x!~YGaG#}E*WnYY?zWV@t4(oquOP6TfA;M2JQ~R= z+s!$g5(4dXOb<_tg?4P@D{uVZ9_WT-9;tc8Ow}&KdlWqX$>Sye4e*l(XQucV6W#n; zGQKdM2_5=mAH>AMiBE_6^_v7Y`#iv<=2hebZG4N2jXoQ63n9da{}%=hQNf&pdu&7q zhzb?kRLAji`c7XjMzUr%Ltz9{jU5Pzm5TW(zln#Dbgl>fjomi%7XOQGN~PU}H(*hP zXsHxd?l)8nAIFBqmL+sQjKwNtYt88plj7%~q+~p6S^MTKxOjV`PtN5G&HP#u!&y9r0492A#69_kZ65IU#* z$SWaD)i%tDAU$o@W;TR4o>lHVc2{kuh-pqRsHl|MoD*(kUnZKy+HK1>aeE;{4O2MSV9>k7qZsnZcPXjqSL@akO-p|9hSQ20PCxBQ z?Cvy@9xHf7p-`NqBJ!24I*VZepsxEBQzm_+i}g((t2)!2MMJ$yHStYmwQ9Q?DyV(O z?baS$5UKDHjjyq;HP`M!q~h$}oFk`0n!0Pm?EjS{To_{r-6F+NQ>=`KpCq+Ct2~wn zN?-Ix?&L_yk>wOa{rY!xY)@a2IF;6!t{s$BpAzZ}8DH+-?enc57HPBkzh|BGoA7j& z=OD?b71$Po{$iVFWYoZ7Rp-Jt#&(^cY;f}~oOvTu|Lmjz?df?mb|ql;Pbqnsr zbQ}A#M}0S+J>X|<+||_T@MLFA)B@R)T^Ae!RWTtco>!hz ztjo3E&ygO>cNy#@}EZ}K*UO%P1%;IGeO8sA;TH%1z3n6o(dFH$Gq=Iif z2^|a8PDL!rg}@~UcBGatqN(`>Mf;3gx3IPkT99DEaM}77mMhLY8ZxZ7jXkx(l3k^T z-`OLN-drD2QYwbFp#icR{Ed;gNdIcxWO##?b}R@*3w&r^*+%^l;6yi%;}$v!QQ8G^L=2lG0*gxC@} ze^OBKQ;y#X!a;9i?x+S5KiO8<=U);GZ~eqjyR!dq$!bd?Nvyi|Rn_sa(Aan7%%T!i zy@HRHx~=GW!!6D(-dUg|?A=3F4@WeMVJr|2)%0hobUvcfYm&818vW(ThwHK7YpR+_ zs1X{i!Pfet!nEjeA1|cJquzMKxocW|!vu$uz(rl)4 zVQfDnPTARTKO)z&zqEk!B6L2J@keuME&A){i*90r9VT0N_C&sBeX;Vc_Rn@?!P1>& zJAWK{r?Br??}=Z(PYbvi*j7wAMNQ(2en+_s&d)Q7NC5&+|BVJ~%VH(cg_CK;9{qa{ zP0v3vDCB~jQ~GPCko2C28@Zu5B{d;&=Aje$4Vn+q9c2q;jtf{%hv&k8{Q7Y_i6P1< zUW*3ck8ako4`JlP5FWCC(0Yai)ht)pX0* zFwaYFmt{Gpj}N{0AK(e<2{tXWHNp0hTkUEEWw0lKyfya2*cW1Tlhh)4l<{ktEM(#| zirmRRPb-v^vDRIu0xVkYvs>w39+rQLalebqn8-|NbJxGb#%4a_Qrm$T3)!oAg{D&F81AVl191s(6tiC% za)Uo?-!7kS`*)LK<#hkV+3-rFWKtcHkp0=J{t#j>5Q7%MQ6igKUOU` zdRnt0SY4<2bHpq1=+dG!DSuGyGB;pq)TV>tdf zCyS#nwR0XgZf7;1GU#yKtDW5o@2X#I+tsEiv*1W=Ja9_;}6>C4xxKqA6v|w9V(0cGBvr+YTWEn8Hr19Z6Ccs$?L4x4JWK?%iPyB+1w=QXnB2cY zJ*e9N$$@OVnKD@_y2zW}2OhXTIX}5~1GOrzPC5Ajq{Z{77f^8siW2!(Nu2#);AR&v z(d`{172K>0tINAeB!_lFDWl#9(LVPRDiyJ6D^@V>rx0xeCSH2y=8JzhoR?nBocLg0 z+MCBwPFt2J4Sye4W9YT_8g3RMEH+xSuxsxtiqvgcMi-9N?i1o>tuxw~n2@G|c~Wc9 z@s-@A3S1EXYn_-RVITaA=C>Yv18Cqv)u?wR?bD@2N?wfVq0=C60*q^u!K06kUN+tu zd->l(UBTmpvC@~Xn|pkE{}B#`BKdZFVJ`i&#nXFREaYF+J8?m>)RBKw>^!(42tGD# znSfG$n*xqj{?49TLmN~_0{ysD-)2hDf`93sd!y^qwMF4Yeb25{TcH%=JRsD&EZQI% z06xkEs}#E~%**jg7(Z*wJflK+-l}?QbLUE3tG>0AJh3n5ME=bG41IuXII63xzYIRD zVLT0goX{gwzfbrLLE1ks^fg*0Ep4M1nhVykp)Y#*Iv-uXEu`)1)%{tkVlPYxM-)Lk z7By0rGm+wNSWxl2^{6$7zi`A2sa_;p#wATc-XhBWmEez&CVkKLepdIx*QgC_-RG8% zy=yiraG65?wsL4F@(G|fG8t|PCWARSxoxZD@%xg)_j}$m%~>9Attp$>JaJJIR-YaH zWJ7+)6^Xm+nGWl9@{DJp(8Z~ry|O6bK-0*dt5(;ZSBBs5>#hYI z#l^2XaMtZ<%h$DbPASnQ#&iy)XtcBW0cme){xlM%U9aso?&>S+Ys$Q!`!&FF`MPw! zfB*+gF!i?Bv^I0o{)WuvSlQlNLin~b{Iz_edCwRK=cNnm_q)pDC5{P2n6T=?+{af= zoC(SgTJ+>hP<>F&GWo)IYl*dFw$h_GxX8les(X3Md{=4ait<>&;H2#o|4cmJrA0ts z08ro8fA1fl?EAF6w~Gr5gS;a1bzL0Vjamd)`qPrP##&)Fhh+Fu_Q8{#D%Hz%`@V#} zddb|ob-ummxVp)qO+#vt<5!ToCnB{e!^)w|hQ$jK&b8G9r`V(x?;wk5g}cDZe8!vN z9pBT4iPWOH0+F2wlFo8nVP-{Z`!r1Ux)&&y?|*;8qS^9u1*=ux4)v%1v3t?c+AkZ9 zKAPb?m%8)xh#H+xf4Yf?CIYEgQ4#x=W2z%(^jPhl8iP}Hg zKd^moF{v#?8@XQ$t8<5n-@Ms%V+xg4YVptSy!e-&jNYR; z+e7uVQBVtFMVx-c{h6~;fe|2lvsHKsv5%+~;=>hRrkxryC+gQ{z6-jQ(B{Lj7GGD3 z0+zGQcH$f9UnZiev@=4*mp?$EYS123D@6o1Xd^#u54dTV(d`wVvqi=q5eAFjGgvW* zX1yI;3=9q3iqmb1$%V_h^M^Y;g6~ zcU`Nl`x>MoadUi)&8fsJVU2UDsBbqv96S&8Hl~X=r>+T8H&OBKcl^sw`GQMM-~2B( zSrkxkzQ$?M1dZ-@#@)a{A*j ztj@7w5T-^Bs~t#P07tWq9`@T{lj75&Ox82tx*D!WXi>XULz5blglFZ) z6rQU_GMnF+S6zPkha5*5*gX~tewiH=6zl{+q2X#cB_4uNdZE>!VH}4V`9Fz|!tWQe zUXV2Ipk1wnm_YA>qFO%@d{2QphV~=zSExLp3n`u~Q^Z_)5S&t_EZ=$TIYvxfJftCQ zFlGxbq`jMQp7-7l(=Ie>1nl_4r$N6eSnbMK^kknjk4eiZ`S@AQBtHApkc#Izdq2l# zq2h))Mh8U6x6p^4mlZ7`gqC}N(C0M|Ep?X`#$IO+b3?<| zk?H_km&^KmIyOEEuufksvhKr8@*&ZU%krSwEx&}123v|ykwu0DflqYaxaIzGZk5NE zb&tlsUy9%KE&)lN*frfn2>gYdXe?@$hkLE=C{6_J+J2wdRwUA~ANoP6-=wgfCOI}3 zhW)}^G99N@U}UCWriUG|c1`%CLEhn~d$)Jvfy5)TGiOaM2`n2lnZb9-($z{*vzym? z&bVMbO*u%w&Yd%Dm2G`pkWtP*C*`Kod-ra8K53d$Yu)b)Hoaf{orNqk_y2zX*y!jV z|Gd}oSVVrvw9=6Lf=<)E#)N|f=2hp7Axey&4Z=@gusbSWZ?$knchtePS7yw&^<3C; zWroq5#m4gkmsz`7yISUJ>g55}ns#ID(tOQd56m$Zle?y%oEg>&5A#QL^12D^t@bNt zm(Kofo?Vh%arvfWY1WI^{DZ!XSk$EXE2}DtPS*C%o+D@>^$3Aw_uffpN-~uts1h_; zWwQ=fDJRz;zv=IPBp8pFlw%|HNkc(@vWfF<$5|0hyAQN!zI>pf( zf_vYbw5~-_hH1rnsyBXFe|2=}ZRT|s>q2~6mJ9-6K}~`NfT{+T0<-(-_UzMb*3iPJ zJi}ca8+RGztfOBal00tsx_6Yo$0lnBY2IQ+K6SK=a&c%wg(En%adh*c%hnO>hykPt zGKv3oy_5afjt_J3_QM^k;W0!ySFiGqK0F!U#DjszBNIs@XxwV|F#lOr$&lUc7I#QGM&= z=i_5zKL{78lTe=$=w_KQH&vaezu9)SUf5VxmmpCOGr0{3xa~@DpH+mDvFf^(6B5OThayRFeIfS`Dom&u@3~9mOb8yYf{)Bbi59? zFoP$1XZip(sIeA3t-Q<%2b-z$?L0ESZCDu@hPC`24vwkRLeV|ANqE6Cc;9@bB3O1D z+L*vo$rVr`e*WAKdpv)cd1`Sxsz0xVtW%igqlUzV15&R6=I%1 zg>9nFl=XcYkQBTOnv7}lp_GocEpSO*V~a$&*a#4+){+;Khu1n@LvQ(%Si)p)^lEWr zc##F`{nUv8tdyu}#PLf^_zWsfu7y|?l2!lpGkaz}HtxS$*XmZ%v4Sywm8bU`zofIn zh7H7biXz=)f?;j3r5t=UwtKy5iEUd(??Xl97>;5Z;j}VWjF;)uIK;Vsn^mszxpFb! z?9g#6{yIhFvc651zJskabT&o1p_K1VI&|`UFif-$17d|*VwR0mr&*(3h@+Q?$RVLc zb7ff>>v+bk7CoO#d_eVE3g<1YSqbEI~MiL6Q(*) z_+NH8=NEcs;zgJVLu-n3Yxl<_jLEQY)qM3uReyibRQJ5aHiOpf{pNwqOBAsd(hI82 zN1HOrp~~8#m^;$Fp+2ebs%aa)p-}bK1x4$=0Z0`FHPklxnt<}O$kc6*e_U@;Q=3?N zen^v&Z^9h=R+(_g6x11~9Pw>h8jP{hgQ=_A#0r^D`mu2ogD=7RQhi$?!4{&cj`>m+ zYawP;D}Vm2F8kXr_z=6rR+2;*{}2$45)^Ts2k`A#<}pyR{zMJ2)E zY~+F;c%Br%>=}@;vLzWWdjNCRk8a71|qck<%Q1oHtnAQVN_kuZocDV z%?(wx&>##v_LB)CZ8d3PzV1?K>9J7I2oO2*iRgwgR(3yFA^E6YlOZ?|^C1&|-8)pQ z3@+l6G8c<$q`zdaPR{ddyerwu)BW=DbqO1;JX)_lsYIo(4|Q;faI-A&#cuF~ooVyh zCssJ=iaiz7pb$p`B=94Lt5Dt#O^!bl>*M&T(Ov>vA^DJXKM=;Ksah}HNu)&p@AQ;n z1(aRI0XC9FhMCMS7kO0>?EeXK0-`AxusmAu%)Y1YcRie{f}srmV?3y7_dNxC+~TM5 zGy^7>J_QC?+gVG&3}z>M*5(jxCgkMtw(MO2q5ua->i0d!o`!_?a#pR z&SZWB_72gw4tIUpVH;rvAG8q1M3qAp6eox}rn301xAL&~bvt~}K*JL!mz!wV*#jVM zN?L|(PBRwI&hK+NTR6`+ISS#1;VrFaCLqDu{`4!AiJj?rkRsLM6Z;fIuR+X`AAtZG7O4@ z`z}FHW5&LJL~GTtv9qp~)eY$kmkr&RDE8Bgr3|t{GDtC79E1xa;kd%QA7&2s2Xb`6 zfugGRwzllH4mUPmksI_Y1sz=0k1!5(50_(yVxUfsn?DQ3)1$|iE$d`OYtP!d1COfv z&iy{q{7<^$2~&AwxNyDUAuZ1xPDg>XH*Q29<8P%fZI03W)pV)j@(A}5-CFq~jQV|C zUDq61)A4D;0o_{3JK0Mj++;2h*9ZiM-|H-m(0f9ntG2T9w0K(+=9(@N*)_=TcIZYi zKMPwl?3q()vn#%xrCiB+ozX>n8O|CHrVcA}C%?Wa3a_L9q z5qj82@Q<|e@xJUOlL?%lglwN&Ee?w&vwGaOJ1mdw#r9;6ZhOv4-|=cubVFFsE#?_3 z{JIu-2=i%gxff~DudwfAM{oLInGHTY1L?H=I5Jg?oa=1qFrN&BOGKf4SHBVr?#*9R zet!>!6c02QEr$V~uRL(VP_{3u(+oEIh5H-JM(9uls^>40?>7iXr26w5@f_EZj$I<< zPrS}PIoyP^?c!^kuAm_th;wu*iF}L{!9o^sms(kH>iQq8tu%*N?Dqy-TFN0~SbJ@y zC$69>onOsuN4}%2suOP55J??oia1Q(w9VNi_LZrY2>;NTVx54jhxp(LU{jr}g;@fr zuQt@As}Z0C4_4l(XwXv&s~U+vybrOX_Ti?Z3u;7G6v9PtRo;m3ww_llaZv0|GB%L% zP^ob)C?|U`An#8nId>0sC(M+xpT_RJ0=^sTfnF1$F%eT#o{mu%b!IFw?a#a~cC;9S z<*BRY&-h$*2Df%11Zn z2@2ZNHyk3!4=Ww7`}#8XHjr3B0ZRIQ`iY(89Jk!PEJ|d&x3H%bL-LDb8AIV}7NMN$ zzVYaN3O5G>N3h-)8*Z#R&Cvs~!b}k70G7F?0$2`(^hJF6`eODhib#YhbO%eIE_-+B z#&f*AT|N4{cB%$gS$2iaMRh!?@}g5>xNO9u@7$>}C0i-q&lJH3y{|b~?t`DcxFNLU zhGLa(4~VbShUV#8S!-z+pNUFuz29U zf<-qs%zw|>qsrAjE5>5pUA%8^gHgp@%2}EUSibx$6>)|qg>qq$%&_lQ8Cu^EgqQw7 zvAc<2D)PdAQBlIZvu{oSD|*;)bxq2?%^@WwN&brXno!i8AEg$5KE7M{pQEomeeeq0?=N*Aa|o~r9-mA z7V3LZ5i2?YqU-f{<@Gwg*3jZYeZ?8hi>F5mEBYzwWh*+M$z{WAN0_(gig7IuT*%_G z`lB;B^`_oknJ=-6Ks;3Hc;hl%SGsD6!Yw^RmrfYkp54avsO>7QZ3^)KAGdgQwrj#7 zUL5I6#!RS&EA_^V0i+-KC>R0bWWDLiv#T2l#s@-+O8y}ijgDSAhk(eS|h)Ftzz zZy$(Jto6M2N^~c>xzHt=)0-@oR{ppAXM0VG@7buump(X|aipGf;$dAArXK0dJ|lKL z9&?>$?doyOYpqepwCg90)uE*euc+iZnv&cdT_O(XT^%KJq$?j>dv-%-H*)IW_v*40 zH+s)Oz@@_5WzYd$@5)y2*&B5QqS>)PKwy9<&~LC+js7D)(wu$4#PZAVtWUGdF(u%r zh}s({X#b>psp~~>$DVugj5wP#&eILyko$jE8nr9pv3{ho{h)!VRx}3S^SndbRnyQk z_h)_rl1V7=f}pB_g=!!oGkUd`wFmepYGM*d5|hV-Q2J?L-nhIZXgMt^@=2jVAsvWL zxk0nOZt;`N>iVx~q=VGYh6*=JL2Sc4G#3z7C3hep=xR0fs0SjQq~FxxE={11)~)is zv*Oxt$nFs5dJQzQwy|B~yL0T~=Y>1YvR+~*Tj-I&MU(RAB|?m=n%J4Py2I~S&#PYE z>!K4gx#_>>G-APRp2;3h9>Q_ijc!-L+1*^#^Kx)5ax9W5xWP`_czqPid7 zVQP?hoEObUB@22D3I(CM*JgsR-j8Rw5qA2NuWdqJp#qesAk+#7L%d_dULfuxv2!%< zE!?U5^{&RL?gn}=-daM}8ZOv1p@?{Qw6OHuksu`yT_KDU3SM#Pg^JGm4E&B>E?QCiZmtoc@B_!~J|Fgi?XSPj8dWIZp*h%8VnA_OegSiZ z&>Y-_g^wuUk$wOH=V{60&s)ELYw&*EhO$VZg|qO0$tgj|(Ig_YOl<3Ac_>3D;RL<4 zS!_^a>5g;oJt0M%`;vIUej2G(cZ5*9(riJRuhV23J z&0IOH=l)mVv0v>ax=WGzVHk$zEEj#PDj~&mw8qX0?sx&dO?+cHIBp;|O3h7G5@Dl( zIFSLSr(+rWxc_9-zh#BAQGwH?op)#!9}x>^;N%Mxd9a!u3l;^1^(Dk;mhd1 zVX2B4%dSZxceQ^78hWpwG>`r9mC6f2DQWU6!eBuBk(|CHV^A;+%lZb3Yr+3wa;N~I zYG?LtJr)5uk8S2%(h%A{;PlIBoe_@3CAf#vmRjrR`x3ATP3ofB1-bk?C(rWW-^@* zZG>8M`e4TP+K0s}D(!Y4VU^hWaE)xNm6zRUyB<}W&UgN8GN!O`h5y-+pn}n=KTb}5 z`j6@7ymNCtmIqCp=I`{(iRZ8S?P9sLp&CLF1RT^AmJ*njY8p;SMtBwUe{-~a+-_1_ zz2@}}SD*@KLm9P0lzXo`B1}d z1ZvP71TBN60__#>q!&Pan}bZqpCiHw`cCS^c@px#=k@0~n}T*C-uzKiOztXMUiZxY zBMIrtTKFi>!|o1O-=M(}RhwbCf#Od04fGNKXMdmZ*svJmOdWawaXO>UczUO^P=HOO zKAGzhju?z1dL-YZZ&x@}bi}QFe3Z`6@Yf-R0UNMM&daa??T#Ci;4=X(hK&zFY&tQn zIVcp)WT2s>3(Y^+y9ngWbh9xkGm0V^Itvyq8f1JR1*~Hee+*K7yfYh-NWYM_Qt2|D z0-_cZ!Irw#?)sHzsuPc<)ALW0N}v$3&NEcKh?e6^_03{C6>F=u(QkOJ-M_MTUt>XG zpZkqoZvW)}4Q2(5ILG5XJ|)L4!5RIz&%Gh{?HT>T6THSNnApQwKfXoB#sJpSp_=$S zXL){#2ZX9SB+vK;jlLmiCX!yoXyEF^Y_=K;#|iVJ8NL1UdiK6W(IW8Lg=9Q7BI8hh zn=+jBGNLw@e9AQ#FV*!Pw^JfHji*)bTffc0Wp3au)e;aau^t&uZ^$2CNW?y*1La7Duv=#`ceE2CDi)6@i-1^G|)qG`FBkNuK zUu$loc1SIDy0jU2GsAlaDV=UTiYnqY|A3k51pty}@wSm0xMrD2(pRoI>uxQ?$FT1s zLX^LYBMXX;@c_Tc#1UAvuIrq8kMs^%o)gGN{pdy3rlzKjy(>1h3(?rI&^lx7ayWqS zT7pu_e5(n?^Znn~rl^i+AzKS5qSsRTW%`ToXI(BqyJf_;7`)PsLjfyc>$Ho}~;_~wD*x23g8qqOB(Jl9Fq*%Ms zErkESRQDz3zFaktg!*>4s{dwj9#sn#7*Sys5q(okrOCV4)XM%fgmbTajULwcCg-4wp}itt@1ls zE3Lp;hHV)B#?~Xw!=8@PFN4?tVF1Pj-thu|A*lal`-oCbx0m-4kNI1xRSP{#^SeC=~5Wr}BKU%v*nW}(M(R4Li*kfmVJ6_)^koZ8d zi!WjF6kKSc+lB0%wG!*t4Y3&QydM1>IB(V_M^QaEEVuMkJbA$|>icLK>N3q zLUg?WaCU^BgCu{#?THw+qXD(1y01`Wd${^$+&6jL>Mq<)2;hlgPw(I|Hl~Dl$P%LS zhw8g4bYG-T1J@+DIG~7#WNaSc=8BedOEAO*#QtJnE?U$QU0eY+dRB$G)ph#Ri6vY> zVV=jDS9T6p-gQn)jcL>*C5Uyt&&L!yKhZKVQZI}Lu*_J*EmijQB^wt~0h}jxB%6$? z6EH7W&*}a!smKhO^FYFgOQl)PY1=hg%X!siEcZLhG-|xgxCWB20AXfL4F{bQt~fcR zK$a){+(%r+l^jlu&KQP#l)WWUGyl7|Vzcms&54?JLNt^vWD+3EZjNTqGbSQ6 zhtlRLjy@!pFVKWhBMeuGSM>EPseOcg`-mZyda_paY<5ZZa7h@`6gBMRpt?Y|F*Xy-LJv8OIm277$%@I5Xzd9><=QXh2^RAXiH)m8we}-NW zLy8l2;orq+#CHxu*Ql_N+9C>=Aw4200$4zR+&p67K$Im|>G40w+96bOhK6eRJdF3gI4%O86Z`+vPj(JoSqwKX&=c{;gGW3Ao*(NtKsK?pFa%KIx zmN)mr+0e77vp(&B2q`cdsa46I4B8!rt{_1liK$8JLB_AU9ZYMly3c&hZ8qLGI$)n0 zL1I`4vA11BEIJaKcAS4b6&-OaIOMs0hB>R$n*I_K2sjLlcvLIkpi)5PlwN*$ z5gxV+RNt}@=j!JaA^=5QUtLsrMhELYQ~%$hp8wi;PgQr7h1QgiWX|-ni`=utXzJV& zatMRTA_hr& zB$^+uU?60XFR55R^5U$t3vjB)G!TaLT~~V(L&G{$n1NM_&Khufs~rYrLeA}r8PIx% zZypI%?SSpJnbl6?-++Z;jb|_mvOP={husl(U-UF>2b^<2nBqglbW$pYtLgP}Oxzsy z?jeKe{ve~p-r)6%Q9<{)cETOqrO2gN*5Z%0Z#*^H|7c0?XDUT`*OogS=7-nRbEys- zIv*x+A3m3{m2>*-$J89VHQRS2aX zk@kHXsZVE%Uafx{hn@X@6=QJ0y$B6ssP4R7ejS3%)2kvi(icW9x2!ePttE^g{|0Wt zN&wltsLsFQ?z~Cg%7{5r0kTxp;e&NijK3!3m?VZ5Ry(vJ{tds^Sou|ZK5=ZL8)W|= z)p3!@DX(k^7L}p}*rIQx_F&s-GTR`Q2-pNxo`tl0qEd{Od3YSgHEPfQWvKFrZG}}3 z)+xhiLrt0IGzungdJLh2@TCW~{}jHybl;1p+-&u&_25G1HfobEkbjRaskV z=lc_;5b5|4uohMpC|^l6eP;hW0xb*mGUk@dKfF`L%$5571?QoU)sw$Htl0W=k|Y+8 zTOEe^O>XloEou1rnUY97vi7}kif@g17N96tPZ$pVSF>O+%oO-=t1-ARHAbO>odHIo zU}gm-FGR&1%P{;EHv{YD<#u0T5y{@;h7DigXF(Nyzv${)c~C7k1nX_(%M6Ebc<4ai zPj7j99|!Zeec4?$$~m&$XM=D{thADhhx_kqtfGAfLD#-WM9ZCmfgoEK)~a^{k(PsI z^Vzrei}hyIPizUoYz?r%7Dq18;EJuZD&grQ79Uc0ugI}gv0UX^y>4T%kd}LA4wmId zhH!q8Ls^6*aHI4%o4h-xsNY#S53A&D-khMEo@rPq^!t1o7_@ei+Phd8+7Qw|6iey2 zb+3omvPK0l%9N0?FCm+SMv8R-=I%{3k|WmToHbI$E!Bbgq++TmR+&>a*q2;eeC?EJ z1->QPuEfW08+J+yh3E!Iy7R^7aDFM`F%UXDn)vMCV{ybK(2^ zME#bB2XwcUpktZS1m1VsyvL=)2)0Z_*j(8>%0SbTeq0TaJoVdE+o#nG*$4{_mX+~b z-5<=#m3vKPuu&2_!PZAvWprhBRc-bhvbjLPA!cRP=NA+|bfH=jJ1>~zaTiu8rm1p& z(%&Q=83stiH;Nke%llYdq;dPZHXZzknkHvH@%H&ko3UgPF@685sNXL|8r)+DJG&j@ z0}Ml3IuJ`-`W=_|m_Km;Qw9kKjf%k4`S3fcr}bv4CPW2zeed<3;8YEoOX%4mMfEXGkH#ySn!MhoXP&IhmJS7# zJjMbNH);F=2h+!IHKGR-q#FHaX1ATWJpD(a)EKl~e#r}86bh4Lxz+fUX~JqGE*2LD z;^ws-lN64KG`r!-JqLe>P!QfI0Ep3*HXgi%!*M}CJ?gPCN`hLV-5@CsFoG*A@MeLC z-I9}9rb=J9^|UKyz~iW%Co||)^Zu$ivVhOZ(D36wrzkf-k}@3+Sd*K6Coebitr>GE zT=G68?G%^v=bahCSTFB0#_h{{o)i4FaEhrSF^6%N8B1LaXFJb_3mF?ubfKIV1iYue9=9KF3 zqwXb82RXxuef|CSBm7=2SW%vr_iP54qkflJ8ZAR7#7xQ?Hrcq82!e$tPHwM`A%QV-z8 zpcRHvm{2}H5Vz|VUKq%UQ&nwS&i>3t$9y5f70ZS5Mt`e4O_d-u~-K?Z{JN@Or%*u``R68{;HYF6S9d?&Vz z9KNWV{BLx7)Qa2x7aTUzt!Jfq4;!7uQ{`lsN@am|{^d4}1#6t~osAK-@JD)32BtalK?c~ ze3%u+5#z8+8|1Uq8|Fi(+OjybD3A{A7;v z`RJ`c;$h~<+!P|ek|I5CfY?)lR)g;rnREA-2%R)&IQ+eK&>&B$wn{iU;z&}ld;}in zrAm0OW+RIHCkj;^D+*=gp;(J7--vv`+4_}NN3F;eRJyQs_TS@nw}O^!f(`z} z(&dA3K->?mYLE2eH^%*jNE}`?S6s=)p@%bwU21u~xb6JX0oDYRC{1*4QQuGZVl6TX zvD8}J;+s7yLd`lx-#x+Vz|9FU_h4)>tL`NuiT&pj?w2L$hqUfFYPUH+WSV#+Vg`7R_Z{xjiq<*E=fruELXChrf$)J9zhOty9r zVMTe_8_Vq@Ws+F2kP~G$|EA>F?N9UnPlIMTVi%=yWa+igrh+PEsB=?Nb~E0=KY+2>C zRg$R&HI6OQrAziBF`7IIxG`otqe*i8-EQ`e((!yu%&o>S<*GHxE*Ff9az5M z9HE@EM$a%wIypIUrokAJn=#SaA$J2N9E+7PAY9S_i8M_1) z&ADi1qQ`;xB&x`pI>5JHb8(sv-5|&kSOYa){n3_opUfL8N^BIi9!^qI=ao0i&*9QU z{%}uwvukhMeR=)YlS^k=99e$7vU^7Ow*1F|r`NSU`}U!}*<1fRzWt4lUtK%;`FXxK z!$=5V(Sm~me-%_Pq9|UV!y#de3_pZO!M<5o$=+R7hi6H{W&01=0CE$JxgI-kO3tK! z#O%pSCm)DIRcuimDz@H>dTiJQhhpZCyB(0?_DBq9A-+m>?nM`)$5(EsZz(X7U8`l% zA+R0Wnp;oJ$An+waXY*e36D}2Pb7yj(tjr6N-?FPP#q?RL2U+tEGEb$h9A|_ z`#ld_=EHoG`AMa)$h4>$qf{fg@1!wds zyYJ#wJGc^32I789TR@T+Y~zZUvfyR^vms%Jz*Kbae|-^tH}>#O)KXn1;jKc1y|0e; z_3pZxd91TR|Gse-W@oS+W(o7)*Gf+gY1+%`HL3WjFPLY053U8QCmSrW%lZD=bcSK| zQ1&zN&TccU-jPsP8cIxKfK>^{Qgh<*C!cQln6}-s+e<~=~(D=g@x(g-lVwq4nvVG#mO<1n-qWci}mNr zsY{3NQN}1_j_zjbx=uA8shxsF&}KF5b%FjxN%dGLhLmrgYGxcSnY(NrJM0G1NAzMv zJuTIM-_f4zbMxCKmecDoN)s^yZkG5w;AXY*0)rPi{D9ZE% zvp|$Vu&9Wmm-$s((Y5|Zf8ff zAB|9F6%vnh?^3sAs3x)oSR6j07oqh9jF9mvYp6c4Xm?FA-1>+NL~jt)qIGzgiH9VS z8tBDSs`ur%UjBf6VUXL_4uoi3zY;Lo(pRFJJHwi=XoCg`&I=vqGk~0HwX7qmk_QVe zEZDYaD6+e`{?YCS?Ai}xlykEjwRzMQuwAI(sv!qt+vbu4+9J+mm*Ry-#r8YlbQ zZMXAX-DuJkDqG;CxFRJJ&q6Q<`ad!F-nvS*IyEN2qxm@Iy;O(0HFz+vGmIgHV8IGJ z`FqJ+pdY2L^pK4|Y&0nb!t&-`GqYdAwMcLqhBCZB3MoV(sB~pXo#R8{7V?Sn+Nnaw zeDd*D-DlkkBP?Vs4uW(nks7>mCi;R>W=f}iH1x5SeYaco)sDCMt!7FOk61Lq%VP~Q z9Nh02$USiXB}32=DSu4NqB;P|NJC<(XMhr*bIy~Rjno(8!pd0pOp!2DNabA1z z!OMB~j#2P2PEwx}`iZR{HfXLf;A%NqckZe+easCgN)9-uK)LBcK;fh6G&F1uzC)A0 zUCw*hHDsGoD1<82rG}~KOVSeE&G1X!aQJq^_Tzjg;S4^Frb>Wm4x^v>=)7u=`7`-I zh>>CqoI+@cVV_FV2<+vmTUK%*RHi$pKuYW|-zvCwTvwrjDIU6%wo-xZKGim~y4^J= z5(|{)6a7Yax0%+mLx8F4?Pu>iX4el2oibKP%4Cm09$IwQ{uOrT|8W6QM&uOf{-6lt z0vJ=ewU>DOfvmsP$MGY*yaQHM9;D%LLV6B#=#QsiroW(l*ygmC{`@&x`sPtQRrf@M zs_#Mtxe|S)SlQ(i)KnM3tU1~28C>X16{*ndUr~G>N->-b&;wdK^sK`6@IeWPN3~|D zETWX{7H%wae&AkfQ?jC`uU7dvx=bz$4966p4Iq9o3#g6*#|wnwL3MV=PqFC|S{s+T zR^g0#5o1p1X|)vkKIi-*pz!Mtz1=hZ&lq6cqz@2|^zeEoaZz23iE zxd?v^Nf1kZzhFfqD++?Ax=RP`COti)t2THc#O!Q(Fw5GAxlry7Xk(dJkwx6ORcBlX zo7{M_=CMpTx_iXa6W-}n8wlU&(fO>TWueIe+}njmxy0h}#oSor%g0$kzq_g|xm-Dt z66TE0O{J|Pi;P55%F$fvfdEX*aRMm|`4tng!4*0TD;%zcva>*4CrVRcKqtiL%#qUU z=r4q|U{A5cNlJu!15ya>rYL(vpTWPoAf5u#^#OE>**AVxc;pz=9z#!C7w zr%?s3Qf#N~V2M%2h~Xu0=kWkT&at>2S=)a!s_e}`9Ag4ZeI2ru@UzE39IB}RzAU8I zUlc{^D$b>q!myo!$$*%$RSG)7L}a5e?uZL&YJ-c4+s4mQPoaWaF4Zme^xmag+2JOn zr0Ez4Ul}#->K7DsK|;}skU*FtzzS49%=d-~48brps=1V7$^&hJ&?tU@uVBG4n2?Hm zqjS!2OJ4>V(b=OPEC10i7R?Scw~=H)c1!zH^rHSPLFz?Vu5DZt2$zlUiG*v82R?tf z%jCks>72f;Tr$7%KsaNwlVcZ$VsT?JOsWOBN_5Zd&Gi^Q`N5B(V(jC9hsi*`2H#=5(13b{@#{m0j7} zIt~fGFAwe9HLvHHrDwV-Zh);-tdl1)u1Aoc!9q%Y`^F(b;}X18s2wPFGH|AiC-FR8 zhf_lO>e05e6Qv;?(O-)b5sA4Lt6=#mfr!J26@8R|?*IW{_%V)Qt*}7%Gw5)oI~D5$ zK*J{w%YA+XyIeM8xGJm<2g^*`%sl*ev%jfg1eico&M+O@37B2y- zQqYN29_iR=0(UDz!xFP}d6WPBvLg9dg)jzYm?_lXqKu{|61Ja!k`vp8<$zxtfYC5f zp68T1{BC!9uaSUC9Sjt=^rt|IFgq4b;K@%h4%WbF#iMFyKpSp|o8)y2Ja3--`STdf z5&2ADmJU<-g#1DA>z-)cQDhFFK1R`?7ccq$x<_Yk?}{?)Oy@phOs}L>D20f|5#6p@6gv6r;y8H1Tqm;d3U}P z+j7bbDjy)M!)151p7KPzMwOx1qhTH)t?sJn>3nN2Hr_mf1)?0fz%7^F(0OvFe4acr z_pnsB$&0qRF(gHEP9Fx1jP3JULB{NRC?F9c3UQAu98We={i|KmbcG$$IDn`Kmwd7~ zeU5czG)gY4#TVJ+HT!kcL4Biqop^6(NI1*hjf<7cvi?$@kLgBZ{neS(zkAcR{~XE` zh^4}qM#!%D8H*ejqCH|$t+f4DxbyDq;F&QtzA-24G~wEpb&K=1tI}yz$bzf4&Unm z|0SNKaXp#iQHL2CX!8x{4l2Rz)%8j8Di)GDpeMLfq=fMpfB#31ZB1q7 zb9ukd`<&N#o!6^_z?UGx*dj($f-d!Pk@nCO+Vd7ARV7OciMeh~NrnXOUQPeN043x6 zLwkQR-9GErmUhZGuvloC%(%#8fy~x?%GJ$iEq0zfp>4{ZeVxC&79)wSvcJTw8Y_V2vvNgv{A%I3Znc9lkFfe7`WiB66g9iVc9Pa1?wqx{?6;KreIS@X zGf~^n`vN9D-*=+!M;&cxW6=Cpu5{MP*ca!8Ep*m1!s#W6+FW6yt$j3LY|$5|ccGa% z!eTptx^@I_9N@6zMU-3)n9c~FSHOH1Ct9bA$TlIPa~#oO<2Ph(V1{IF@pg65x~r+E z9vXIE{sN;n2J*b}q;^ZTnyQRya3{QqMJ1S)d7rY0Rm4rew^B>ohk@P6c{ zZN+3<0uDbGW5CHow02Cu^i03DFuqzvtptuq&K<@%bW1u!->&9kNn}p-r48xKztHJk z7k%!cFQMd@Q|n7}G|J$eA5JvBKKf?I3P1L-UNAam#p$AWWVUDgPWa+w!6;3;1K_FY z{oY+f*DXdzgj6o$!TXxdoVT|8vpuFta%?JT?7LWpup*@gDlnYLkS%(Yc~Q&D24Dw6 zd$uXN|4PjN*_HXYwIa^@=!KH>&@`3ty^m&wp6fv=9{3H|^S0`6U04LeBgTc{y7@9yO)#Qt5eHW} z5@ZNW`Vf@tT)LwY+$OXFxZW85z|Km_K18Stb|Q{I!e->pf$fjqA30NW_Dc;5yy%NW zUKp#~D7M}4Ey?6tHQUlB8X@hy<1nKmLs3tU6z^O|^>oF7hk0)nE8`r@4wUfuHXlBU zb6k#VfrK}@oaS<*h(KR+*4Eti6CVwnUov%y^Kn`Jh3%iRD@cT}q%_Z7x7ucLNzaF*ksKHeG3!I*0L_uvlMF{v?u zFYc;Xlwva%V=y`W!xL=BD;mV{`XlJC_|F_|Q%gIjv-yfX${PwZ7o0OaL}wZSL2>6# zrkMsA@D*ip6xc?&sSD!oRMoW5U5j9U!X?wz3l`}cRhM4qVGPf!9WEYX5 zoOvqhd5FCK5t{ey9TkN&ux_o(;WbcI5SK)GpfO+7e$oOV+K_(X_c$NG4Ma}XB4$MW z7U#Yb7<|ewkqnL#Ebq@q3bJ`_P-{J*U^In(DA*2bJl2re;D>x-Le~?}>!@BogaLOU4@a=DM#- z99AA)wfaa=?f==7d7Y`7hfPDmq^>bdba~FA`3&vwFkRp+hr@LFYjpaNa*$WDM{jDD zC#Bp?;Ef&0bpqBKU-o$*)6!3J(%y>D*_72f9+0UDNm@uP_NX}L$gMS@hqiVmWA;G~ zq*$foZw@_OxW+_lCQmg1&n0*fjqMq|!|m0}l-bNCztl9&$DDUQ#=Lnd(S2N%d9Llx zyVJE;2du?$&V0!^Ul^kF=%3nO=Sz#9)XVng^R9KJAOjZVbJz^PZWM49+Wo-u3C^2; z`FnyE#!s&5ZMzLKV9ITTxj0k&eZFba?Q!sx93N)O4eGWuKDqsT$l|xZv65JNNr$XiJ_#OTcO^1u@UYQi3sf$a^`@9; zwr(`kxE8KQg#i)eXp-PcD%X0>qVw6dYH(OhGikUiI6%=tLJF!X@PH1 z;q2uzw64QL?NMO&`&&)!tt}1n^V>@e(L;NP^kI3AV7hH=(olC(Nc}MGHt=+(S~WkGDtl4TB2m#1ev_Z|b90Bk`1f?cZU`ku7F0t9rzlNoKb8olDH10{tI{VupX~#oQ8w3y33$b<{yqv{L(=`o$p!Xt>+ zT%k+O8budr;GkwCWDpV?n6yEYwWjY=nPGumJxZNRma~pT=XUw9({W*4r4{jviS_6G zaVCx4cxU=L?J>FlYj7CkhX)sb=zumb9SR;9#Q#)Sx!9Pkd$y%aReUSLC!xI6Vk-Aa zL-6L6f>^MDqLrS2sjiwPC(9WxGk^6oRjnQCRF8``j%Dk+6~6a3TteI z))aA0ghg~gw=p#tR`)~%D)XmiMf=8uW&O34RyQ*t*B%p^zL9j47sBbLKHs%ODZlTX z-2YVnc?!{PCgC0K6ayqfR~N+5!pEg==+_kd+xMu+@cBK{WqlKXS@K2bnLbhA*ta2Y zo--#%O9<*$Q!NvI%i-xF1z`VZruoVjKeimdiOBGSWie36;0oDVHdyO3n%>UD(wLdH zMfIb51t+d8MAMP!IvnQ`?pY>R@$em4Ryc*gH>RZ0iC;0!Q+xVQUupo#@9+*Jxm>2~ zmE7E}OZv{F+4Oo4v*1<%kY9Ul6sbI$cSssc(y*46{i;3tyQdF6HZLX9q4n|X+sC)5 znw!TwjVsF4R9;g33<7oVhPBR~JBvaO9@ywA3hd%``d8F*_*%Y*RvgZRF{ej9y#Mfb zKbLBnm|7tb$-E@`;=JqZPt1EW9aw)$z0evWtFFWjt9daw0mH~AofYT|{H7~h@@W?- z!Y{TJQQ=hNC1`!q=%=4(j^uBmG(_Gi%&Il#Z0)q4lJ?YNJ9m9$cSJrQvfj&1ovWIt zE~ONrc$2GY#o6L*efy*WJDa*uZteRIg!#~_P5NH!@%C0hM8{GmF3EId0nOp@%2Xe! z3J$De=Do5L6*!o)U?4jvUhHgIXSNsCl#XD6;Y)NJ1pI|S1dLL4<+q&IcTz1i>31Z@;gqV zn>2U?OLa&RLTv@!vZS4sLDyY~9IhRywlR_}OK(b^&0)CYLh2WiL+kl9-Nz!_3siY3 zSS2$PsbQ(BL&khVa!@AhiMIGI+l={?}uWjfQg##%p#hLkX1c#H3#Ys z5*~@XwST32pI4)fKXan9HY3IW=>fKXkJlLw1dTRu>{J=+M@q*(TV0iYjWsnx%;*MI zb3x;Hj)YaA-(9fac`qEQ)Q9_EYqUD!IRLl5Sm2d4qd7TWi^1#|aN9F@VfG7Bbh99s z+!4PR>k8FrSpbX*&^0h-dXRmYzabC=?Fmm1IH~N^Fr49xm8Z%$7Mg3et&fw2`l;^y zGAV+2wf`5cr(rWSx}vY3*!iP)i3?X~f=%4`$$Jl2g|!^8atkS_5iBgz!HWeT{TT;s ze0!R`BFQWnCqC0|XVD-_r04-M*h&x+cN?IidN6Prm#Qx`*S;XJ+A?`ZuvfIu?<^A& zk-syOEN_mpI8qnZd%39f_CSVB+~8~mF`Qj2(`B!(BsFqX`!ep$;-`QWaTMx)A{Nv3 z2%L#B!W`{H5{wqXgJ+u<5AOB2lDWZ`gPkxXLuM0k(*!=kX*>SrTVHQ)$Bc&vuRf0j zvy|+-E?zr=7P1F-7qlng$FzK{2TJZk!rz-rrAIm=vVwMl&p=P7NaG}U)FTPvT{w{<=o zJX#klv$OoLPd^vFA+WNN4i41NOD`uw&}6KSsJu_6=G#d&^|y-Ok$k zwMRz95puS8P-W=d8VZ-$WeE=X=%0}O55)^z^KuVhx9ICV8&MvfZ@o6=Wo!FA*u5hu z{#b4*GuI~yqi$w@^B|9&;*jVIgp6MmRNRDK< z!tB~Fc&ap^ENwZ0>?-6j#LT|a_J)O(U)~xIme7V)b|a!WSVjZl0Y+u?&TP78RTOoh zvi(ND%{PC!R8Ibub=;CZAW{RFs-u${F4iWn{E^eW&>AdrWb{F0>QBoFb%!8wX89q> zO8+Je3qdDKyp;KYCm9seYE2*LvFN6J_bkgi-f3KLIrGNKVcOZ7D>}x|yR!gBve8ee zM$2)x>Py?Y{ir)wv}$M*zJOkx?b$0djZWCnMvEoTeBIWSK#s$6EWzAMxSl_K-naDT zMca>^&6Y_MqccloJ3BE(;Dm#Xj*16Q?!~}z%^@fC7qEXxpzx90M(}2S=Uf{qizukZ6sQ$Vh-h#`%^v^HzSiJ*{b!Gi(JHn|eK&#vl=w2iDQarL{PPw+|PUmZ+HR3S&_`6N0amOXtycPv4bpm z4txa}{efFApH5`Y8R#8O?4)ON6{UE5V}O?vIS35Z=AD1MBQlH|wnkX5xxd$Ocd#ym z!M?iA)|QD_5cfGaf{_`*y1nPR)EVk)KTY2&caRRZxY?jUJ||LHv#y#Mt(=xHv1A#iq9SVY?$NHnrV?5|f_o`8QtMV4RZL z7s!x|ye#F~gUK7ibWCTIsJf0L2z)R7%dwgvjdM^qMMqK#cwXlpKa{4fguR#i74I=R zz5aBS=}Ic>^`E_8dy59HHXt;-Wlqz*u$6^yViI8Lhkb_CJQcsLClZ z(0Rlm$cFQC>9sMGO{liWr@UTc?=_|%*lWVhvQ4`SkiE;tl$xQO(BEhM63RI0RHlS~ z_69LPBO~IV3?4{IZprrU?5gPd2MRj(jh~{W1MsY^f7P(WT&9m=B2N>O%Y4dqC#Ck& zCyo{7x6f>! zpNEq$$r9`)_$k9kAE(SEM=%{$&2@3}3#TK~eWLD~rgIJu9Wua*%?{&V!_6NEz(6uq zu328qi*<;>$l2WAFT!s?9WtlXTQ=X?^Xlupr~Qc(KYNGop`u(TP=>>_U@|Do&Ll&T z#lS>ScuUTv{*6SSGvCR$j-aI=NyrOYGFIZas_YI-jWt=0mXQ(4Lv=g~L0Pr+URCB< z2n9?WlRW?4oBdG&=Bo5=3Ej!>R94F4bI>M&;W9(0?=PjZTcV$WG3c(B1J(v=?-9q> zEx0UITWSo-a_^Gw$QVjr8AN~_X>ypC;x#HI&0neXhgl5~c1h!}=Q@$WQls)nJR=%L zF~g`Tj^s6nGO>UA6*{k=_EpYS>LEN=PO%zI)+m@uUvwHRoym13s6M+;A$v2>`v4Rt zq>!k>?9~ftcR?=bT?Uw_(JoY!Gmb9i7q;5%_p-*5BgH->!Px zE)U`c?Qm(73Fn@P2R#@gypq25kmN#t$`u~v)^%%luUcv$<%0&RZD^RI%zKF6tCOL}gHKp6Y5BA=w@{(-5oUgSXXk0OC+7cFf}DdU236z1*<=G>#Jf##8*A;+ z7XG&BwWLwodAEfKQbx9XK#wTCZAFC6?6Fs-!f>u0r{1o52N9~geVzAGtSeeEY=SBm zXJ~x*=PIY2nJ`t0g$3i!EcldI*;n=0YNE47>t0tFd;#&Z)(F~!ZWB0C;DcOgyU~oe zk?!-D<)BhC-Red$cT6ix%7{qt$MJCq+W^#eT`Dg;+f1}S-q_qhu^6|;syx!H3H+zA zmP|2z9gBYOf_cHZZv2Ii={fS#(AdrP#Yi-Kjy>`inUi1+yJ{PnixCu_W#}7eONLBZ z;9@f}qk6S}-ZV>h&UQn0wfQf%Xrq`x*$gKdhj9s_XS%c4eWJMjJXW?%trb;ZsbF(K zoY1UI*}CrSH}{>Uz;cW!tPDR`b}B~Ml4{)AckZCNEJj&t6maoU|D_Z4lk(i z(Bv96%0P%wymg-*{O0_!irJSO41X_Ozz(m19$aUV2ug zUT$X&8uODdmbC*f(_8C#HFL$0k;?`{%_q}e9#~4#sJpsR-`b)K=)aeHf(aJKdsl`7*^M60(1o&k)SGI>QtUB@5%)za&q-Mi+@LIOu z_FTKKn~H{~QtBS+Z0Xs}LDhnmaW5UDuTw8np9nJk+!$E!p3f2Ib+y{HbYvnsQ)eI{_d{4?;EZm-+jUKQ&(a#y_jTITkBNhWETh!M!+uHHgN zy>yY{`l0`Otz%{7@b}hHxO(2R*C&NmM`*1}MY=eY1Al-z-FR@S>4T3M5M?!XJ^*87YOJ{|AZ^n$j* zxA&cp2=vQIVKA+zs-LJ_Vp?p-PmgtkDo0e$czm1wv2UnutMid~t;Z2n+0M)r22(-7 z;kPgnDm~>u@=RS^M>*``4Zm$mWKS}y9B4WRcF&!EhDf49hIbY1!a0t#kK_S{)&UV;$0wRiigWZ|fZepJX&n6W-}nt~9EZg#1&c@4~Ft>hj`kn5F;JSQ@nWT{krz zE)mFZRaqUc`;mreFA3tOIO)KN-+|929$e8z2cHW*&@wMQ_$gqUm=j?zARutOBxVUzb3cpTILOyMYT4|t9R-1;>Q%}JBp%o+m&_US*h$)JJ|#^9 z0pFguG*s25nxOUY`SRE>r>miZ(=Q5!)t5IAI^)O(nRADkGP>93x?2)WKBmRyN$RKT zTMjlY?MO~{_i0M{ebmmN=4tdOjI$euDvPG|t$O%p^Ji5jI&Lh`oxeYNQwNr!5b)f6 z&fi$jvNUa}ZT0Q}?GVF~D)R>h7p-fG-KtfqurLje-^gO)p&X+9Z_B~k#vs0ECUE%1 zS~p*OOmxs8vGvAuI?e-j#kd#uE5=YRVjAM0am+vZmc|(1qR6CNkC*p5DjNu&PWf?G zbgblzu{KRU_{8m!0)2AKX~p~TMB}>ER%P$Cu<}WT;)T7`{?Hp`3Z7W^cP=UUK`O!UJH~kW{F8iYGzta(5R=g1u`;41%&rz-G{#zAu_xqBH_%ewKKZ9M)tMp8CG3bG~l0&jh75{$qgc+Iq|@243#lem1rLtIX$aPd@S+%Ws!{Ck}{& z`>rwC@`CkyFtl*`7mUMKFV}W^4enAc=q>2^ORm>{9*mvflQ%6V&O58<&NoT^-o^Xl zQ*4|R)5p8?Nruivv}n(GUNP>)Fqx-1wcx%f37yp=>av;4u81jK* z4BmlxDqEB+%T$46+kbCQ7AMB+%zVu5PIF-G>m;ZAkWBgrdtp7lCI3%QjP7~r$PnHU z^k42+z3bKMM+^A7s4nCGMOYeHwlnP-lCWhz{q$4OYj&85`4Dxfyb}-Y?GM#CEAL)g z`4z(u-(xppX$l?C+LB+lcD@{g1&K2FFtL7`&-rLGz~Pc!u875PmA@y{KQhdNz==zZ z@yatDWdox+Zak32OSYtu8H?#C6d};QC4E<3<1brhR77pH=qAfb6I)nRBMr?80~v!N{6=0yW9CeX6DOi=A`Yy$toGLn`la9bE2&h;e+;n5OQv4 zW;Wpz{4O3~kDs2t<;8QOu|n(1yX9W7evf`<<_i=NxARZ+tg-gjdh-nApPhOzqta8E z>kl-JRy!SuAN-IM7R2j_8uKVjCx6gzr-rnp@o&`H^^U~`YpJ34WW$5GrHR_A_!_ty z+gKjc{hEH;THTa!{zh9<`i@)410UZsRgJ)Z8SMMj@bOemvF7TpKgpI5_-}7p z4>OqcfX>;6}s!z1s0waq6OK$6lkl5&4%Hv3_U)EgfUo(V><% z&w-}jDTuUal{>N z%yb%j-W#GnqKpU@vs<1N8tiEoldC%TE8pfKS0<4nnm;+-yQH3})^uhVuC{k13DD}w zvP)rq&ml%BpT++$keHEMyHJ_s4exh5v;Efdqh@0u`IX}`4!o3Ju}ePo2M@*ZF+qN2?X|0 zrza|Jtlr|RaD6rxgcU3{k6YuzuMRa%HIS66hBf?sm&Sf9ae5*)l(E#6rn#Va*{OU=c}AU z#5uKc6>bB5t0D2vpduwqmqhKS4Q-z_hMu{x5<(nlv1Oa;F*X!MYVt##?kyaR_*OFs z3f5G(%#DQhU9t5weuv*yvJ5AMf`IH>#JIPsZ28_ddyvcqabW z2aFT9JdN|S%^-Mb`tR%aig25S?+Q>U(&gw%K0hHP5ea6%(jD^j=roDwx0Ig zz-RGVTS_Ks84QQ3C?{xS1S!trJy|ZYV+obKd^mTQDqQ--*AM86q|35+DSFuOdQxeE z4U0HlX0x)_#k>2AR{4o5|Jfy;b`DNh_fUZ51#1=*{RUTPx z9ap_iRThn?yxv__&nmA?O{)%N|2&k#PEkLl9{Tgp;4RLZ!4J|6p#>G#s(rT-^HJ?d zsZF_5wqtDJ5N{>;DT@R5z*1}5iWz4$TD-+rkKOn893D>VWGZ)M2|1l_oLQZ+ogk#V zTf3v88v{%}hHH3%M*yv@t@Fc7Cr>rKgzA9?xo zvcZjg-vN#|^Lo{`fWZt6VvnyOQm{3j9{g z#KN6%0lmJ`y9|$1!lJA9lz7e#X4*J>sK3@ectfxO`Fb8we&W?N6P1aBRGo#!T z`9=2c{~(Ns^Sdms_|M+`CGUqU&FS}k;ESKNcD`MH_$8^D;(?_E?asC>xYaUL{fwyn zzTKX|IiI@JL7Ry!CGk;^i=BVI5%5DPq2^25tG~=prl>Kc(@zi#EFZ1Pmk%oq|4i7#Gl6Ae8We`ww{NbzVXLrAHvUVNCJ@nGuTCC*D8NrkFyNTEx@D#xOyxe!VyRvrSk+?J87&9@1!S%HZ zV1guuAU>S*zdh2tn&QjW1UX!Y4{T}1ydfRswhP!kpfzqtyKvNsL^7+$KdUHI=aR5z zeMTT({A7Cn^LFZqKRBPPU3+MIs4k3U*>gQ2nJj7^3fA-A?~Jt?(m`KM^3pK57sce7zx;|ae=pl+{ZQ6wu^|)9P8_iE%FLrE*u;Xl1E6@MjRN1lW(0?Ah zUtdcGKO1Bnv*mu=|By!L-Vd3JO5rS7_1~?vHpb!4XtNzQF~%V&IC<&2uRV&X0o0yL zS#4co(>Pg$l#@X*lF@a{E7r4O!dW^_o8_o^WKJ!n(h64Je&Jy_)Ah<>JVlA+{yriu zSqiB~CLw2ENE=N%os{eV_nhfO3?}`4*qHg;mh}>osqat-TXLHIF_StUL~yXwaOppk zpUSm~_YU-EK2i7SEWd!X3&)(UIw#gNk`B&_veqNK+TiVR*=$OEPTO2r-{L#;kDy_K zd{n4f7PqUud2mwOwqHw_4h26M5l8mB^M}GI!TI{=F?Fi~7}$LHi_T?l=F6FBr|D8k z;@fw)=hZlE)I9!+ED)kz8AG}iVkP#It2$QaqAa`oU^#iP=l2a*Hiy^3JZiXS$@(km z#X+<{6?f(ZK&Mwvcdr^{DPf+MqO8Y~qqePRAZWAq{F-7pr^YTz>`v}lGg3WQ8Jt^C z&?hONGWc54L#1DHoq}|>p7$3@nWyaNP(j*Q!EoNC{3*Qc(#68?64t?4};`lU9UE!KQ4mw9`Ly{`k~NePl(lBxHz_>NP1}2=y=_E z=I!=rX!E<)MK@l2Ft!2>-^DqJdsHtOeGj$OE~94Ri8`={@T_L%w46V60t$v^hYm^pMzS}EC|ZSSYXpyn|J7WD5JJ2(AM zke8?Pfz_kSp3}aPwVXjltL_gYth>7o_Y|08iOrfcs=%srs56_86`Z7oh}g8G_f-G6 zUxGY*o*r1uxZ0Eg{m%K`{)#LRzBCmztQ`ZZyV6~&2+}4x2|cqGV2Rm~xcsli+R3?l zIYj9k?53#15?V^*Q*&336x4!Z2<5mFt46u`na38;<{x}s!3^n2ZgJp}E9TvX>Tqk6 zaV$+s_WQ$1Q%i`h^VQJgH#47e$jw}yz;5{f4#*(~JM}TG?cKl`y)m$u2NJKX{O4ZB zdHJ0aFlx~);RKF=7N_bbD={%FV;Bm>D=n*P#o>z1M=jL3NkNY)9| zIqq0kOQ^S$4zF}S?aZ11B)B5cPuFn}y+g!RsLJ=OYctO^Hs3j|r6MB&WTu2VsU^ubOiFEpg$5rg- zTCjSpn&}sCe9T#+=3LJ~Lt`NcbyL3QnY4aEss*2@wbU-j-#=V~Jj;yJyPFsMEo<#B zg9Yxf3!cxvVQOjhS-Z^svcrg_!}Gc=oD4W%17{DU+qWKb_7ffu%K`z9`lSO4AN4Vl zM1}B$Ly!%?K%gc)`h^IwK%gtB56JI19BLtMd$f@w(yQfFouX-*>9@s5^DXNzdy1C9 znz!HF6c>}kUXgAYXbOmyC2oD(7=m>TsIt zGp6Hh_M~YiEU^l=Wi@IP)lgTcN z{?2h-d+;(XrYZDS{qZ_H9=0tM1-Ug4vid%tv*j?j#GDsnIML#}ficJ98MmiDR{a0C z02DX`4+!M=HM#AaR90H^CgV6RP5>Spf^s;tgj*gyd_ZYCe_nBPywNS z`U_us_0PC>7PPyzLY%>Qz&@SGx(Rmjf))#jBR$YJ{S)m%%52DO*(Vo@iwW|ymcelg zdjfq}n#@Y;BJIF>G+1@&o0`)j)%K{InSS|Y!WVmUZ?)_kmdKN7+<2TY56kcxA34Phu1o;uo9CSzh^#>@F@w$YgLwVL;RUfn?) z7M~cb3b%ecig|0w@Da>R$7Dgw)NPZ8u!}h&R~nKyehSGK0@Q!3CSmcEaRmsEf-+#U zy)~U`1AiDm4*ziTh+Anq$je1IxK(~CM;-E?5+pn$kEjjHy z?A|5#qkaBvn*c&s6JqPM>3l~>OWDuf>v=33=P`Jf54D*A(1|n+g^$em_Aa$m(q7A+ z*4kbpc3YW;6T4r@zCU=qut3i%3Olk7MZ%^ zkp`3-u(li%%uoI1H~8z(G57xL-rjkc07#%fV6y-3OM3k)H{ZG#Bma%+zyW`yG^886PN76~UA)xxFZIG&5LwW2L0v$&x_0Qd)s z)lx$f-DM?*iGVut_e!Mo3?D{I%_r-z37K=kYp!#2_QAB97m}EYhP2lde7xZ?hP6|2 z_0e$D1L(o?&ihhus08nG9R-olS@HoPc z%wKbQ6%5SB>@BM(SSHdpL8Q9kJtp}N^n1415SHElH6JqbeHl}^;3GvN4%%03$|@__ z4)aS2H_0fggR+*LS@>|_K~rUz`yiXMEu;6A2T}&`v8XOKi9!n_!ytb_@qzzjvXCw} zXW=C;-+J3)*{2xZoaxp2bkObs$vjDA=T&h?0>E8Ymzi79Z0$b_6rR>GYo zBA3Eko#)N*N6#FR3mignVFXEC6m@&eUmW(GzBbxhf)ZEU)j22VMLUpa(Ps%Q(F>1e zO>q;*c$a^;j!DhVIoV6Ev~`|mX*mB+my#nB7y~jYKVx6kba$g1qtG3MOOw7JXg7OD z<}f8_5sP`cMTkp_xWw;&UNEHZ)%w~`#`i}}`){mOZ#s4gJJOyS(Ofj}yz6#oPHk!T z(>HBJ7#v%SkJ1n;AFD>M0!p07ob7O)`|X!ddVco)3>o?%NVT;#hZm@NuCNqrkX=*; zFFpL_IxRMIblP@-&gU^w11rPvKy?_R^TxjA$S>nI!YY-aOq6sXJv{w$zL)ew!5{vC zcc=_)YaK4yIw~>}&0vvztF2`@w~UAX)_Zc)WaYCTAN)ha6(d^whpMglUAkw-avA=! zG||u}uDu@-(f@ZqjTsif4cR|2Rro458PY{63F}=AWM_6qh;tnh&_6fY?tD?0QU!ut zlk2!jVi2G(kY-WwMFk(ol@x}at-7pRTuvF{pk~=%lmX|w7PD#2O)-Af!H!z0>z!rK zvtA`+I@%Gtn~wic7{xRkxn8e_3&AQ+-+Y{0f`6EP^w8GNS<;zrHx_+VkAmlP723U` zrrNY-l=>YBy)d`;I);en%1f{^S{sn4nDVpt@d3T90~;$GJ49kB_sW_Ek=YG&7~Lp@p>o-H+DbPH3Cdr;xl!6eQ3ONTt>8vHaDNV<9dR0UVa%dyd)3o(1q>{Z$ z6PT6#5B^ClGf}pu_a7 zC#MkOiUS)ncQEYW{Q57bv9k?=5rIS{k%OOzZ+Xoe3R{2#Ud1>*z*gooaG*gEWG zknH%I2eTT?w^Esz6+;Tb!EDxA)N?Hk*t4}?;`??))$y6w#RPTN^*x_pvSjC%Ov!UuIX_b#Fdmv%XojJO4Plao)Unapkp!PKz#fathY*Dfy>J2}xbaJ0Oa&kXOJP zblxxi0}O~jx}7p*iby30%fTW6PUMGj+B7Gd0s5MzXy-Z}mwLmG5!Mp~an(BHIK(_s z&fo-@YjK0)Y-OO_qK`dR-Gm*etZG`Q^4E#3&T17D5;a^#(dH&HYEvXJWSMJS4 z8wBlFks!u_ZXQilgsK$5&EZ*Z1a?1 z`~mF4?fOuc#*NwDMm9)))-ULM!FYW~+z2Ui8}C_3J)r#I=-05Ir4sKq$h4a`k%a7{ zlRz*eS3YP3Q$_Xg?88s~%;&b$%JeOoq^>s2Q@%#VikY$#S7wxzNz2H+>7)_U7p3}e zc4O-dbZilZHtWA0pE&1?-aX<%J1IF^c~roYi9NSrT@c8WmDqUJ;oAnWv;QbYx;Ce=^YR3 zucLrYW%yeUuDCNv(O|Ht;YfJNH@8^xP3FN#_I1nojmE~A9Z zATOIqfzY9RzDS8Xrz>Q70;z-QMjQ2X?dRmboO7?HT>E3b`} zTGCawM5!l?rSNU>`xH|w65QJ|Qdq?_L*Gh&rP6tg))yI$FWoklbPUOlFZoMgeh+3t z1>x0=j;8!F?Cp|Bac0K_&W$ZF*)s0&oOsQR}1d-TD0nyf(Tgri6#K#!=NEcqfSrGZJq%@q*Nxg}4I zVO+^^>#@og2?!J*N{dvgJwkyfsqA|N*@u$(%Ji|@sUE_0JSB@<3jz=vWp&H8?Co>U zRqZ+Z1ihu+0{tZv#8bOoQWpa{M7WKF+U3{u=PE2z9zKU@UUO=_&Hw$9CG~4FDAK%RmTzPU5PWa3Q*fdHi`h1* z427>4lvM3~Ix=wM^~(!u+4yL@Lbm_$y42@%b_GrqC<`{uL84!{2eLTs4zKfERxuG|`2}qK+K#Tt-lnjUVO>+l_bz>VLA}S>ktToh$(Ed3 ztT)c@R+#1J)T<+Nr`V6(cr0lAL`>G*H@?W!tQ4m`c-kQ)yn19@f3ddj?BMS!|3{cl z>WT~Fw-{rTaSc)Ap?A)*Sgu3BQ)vaj%}!=2o{V#k$G1yJ=-ZFSI!_tt6d8u(fH36S zV$xqpv96Jf+e)}q*4^3;x$fw!kaX&u{qqeYPG}ojg!ho5^wvw&!h!@N4lfg zLXV9;gtb`Nc$bJ5rvN4Ukf+olrgO*RBhB6Ou4r!s?N}9+AV;loXM>j7hsQd@<7wOv z4A_IDUPFvihHJ+cFC6er=zfXAmcQVoOjmCj>6v+fjoA+MnIIPUC<1Y2Y} zzx=XbsJIZ!z>y^-H&oOIrYA8Wuw|Jc#$Zpto05;Hw)!51H2F1!P3p4OW3KniY-$>9 zxjPop?)&B87L~G0r-brV%w7B-^(#ZD$vu=!7#wqQ;VaI+X;xCm#Pfp0Gb>gpm{1q( zSujEQh%_lRaCV7%_qH-O`}n~{51Cu%w-8I$AWfL8#@>E04t>Ai8WHsUXle(g&hGB{^T2gek7>N;K(N$p%lg9QSuLqCppP>C~pSXy%t5_1{}lD+Fi zA#yy?%3V1&uum1Q1s!0qw;RU$Pp%vFR%$>DV>j_Zgm21V(sl9p`K%|IN?1a+MOosC zW@h{h150{M4=iIUe*_k4nvY(H9@y6@f}?`XoHVnD`aUxm2GqGs6d|}*#(2vpW(G>i zrtt1>xt}A+_^UXfP``+cFtXNK7nOH9W>NoWCKvTDdHv9KAoG0&Ct>sDKI`5u&eqr1 z9~CI;r#$a9V2u&Y$}M$lWgkrV|p z-Y(uD4>4p&MWlV}m$S}Yw07zMy6&9|(19gM#?ToS$qGW=C|kkxFE-3?>74WJl9{&H zcvJfIUdy}~5phe78CDw=H$0#sRR_R8X7m=J zJ~J|D9chio8e{iHn917u5pP?@3oW~^GQ^ttuJ_ArD9QTtrkL?Oc}n!2sLs6-o;}#e z9PFCXe2-jlu! zsTUuR)z4&LZI*O1R(KX5cv9du5Ghr-mbv2hHHA|yL^CgprnLo4Akze#xrb_bnj}9E zEUpwsUATDcrgM5s?{v*MHp{9DmL5s3j`)BM++_5NKvlNUD{FNC{+&*}_0|I2X!fNa zYMJ)-5=1V^ij02|?cgPWY#NkC8B9?-B$T7IeHDEztNDkv+drvvSBI6mhPBIVf%(3Gj_GO5 zUy6!v8B8{j9wUnOZ48XU)(@{Q_P}C0rxKQ%Bz1EecJl&7;Xw2;K~k3rKRkAcf?7J# z6B?X!rchXm-hwmbzF?j_NrGlD=Sq@>9yU{4qEDgCJ|*-sU+44w7Zy*7OR!PXOOgH& zqH7M6P+^arD%H8zF(_(u&iz})-Ju!xfinM4NY+FJ1L)yBrNIF|pLbCA4zF+oPwvf$ zIsR7l5Qb4P$f7cPNQ!V2U=~diU|n52pF>i*MO0nk)_p7{T}th-Z70mBU9rn>H+V_? z1_$>0OaQ7xhQWmfv!?fyUflDz<_pmbOz>P04jq`$pBvhOhFK-ef!LACN0^WT9$%Pw zZqYDf+m!J;5W1=8p=-2mS{3cQ+Z>I#YctY9BJ$n(!zb?C9h!I{U}4D)77UoEv?D;U zhA|cjnV`nx`M7GLDkTx{MLAPsk9s6QN^K@SWWMb5 zz}+^%MhUmbC@1$Xmo4Dd+U!qe!z|-!@Em724A}uRLD9u#R%6+&szw`3(3%)QByZ$! zxhhrTx$~GOkQx`87m1k*W1H|Z90b1{tF+)exjsJ{e0SUvRrbMYwgfC4Pb&0u}cmQi4V`USzMi!YuIo{K6o_z};@X!`WZ?P77 zdC*+cF9gVNRpJPZl1)@FzqQ_`tm~Hq2ypsSj!a@RT~49*+iUxx5g5?l$8wmdvu##P z8lEE3`fDdDA&FaMR@%|hOhnBp`FBJfOyZJLuDMLI$w!?MQQuKe!H28kc*7<7{f@@9 z7NrEHbfY-W<>aM(f}FXi!huxTPNu=(RY#JK8Iz!Ef}J>DokOuj$o##r0SI6#`-`!0 z5SFoO#i#njn>A)XCR{a#sx;Tx`Yoib_fT)%Yn*Ys5n_=Vu2U~=sI#^s%?#Oas2X#Z z!$mAD$CK;2FBie4iIS!b-8lUz&+QfJ=`O|4wHGy*<{UGh7+9A(#6~JJ(u`4uu!t2% zhPcwnBTCKkAe33uAhFQKVaGh2VvnqISABDiNE@dxLnVuxdl!>nhl5Wff*hyh*Cq|k zSNUl0!$|?FI2XaJoIcV&(v}AQxZt$F?&@LXYv|IM(m$l!L_6?; zMHOEOrog7xJr}^4QfaRCVu9t4?##Yxc`4uuE74+NP}Wq-&@82JbYOl3YbYEDTRqAc zH}DZ0Eo+(JV)b7w4|cNa8h#oxvtON*x+;4Xd~{ypM&pM4IQj0bpPkKs6vYEA*O`7; z*hDs{FodP!Pu=e+bi1P?EHkqnkpN&r>N@6xThnY(Jkn~csAxppI}H$L<^-tMf zwvi!7EmNak(rPZ+ic3XrtaP)_Y{HxcOc`pRs%toyuMKBJ`|-C`p0wVS;K?Po7Hj|W zM95%iVng~KV?%oF*9$^qD!m#KB$iA~O-5H(5>}?mLu}^$Yrb_&PjX0dhHl-}1OJZ; zAT1uT=X}Ltc7_?RwdopK0R&kj|JL}Y3=?$xmETiR9y@foD7;1hSTb0N#Q(z|S7Wil z^8d;7nqhUET@UVvv)8Z0FqT|WQhm+hM0aVK?)e<73%ELt|j*n6=b{FNcT)0tY}M!DcO^PP*kcg28+LX z)>x@WRU9v}mhp-h0*$!ZW_Uu=JJb-OGcA7GWC*GEz?^Hxcuh?2jW48Igq|*xFlm<{ zV7oKSy=t}pk)N!p8@p38Z`PrQE`LnZLO$H$YQbRa!ynEDzktXLeGj<~&pg`VV&JM) z#8{k^V2*f@V}gMUS@u$qSNkmcNimP6dg0VqGP4QOqMMrj51|#&RY$okYlC(geJxRC zP)#^yFcIh8i1Ft~q@$OA%gE-EX*JZ+^4nV;j8|I?@w_{$w-lyKL03wkcYX!dp;-Z) zUXrbfT*jt1Yi1R)5I0XyMASiErfAV0Gc?A3TYPRj^d}NPyt9adA=akv zBXoo}38IAah=bdDI=PYdM^e@S`G#$9$>rT9h~r)t7QeD2nTos6nS96?k?gS9e#cQU z5*S78u|}u*VlOc2=h&P56Fc(oN%VOxL1s4PrO2pvvUbQz}3JspcWDHx%-wqkbZKrI{Y6IyqrJ)}YkYiOfN6yY1tecBLk67JQN2Xp;4?AOLK?L3V5E7Vx; ztj_aO$NG307uJ)6v93jJWHs~KZ*m4K!@`7hZVh^|SQcCq0HxdV+NLgx2TAU^ zebDqbLA5~^J5OEWYsr^iuE<0se3bq%wO;R4LPx(~E2WN6TP4Z3-Yo><^kR@2daNUi z`1I`isj*NL#R+CPDF`1wPTSZ)c^90wNd}Ue^7Zj9qife`XM`6<;erP$+IEk^G{gd< z0&f{_Hs4F1ssQSfBlXTjQggIA2S8tKu11Lg5xR$a9Z+En<1u9ycybouK|o zHhIIU-KCx`d&%ZGz$E4aP^EdoFpem)**>qEZXzZ<*aCfoQS8R-ISV4rtGqFI zJ~~GEX9U>)+bW{uL=}_-n$|#r&jEw~QI8IW#(Cwh6)+M-pd(vS9|=67VL9^!!a}f{0}Hw4Er5IeC*})CXXn zjU8z^w$-8>-af42?ufT-Cyp{+t{#}Wpaf@`u_J~Kvl?a^R}~VZjD7a@$-aLld%Z@gSFUA2cSUqdmjIVEO3odGN@sIJ&PLSV*mtHN!aV4y$sy`na*)8WMf|X+v7}$&0q% zq<%Dz)Gvgt!y}c+F=<_KO!zRZicm*G727t~@B|{#-fxc*0BQPIjMqNToQQM5>njHk zy<+FWwaSjoO()Ef0fYOKjZr%aGld)C5ab0>c#}z2i5EO#@=}jF7iZ6z5$Wj{elrL^ z9`Th-YQmx|{JCtJuan1A_~(t^Bj%MD@tJ(DS)WE*drGbIsD5@krZx?I8Rx; zi>HDU<{10D-38{M6_I%=Z{^LQ-ofh{Fhimfw}PK{Ctr&v!g4FXJGTS_#Vx!p8@F4A zV@Q0{dsCsQ7PU4LHNky(jRR*tWApUB1S@;g?7JxKwi~R%TlRbTFkd{8>JcLYS z3{|@L9JEx1MAQQtyO@PFGCt=hv(}G6ks|h6s;RIuhub2&H)t*-dsEhl-~E%Ed}O(H z#rpB$uZM7-eHqFr+rc+ZI5$P0VAa&JD>}mSd109XHCuw>%us2psLdzH_HkLHD+(cB z+BZU=xmW!)n#?;kJd!cGHBiMtt+C63qjlC_98Up{aBU>t3I|J{(Rzn|WNrSN_Ugw= zKt=<}iw>64Y)`b@$b8q^Fb`d5TR`xZ3p1Z&t>s7~y)T0zJ48#r-n)ApqJE{I##?vQ zK%n5GL(545`maJs;eHTL@LV|1kT~*-xWqUilLji2(bWM$omo2w;VH))=b}W~MNVkd zIgfu6IPlo8VWSk#0>7qBe-yS)v#1lPi_xNjBV_>-q#w^tC}_u6nWwGlNgHY}1^XId z%+rX0j-cCz42pu8^QB711)AEz=SupoLUZ^M?2e&xltM^mV&pu=0hdIaC@hGy;`{BF z?e|yjK57d_eA^be#JxLT73=4TdTC;EN?Xsrrw<%`c)hP0+Iz(vuY%Ap zuj1M&7}tsnV%{fRq?s!9=Bh&>+M8S3XV=f*aim(@!zeK*`@IYFYYHvRcd3(eYYQKC zOm=p?p5|USZb#cIw;!H(@sqOmJ;O79?a!S)B0a$K^iP=9B3#DCK&7mGn2qgD5W0v0 zAz6LVpFwfMq(&&xrO?T%mqjKZ}MMZ{Q!h6KtHL(;UY5Pwp>6 zN8ezYRla7yG16k{ZjxX0DRq{`zzKG2NoVuSE%0v6ErRC=yeE_$P|68JThMtaKDE^8 z$o(a!Y(>}q$rmw8iXJSl0$FdWtoT8TyPu^|vps#ba+-G6i*}l&R)V*d@}WAmxO*URFy^s`wkyYkMCd zrWD(L5bP|+n}l7v$2V`9pM~}*eLS^?+H69*z=Omo)F26Gz_-X15Z4L+pC z|2J||aX$~hDCXF-o%k#v%~WF=GnxM0y=PlYi*&_ql9c z(0gmL#)_1DgV}B(SOEFVhv?u>E_pd~x%7C%MUP0U*fHbKpTz0DTvDIRr!cDEJq(sa z=|Jw`LUV9MM7Z(6LMuV8zbH3~;r+;4&hD!gU0&dAGvVx~=Dl~PJM44(ydrq=|Hsq2 zz(rl>`~QJLHX@=hfjTLQ7aEm|Sm5ek?x3hSqmx%eE<%ms}AicII{A4zQ1(-5BITUBFxP9b9ujC@7Lw7%x~YF z=hZzuN^5Jl+l}$vBB+Nc8#I6`opzQ3*gGvRI~ZIDv6Kbls4jwlc&mnJ*q4vqBF~GO zK5)oJ(I@4(`dCqg7_!{7e+c+c^6In>V%b``4meN+^!u@bhzaT!QXl{QP8EsMyQ{hq zb1T^Ita#y65@kFN*p}cC)*^4a=hV0z_7R+0KM?==l66@pjA3ZjwNx1N|t*t zTk6GmbI<=tjKu;ZILr>zpI2II8^3SNzCxp;+Nm&TQOo3BPp1)6bbwX4eIE58=k*iq zRCX$Jx=qN%i9cwS1+sl)9%qB$L1fKZAr|3166R=42a@wuv! zaT7nEOH8vo!m9GKTqjf+5+KLmy+A^wOa{+~R}=r8f$%SYB zo2J*@GDdwa`9$BfzH9C8U(BVH4Qpiwp6#FVc@^fsjAH~w)|%sZ0S z#h{Gde0Rb)Z7ja1abOe-rNetdo_)@i{iU|Ilaw6Oj%Qn}xR`(W*Umf2@z|!#Aqs103=V6;`uCn-%7Sd<~!gTf_4GsoJsGbECp3oKJbRK3TT2 zsbzWe`7J~jIG#22{kdn2y;`i%Sc#UTB*LaWB&8P5T;?Jd#AKWB8j8-_ML2o_t#LJr zI_aiY;fAZwE7p42$8ECTUbVMyMQ}|X)LJ8y{LTAXCOd&#yy$lR%{>gg(>k6D9mp$D z&7##mNqGwvaN#TF^fv7$M$!DsXp48m91$rP$086dSg`ji3uwI~@5pB3T=#3<_!itM zKcIw4>l``O1DWd|jBXhvpKoH6tCMBtQddf3gLiVbf=M?Hk|f8^$?)wok@@inlff zxfCsL%uM;|hJ2O+asc0d^CYre$X9`@q1{<^a=$4#vKuCj-`L6JKS8>?NH6X+acO2% z^wo0=$J#}RHz^qpKd{|Vr`!rS=X!!( zNk-jFhxb4`sl0h}xd@8nLsv>Bgl*IWPa%x8qOZJ062{Q{%U*HYP2l@+?ovQud|=KP zH}4!-zJj{BXtzTUSc60_^DI!G!rEaf*4p~KRKLu~v;QRwSC#_hOs9`uH~L)|k;=h9 z6@J49g|~DJpJ=L5uU}0z{9rdrjy|Ot5#~M!-NS#}pm4n2`n=g+Y^xoHGT6jJHszXN z$c}8J@Z7d-u0@(L+Q?jEkU2eMhqEcj>E1N&T$TASw%9J&Y&UJWWj?!Op{w>S{X9}_ z^K(^uI9dS0?Td`CY!@!fssogVaU6hkvEzxZ*BmjndE7TW7<7}qh-0nDwST6XoGE51 z{~ZIT%*I1_GOOZtMuhN)mnMgo9bgrL5DIAENzN*y;EYe8HPAxCNhQfd=UydhMMqncm&{9*L{K+aucobs)qBG%f(-d z-q^fE!~ZYt6jZ<|G8YP|H0X+YLb*Cn3+BjQzV(k%M2_*{gJro}h`rpKc+aSOga%|^lFMGb&a zB8H}E8;FuVHjvB`h3J_&yZq*h)VH!I#~(eAVbI(Nr_UCqUp|`~);1XlC<{_Xk&z6^ zEZjp5USgoqqW!iiL`$~+5E6wZlipG=^=HLk7nDFBGYR3Qi69|~!7j$Hfsk897os2A zHycV+e?;cTg!V)w6`a%89P-F~GvI>&09;9L=lp(6`swLvw3-)is5M`UKf(GXke;7fZ!0sp87%9RtD~(ubE3SMf}Q32{pUnt zQfz!W(cuR&=2DD_um-tg)9WpzDtIBVi?-Ei&LS2OwuS^!Ny{L^yvkJu%GX@G0(4W> zIRk?Vm4M2Wc6y*3qJki%|o|C=J%jKz}f*{xZ(3 zp>;S4Nh?uJr_U(Cbkbj2GV8uk<)ucyL*4-xv$Zi~T2RlBXZcy+z#We0dk120vcdpUD1 zU&RLH>9sYNh7OVTgkam(fPnA{lOIXl?x~qG?Dtm`EbUjc2y9`Sb+D?bWi++_J+vDRWqmZG^}6{~ME*#g3n;nL8L-|3 zPv*(DD^ASEs()3)G?s*TV9M=wXEt2;re)O<_w3)E>Kpxa$~`is80wS<@9&}boHza~ z=s$qMo82klb+s?PB;^l1Hd$GZUMz};o(Q{+K-nw4#l}lxwf^$LO<=RcbX6lFQi9G1 zSZO~MWp>eu&f#;Da3|9`e1`27#kToTX%qwj+^neMMxND-m2orJX9~0|LQDyV4>FgY z;Q~Rsuy7&C?j{8gIT-iL_nw=lX1Ya>2s4i|4ZP}OygHf0w*_HvmHPj;Uk9c@IpMb#4zBVEh+5ZX%fE!;2IAKWE@!XQjkK!?9QoKnM5?-i`xD&9CRLZ5j9mo(Q+$6+K zN;Cp`DF*&=*OW4<{3*mIyW#P6(Mg3TR?TxkxiCe|@frBB#M_|3>jtUq+Zmy~dq+2} zeoD8bJptzS{ZXT~ALm``x=gg&a;7LFGZVYg)YREh7;0V(2sUPOaRUvJ#70L zb~(8b5PM+%%M*h9!7%}2%Z0;A4Xxkv!u!Tok_r}U-MbHkO+)Bl8&+RyOAao<%z7L6 zcW=p|j|3valYGb*8*WwiCZ%oC{DvxkAt_xvfuZ5yv#}d?Duh$ZLbUqf(fA;K4S`dz zU{ZV5xJGoC7P)P*=&c*Zc+>1}EIn=K;Exc1Luje))MYMFja(ixv0E@Umqr*InH~Z< zyKq6uh#MFTxL={bC?q*1t}Fyo04H$}R93!HL2OIe90E<)+OS`D)Uj=6F4bMOch;WP zTwB82>15XkDGUt%t`%$nKkS~Ou4Rg^INNx}c31ePXBx;ErVW;jrfn5=En^S-t3khi zc?n_%&m2;K@xrIDk>uc>*BxFTUy`t|?+OuK?hrC7Te)SmOAWVl*6B{w;y}zM-0jkG zBcZw9J-NG<0fLjrDlN2TiatO}Y`*F1zs~#&7`SNEuU)ilzNZ9Pin7X}kfB(HfF$>5 zEJgcpk>)zbP68vM42;+d=+g=~Rt~u=Gk#~~%m!a8rW+iMYu-;-V?nXs@!)?W z4*wq);Po1tP`gosEy6W~KUcFN|Eyy2OizCQFs1N)nuvl zW9rw~eiMhxvK&~X6~^LLmHJ-k$yCGC(ZfhJ${kfXt>Zv}K<=EZOBXC$pJcz10^!ZPME48iT;k2>&_8WgNu2Ouihp!|4M>bb&}56;Do(*ve0rH3i#_}hGXGN z#Wk>$arn3+Qy?o@u6#%CuX!1<)k}9cd!N4SVq15;C@3eYDgT9*jbn=@4Y!mJw}iVF z1uWeYnPXkFXVR4IaXV+@ObZ@gB zPS`~RLF6PaLeNT}2R5W96FaN~j3*=->?n^V0ACnLz+ODAF|g4R)4R?E+^G*KtQsQy z&}7G0!ec;yIySteuStQJN2a8D&xvj$6v$lvH{}%Kxw+SH*C$ zna`e);F&{-miiIEe3T}34*TRK&8!r}Ko$l^5(Z&?5!C+U3Oc7fSax17=dBEu%@C=l zV~SbadiBty;am^_5l8!8Q$iWwlBa-7G>SWIc+bB=?rQ&zy59@_wCMom5*(S`>F_iK zWrbeJXShvENtSkO&w}sEpaM;Q7DU=0_f5(JxA4T0y6!|EFOEM>k$ksnM|=pDt})O?t?{&);p^dKgA6>6_tq3AEh5)9G=$XxII{?)09~#9WI;4^?Ex{4c|zg$A$1C+ zZE9Wb-`kdZX$vFFhdFufeX{{f>SN9ri!K)w!;_?7g(D(5Ddp#Aw1fCdt~oy;>thL@ zKSv2ln=&@MAO(~+EbMSnmJBNEZsa?SaMlh zw*p;JshW1IT(Hjw;4FUZ@ZJ0?r*Y!d5?9vsed^nOeho^Ar%{uUqkZib%3OkDjWhi) zEu7}pd}G<=9;(*gp~gB5g?DmubKf6lOIshXszC;Q?ApfTqkr|_;MNM_h(qYYS1^_*mz6O>G4k{&g)xSUwPbp>j7?D@zK*Pr}-k=-t1`$mD{qeIQ9lK~$UHpkEx=10wj z{veljI;ux)tJn1)G`v5U+s7`!Pn?8W?rJxPlaB8{c$6g6N9+$aOf8cv17AE5o;hhj zO4)L!?62lir)!+cZzd-dl+;*;;LWLDG|0P7+BFU^bK)gWYp4|{>00x1`LdekPZ<+= z(S6J|o5Sg0CKtI!1kLoW#dRvpa6e?HqwoVkME&tX8@Modcs^_TQTVh6^ZVxu=@z8t z3&v06pu-@OVw}0U>>Ms_e}LC3)TAo4I&S!=F zRy4YateQR4pgw+I!OJJ-`6-j5ID8e7}m-N2BU5^ECkbEN&6bcv=v)dp9f zP}Q<5+CdT}6_M+QD^7*re$_ml$WnFWC9awlkwU%qR|hn%#?YFO!V}wr$)Nc1HWRdk z$88cpv;vaq$Ux~#1VVx6Q&vzoLH(N@pBLcdQB9P=v={|3HW-Y7Er)pgy?-y7@SBqr zsSeGZ5JV_-a5Ou6Wx@X<24g9>!kA@C-jD!muD7-(aFR%Z^=YP4SltwXhNj;GnL4RmL$T&Ke0Wgc){RGHzy3VHjpDr9RM@uA>XAWsJ(d$ zBL&7pu}4DeEa#!K2WYd-9m&DH^yb2OUSahwR&v&m0@5DWcyQdp#|$FgI(p!&+k-#k zP6^7l&3s``WNuVToRfR?>HGn0kkgu=prd=L8atFso?%5Qr(a3`G9z3j2S{b-Az72# z$9eBRApT=Fmy3-89A;j5rx~nZLLe@?sV>!00y+^V)8T)*)v^#wC5A7Hinax%9;K2S+^Vf z#G^ioCVqZ^;hWu+G23LeEzwgV#SnKZ3MuZrN2Mw_9{CjyKE-~(T*`1EU6CQiX0FU- zx<$lUWoV6USkLqrO9LwwkCE{&XUz1N zzL6J3JUU5%Z8wmD`Oeltz8!A3I?1JSyS}Ezwkjv0Y-A0qYQ?kSC_9Hjxj6-XLw3}4 z%hY#G7_0}!{cJDl&C!L%2wJ>YJTMx@VYelU^q#~VyQ;`gK{B6A_qI;S#-NsI;36|6 z_!NHMKBjqcw(-LF#PnbZ1OFiQ!J_J5p}(#YA3!iu^rp?HdYkjweMij=u+FDWoj6M3 z%Tg@2pG+mIYGxtoR2RUpQ69r z(c>)w({Op|^VaDv^&Bd=mntSL9|Zhtub$z!v(vmKKvWV^5XUsHevR_{o9fedC^rXY zP%Jm{(jsJXzxiVRm-=hLUOz-6zF${te3Qe35KoA&^=z)%5HH6W+Ap3w$a_z8c&-fj zg|?N26{LKAJKnu0=Nhy0+IGe{^of7fBR9aCPSaF z*{`4bs!ZIJ(f?4q4#U8q>OC||S7y{xhl+_}vW05r*<8a#$P=LZ>Wu_3y{Wm9ux8>Y zf%JCNG3ol{KgDfx!4E8XA$DJ%e0q&)BptmKMQECHq{M|%stssk&V?jy=hIqRmZYj!adSR)@4V*Tk15j8zvsJfoT9h*o;vVGQVYy4A zj%4dlX9I-3$Y&L0)&-keL!@)QI)B)9jmpsL^YFm$nH53wBcRsOVicjfJYbnqS% z_jx=sz>oWz!n`KMvpVhVpXL~%!}4=fZ6M2JGLUBe!sak@>2^g=Lv16SpP>vt!oyhN z>2o;(y11x_OxG%N6ntFdtmW9`G^83b`r~2(cdizk%~rK961>|+OOiJkFC5=2irr(q zPcLXP5du7d*XxKu33e~mokriXWg_LBQMM|{KDz9wpP}q*P<<`vL!n(&!uZW87IyBu zZcEXG@xnf#vegw&pd1W(D>Wp)pw1FLake&l#7-=vHGI= zyBU9dviTxH2Jx>#`5=e+;MM#BmD^nU?X-EjTgR4*32dc`PUYFEW=sc!5TT5uS;2?b z1(_`$uQH_Y8N>Rt?o{#j3umFLcb&1Kp?@*)*$Y&aeWBLP0h<2K^TdY_owwMXDEyt(EPK35ysDZX?L}V7Q5!@v^L<3m0pjUJg09>Hf<^o`v;RO% zUS-DGIMzYPDJHd-=W50`wx>G#H4{x{UT?>UQ9!0h^QjQCnHn0mwVm&U`VRBu;$RmJ z@i4ZrC?%WzwfuqLdBbg2>AGUJy9Rn`;cM+JJWLk^k-K9<+Pngkj0Uew>2GcVRz*C6 z$;7HMwbm<)-b$LR6t)!iZDruBLX2T<FercRTt>eGA1GusNuH3Uxk6?&BjkJnlxVrjkvhJpVHF zI${?7_waAAr`gXv`BsmwxrA#8(oS#Ekn#|&TP(?$(&{M^L?7MaEPS)ECqs73nE5gr z{Vv7ru<&p^p}=CMoNTN%JuFa>0qGSui>I{2l*9ALAwT3-d&VG*zpiGERjC;67K~i8 zKfGtT@WXeklvZ@^g6Ub4cg|{W#-+&dB~)5JoN#aFc}F!OM%d__C`n+^8!nhK2T-nm*6`!uX8 zKHx3Alp|+=nbEH?S_rSNCi5{N-B;J2Q`lEc9RYbKLPcR3n2jPJ@GRv# zg-qElV**oFYGHcJbu#sef$#4ZDh_%ytwX=KhFI>8d8qSYj==4^JWfcKIz|yP|EA@x z5@kgMW(CMPeGQuzfF<{MM>EpVYITO#jJ2TfG&D5&GnvkKH}?gHJNx`Q)9)vnS)i%F zML%PY;E sgwT$=rZ5IpT|pdG8Ysma^}Z#C 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 NApF&NABC>T`hTV$t9<|f literal 0 HcmV?d00001 diff --git a/src/Ikar.Server/wwwroot/logo_bg.png b/src/Ikar.Server/wwwroot/logo_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..9832247a0ca4a2225f16e6ca0664443339419bcf GIT binary patch literal 197973 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%0DsTd zfk(c^JT4e%J0rxq%A|L|@(+=}yW+b4Y2LbI?E)9Ce#_N$Ezgc?Yqk0%3&-1A)Z?*R z&bfRcd7?@4z!t18u7RugiWJ4)LcVMu4P&a5%LvUcVlYlKwuS?4@!EqG&))upAA0_k zpZQm?KK@qJr!d_5wf}c^xbxYDbI|h0dCjy0*l6M2?pq1_X^24`qZucp~(4{^gDlv-tKep zbIJz*AAX4I4?Vj0w5>P&%%-Oww>42jq#psSl{mND@Z#NPSgL@;j2Hs+H!5t@Ew*|LzJDL zW4Ag0(J^%WG#uK37w^3X+}`?0Yl|=I#BD`9tJw^FUCe36QbF-SkC{*Wm3D>K9;~>2 z_j7;ii!c7v{}$`p-+}c-e2gT@-3fF)38#HJAc4r)DNt_PhQQuuL$(Lfxi7sD)*I`) zv8~S|U*8-U>rbGh3GM99_q}o*vtj(`jJ!pJDj1t%z_*?hFe^ zUlL`&%c0bdgOvi{BBr^iKXlWt_OX2=odTTh93+$&LF*Z;EDf6x1d>wc_#XsW=yXG* zNk2Yo97F}k&-#~Xs@oFl%8!8hz2E*VPcGN1x`fhpwAOb|lcwgI=a$=(=QuvU@lO(R z8Vz@!VcftLtOaFbCYtN$u%R>|NmnPwWv4GY?mgb);67})B&@TL8_VIa5(hU9VqQo zH)ihoo6AwtXB__1IGIO%S9BWU?;AYBPw38mfiX?ZzYMmy?BUVfi} z^5HM@qGdtkXZ~sbpyA9$Uzh##x!KtC#&&Qi-r;i~rTpkXg6_*7`r$tm>v0C8?+N>6 znebvkHh*s|MoLyZo>TVt@h8O_zmt+hIB&dakYEGq<64%BTTnGFW>1PF8Lnu~D|Bkp z-TcLWj839hrTF-~!cfgW_V=~h%a8u#XTI>eZZBVX`L-Nj7Q3eVharM+A7$A{D?0JD zRXlj*5vnybu9b$|8Y)VOc&&N=Vg4Dyg4jG)4B)36%K^t?ST8Q@S#2Nw`Okm(*M97~ zKKA%k;Kv_E*R}9?lrh6CMrF}i@n$5?KG~0Tv>{t6jhXp+xk1icc|MC0kcT)P?8Ah% z0__&d&C|D^fBkcR_oK4DR*a*=xIaAhvNxFD&)axkc<>3pV1A}KE_yj0S1e0`J$mT( zV;hftH6I1LI*)P*+Wt(tiIuaWSi^%0Tb@6A@0T54JpbhnUViDvaJc+B>=0B(BieNi zQE?|S8}+A2x*jI$ufET4m;Y{UOCG1;D4RWhx`+IddwwVO=zOz4`f5>+Zbx*uyT^c- z`Wyq;9;26^$MtrkZU=M$kG}=$l|=*GqK>fkv0nKKV*|{;i`?BC0ED#`d=fn`8{Hdj zW(Kqh1N983?YL=AyZ)HBB?TomriOd-6D5c`;%&X^X4IYN4!UHME@Q*rsBbeJ-@18t zcKYZ%^KWQWrgIJ&*5$0U1<|JT_O8X30ZrQT9+cA)t)IZ@FB9_z|oCjR;YB>=OL`|%fEA(1!*PAzK;guoyyQ!Y?^5PVT$kn&X?bM z`FQmwE{?ZYDhtFb&0czhPYo5|#WkKkeufJ>#8#`QIMpjX^RO(7)8;6;3~Su^EjYq( zbGX2h2QT66S6;VYxOnM1{`o)kb$C zBt)7-KCztq4(tbb@ZoQJtJ>xB+DdD!jb(T}mn6X3x+u#1okN+{;zWu9E9|Lv`vsfgMPIrdv z-t#u`+jCRg<^SJQP|sBVvM%nmV;RQ3i7d_hHZraQx8_~8#Vuty>^YF1F+3Q^yc6ei z1L02{+S1rss0`bpgHhzP`Of%EgFI|IWPjE=c^_yvea^ff{Fz7PBZFb?g7Qsd-swm8 z`|1)zKHQm&RE}#M`(!koJ-DS@oU%`|hFJr^ilIj2Qc5(0q0xZv@y~Nd@ z{mEZg-p0ef?fT-8`B$M3mv_jhE=Gkdb_k-GuP?E39B*;?@PV&gaGEtNO*5bBHuy-? zEXqIx--1UNeD|&awHWHM*mWrnKJn?#{N~rc_1o^o%b=*`K@Nhq zHI8>RbNL`fQx%?WU2!}fad`L$SYou=e8$17psj3NLpM1?5>w~~ANcgfv>6Pm9ZIuy zy#9`-@4fY_UV8cEzktK#*MNf;w^@wKYFH1aS~+Cva-_xb%>w1cl!vAy|KyRwotAU< zcli9#2shl%<1YWZK>a-V>4vVZ1OP5!`r_Ro2I3= zqqTXRw8pw0osj`m>SLdQl05R+-y_9hF+)Un+l&@_HDpH65Vuyb4(o>AAmF@vJ?E6{ zNYiKitgybj``+|#9uS+fvFe|Z={W6ZXOcYja4yU_Kf;QaF9$bcCWL6-H$~a|PWpyo z3knL>x?)+DFcgZ1Xdb7hA9unNFh;1U^&zzuN|V!K9!A7m2%{2M@##?d_k2g3TVGAApL^^1M}PjEtKW0`;H8TS zzjbROfN=9I=p#+$42%BvrK`N1a+z~e(i^FPXaln>>lGH1B)t>%$W)epv_o9|X7&$3a_S`0QC z&~9;g{ocx~#YMWD6S6}a-Ov4aCfvlt*4aC>u$VnBKLu$OP= zJ6fBeZvj4pJUJ-x%2lzT;c$S}+uQGY`tCbF_|hw{d=7`@i)LlDa)|OCYu!$2$jW6S zM_!~;R+)dJxQohN{wEb|7xQp;#k$M?94Mo2maNWWour-6l=Hgypaa72ygV8V(IrDpN9WjEV<#NKRu-9C})EUKEvWCN-X%=6z zk>b^xoyL^E4aB=aeFMai| zdV!0-n;Zh78WS6?YPg@i+jRL;k4fL@<`>)aHlEfkb9ViJ9TjwLZ`k7d7U9Q%-ubH?@o0) zLy+^wxA7Niwp@B@HTGAKiqaXD)%dbn)WF`BRX031Xhe;5;caK_akC3z)2Z`g@I4Hais=O!N*tA$QdL&CmQJX0&E`CuV-y z5odZmuM;$j@?ampnT9|Vr(n2P@lq?0TM;exNEP#PN`tVBt)-kWw$giHuwq#h;tVQq z3PP@8|-;@MuoCnTRRIQ;;H3L2v zaruO9HJ^UA23%d=;PT-EzXq>W*D0B1+uSwYs$X^55S#BJ4B{;4vT!OJ7X?;q{n$Hi zz47ZFT|Rtn4<7t9>~Mp=nXE-UA#ZwJ=e9#8`gHlEEWQ!kMeQ#C_ltA%zLC6X+i}iK zb)iiL@B5gw5Oc6D`?Khi*OX0I3u~HKCMQ3l-|OK$PwcGbQ^6TJo$L7y_ju^^EzX0{ znhV}cmfjHcxwkd(VTKl+u+r<{L*{H7NQ-WePI1$I#2ND37wEg@U)}QWOdptL_Mg2I z7S|Aax)ERe^sgh9-1;CTEa%>i6py>=ewo0G?@gzC!f05+h<>ox5($m)E>!PCw79kz zZ5w|T%7&pBO`P~`e-JEn^pR&+L@uN@Dgj1=?BSgsGsM(vQheqYhIREpFvrDL1-C!; zrKcbN^5g5jwOu^AsE0%7cHD}i`HS@fryYX>gHtvD>k-FR@!;i$VNJSB$6e9>O=2$# zP80ds1yM>rHSG?~^S-u;#fUiD)Z(JL4bW35_ zx`J?O)qK5|-^Si3Y;<4|g(}yiNis7xtV0j1#Vu%8Pd|J8)|da0N99;bYkpR^a6Mc3 z3Cp25%}u$+Z~rq7cYAw_!-GrM;ou%*25@<@K`<{TFelWNXxN=>MXCOKD9x7AUU~fX zo4@6OH7l>Y{F7+qIbgnbAjny7{DR*Wx}`ebP6weI|Mvlw=O|Z2w8p#sm{^Q^*oNDu z_sv6=3Ey*D(d%9`kS6-rK8*kG)Q{GH_{Q}qXF)&m zchWvj;C09M2GP>hc(ujd-0)eV(O!;Z^YRYsBXiKglgoYVToL7gnDuLQ^>(g=rJXuk z%2@{#Y9c`lB!-g@|WVbe?^!l2y6*o$__N+7}d~c_( zQ(!OCvF1C>MNf9b8y(Lq5%mWPP6V*hl7UgGn*reN;&BG?&?chpTGB|PyQW` zO8d})3ct)9F(`?A^~BhaZ1rgaV}Tab+gq&b5r>x^IR}kv_NV-Fd4V2dnZVO4CDw47 zPx&pj+Qow9@w;#Srh0SxotLk^{3+P-7GTvP-f1dfNsMIr1Ldl^^38?o(s`V4wuAeI zb7-UYL2xea%x~tV*z+Ck?=OFZrmJwre|E>T$eNuX5$5(nqxC3{STa zU(!q+zJ^!Yd*M~S87KXb$fdWL+HX;eefm0hin>r@{}bCH%?GljOtjeXdszH@m7nQD ztfP!=-6NAe^*7w|NRt_k&Qg%WduD4a(ZmQUcC!s756g}X+*V#Nrv$F;^3NM)ro+x# z*MJ=y!S+tDRxG7p1#ko4@cQNB|LjM9_Cr^Pmw)^9;el^aD#b0KP)J`B8Zv6|p;w7% z?S|?{qzpLTT;t`}Uh!|p#+m2Z8mzkP8$0$8avvL!ep@{+Eo2ch=f?)LVz?~@>*WJH zg_WQB%olza9=&3(ynOM+3*aq&r>TIukwX?*0r=N|=vBM>c(%BT(sv=VQEF&@cPeBdr& zFq@g{mAR$jq-|J~B6FWu8TtwM7p4|eTrP{fc=q;RdHd|$A9(P}E1ySMz62ar-sZHa z2VHhyAw)WVad4l6M9yb%-*5xH9_%!H_rY%5D0X&qISjeYT+iNTK0Hs%Ig|0nJh?^K z)CfrO*$z}0f`ee|8rxcn85OpL5t5yw&}PFv>ePUD4%^Eq_F&Or^yeHl>OukAN$&}O zsGD-s$IN0z)$1hNr50<>EJOc`_IHyP_^epBGc<3}?sEn=$#{ld9`c*@i0z1Vf6n~+ zUxg=iVl}h>rT$R{+;hMstQgGr0L;2Ro#xNe-*n2oK>A21kjmVou(P`-vh9SOBnx4L z9iWiHjT;pr-Qh!_&?CYpA$LB~h^UVo`fH4CoH9VZf|O24R3GnQHDFz^e(Fo_eAnlm zuD|v6^5vJBEm+MfS?4LXI%`IMf^<}J)Qe{UOmC>1qe1^5n zJo`^`i@NzIA$_!3P+P;g7;bCB@$eAW%fUYTFi4U|X)sJl`D9 zM1>9aUaZo&ni-bnvpiQ}5Y)ZL+N85RwLf0_+wD7NC#R;)KKzURri z@BE6FUVij0E-pWbVyg>-GK*)R>#x+X|3-s)nxAvycwd~vp_p@{`M$toUir^IBRcmB zUFdqpa&`X(ADDY19PLAZPa7SGPQ6JU+a^r>dNMt~GdXVL>`ZLXqLaxmi;oON4%j|o zh}pNLX?z)sXnU(Xu)oMwrBLV6%7EB#9$hS2?3H+KFD?JYr@#D5 zjt^h^{$nw$&cGEhp{ z%ctIG#RwVA%V_w=no5hadeNa70JIh5qFufDrO*H72X_3v%M#}-W5=S0BLgm9Kf}o~ z0SwL8tK+;UTF?$23Jg~-u5fvA04^_K7Ng@h?`*Afn}q`#pB)N4qy;`Q)brqqRB<=} zwqAe7J753mU-R;Vi&t@Z`6Iw#ML9%HhfbT7O=HZ`^P!mARBBo6VnjTPdj|W!$o2WY zc)xMj5E5PjF-U{!!+CHf2R*jy7l*-|$?>Cb{

czkv({X7fvcwuyZBnW9*XurWB3#zc8yhmgb6U@fC}xq_BDk=dadZ0PV6-C{@5l(tfprDRa1)p zbHxyU7-Z+3m+!qXs0b)wFtdc2%`vc+rtKxWUlhfzF(1FMv-fwNzq0nw`R(1cePgq- z(`t=?a>A!KM@FsHX#1H6iI62`?ZA7VYsx#6pqFn}FXU?6WL4Q9Z?~fHnPHe*F&r;y888qyJpxgUua(h0{pMCt*iy!-i zPyXKfKKtVN_kQ;I^WXNlmoNPBFTHZ*+rD;j?cFbI_D^1|Y2=RO(UR}2wed_xi=Jz)IiZBz!V8Aq7u4$F!q@eo*x)bR}J{OCQ}b&ZFQ zEn^h{23!{J;g?1U-C;AVoax*!un=*S|A>eJ$d*Lr=ZNfY-Z+1y?Lt>dS?XB_@Z=2m zH(&V5ht|8RKepTM_DY+>8+M*lyfkDRhq$Uns9E?T5R4CSb&YO0#^K=}{?a!*jJIT1 zTLJ!f3v&FrU|Wz=oKilZ?bLaM1Q(&WDc4H#^^V`m_fiKhp)sxD@e(Iy2n1UtCQ6Vc z0!0{D0}Pt)x#ks{e#*0%1xdMa)iJ(K{^p<80Bo!K^o1+ee!%42LxCJY+X3);djvM? zZnLV!Xj-AyD_9r~K^T~#90Q!!k)+O`8n{ATO}`G_hkTH| z#bSjNS|G?ILV!9lh!(B&#iV9$iRPt*S%o|U*&FH^+8zXN9X9)e!!NwP-Z^*A$@7k| zZkg}$x~O=G@^OkxFf}wKfVt3nVkJNic>Lbe$2PBB+r0boh0BM_D%i>!II_s|mTXty z1M5}j;Qp#m#cRiG#s@<=(abf-OCTn8ftUhmgfLBvAI6+=?F|@WBSPH>fP3vKCVVnr4L?=lT8X$o|~3J9|I$``5QV`qFrIc)#6UnK>$J zU=Jd^2?c1-Ypx4A%lMc zl7Xdw%vx-$Zya7;KGZYarKe%@>w%nT>&Yod;>$pU%~Q9ZdTEj`z5lt(>&GX{$1o_C zFe$p2ww5r>TPX7aGl}+9iB_rcw>9D%<2jE95$|#5b~3{2x}hb8hOxpFp&DEx&QMSs z=YS->ZnoHjP_u)jC)5(KM5&bN@8OX%$8i`IIZ4=CQd}}|Nl`5aL==e3jDyyhZGiSc zW=zJGAz%VBoAC50g82s^+K&y4G^`OSDp}IlkZ4^$@wq1+xz=6%`TbV+mZ{CilXzMS z{8K*&UwZh8aoiAbsLTL#>JlrXJ$%Eh$MCV+4wWZ>KidLcbfJa`9M^$ioBCcfzj{rJ zjCzgbH8vBHr9Pv3p!mKR3*(_1fHT032p-i=06%w`q5CpeoSb2*2Z6l(*o z1%vw|!F0IyDo}AhjD+Qki_O9;xg>@Uuaz#0m73!9F{#N|6T{DY7CY$w$KHE~Tb5k) zp}$qN!wENc&S6qd9;J~qLZd9901^@s5=JC}z+f920|px#Vcqy*=Cg!!9@{z#-Nv^7}OiKQ>*W~nq@CLdFATsj$WLfFK*jCccE8A&w2dp#Vy0A zj-iQ>#VK+dBiHkcjp01sM)pz*eE^l!q;VMrqEN~B$`CN)*GS%Sthk=iMd|s&OFe)m zK6%X(cn`6}rx+Ms4ioya-4kI;X;SoL@s+)&ua?!IJ>~$0r{;c*53yezi7n%P^|h z!tm-ZZ}5~Z1F+!jVMQj&wDaOE0OF#+)Uc18{S|!cOYXv9;J?oT|2YPnB?l|KLy|2Ok}E}ucD-?OHNoJL z2Tl)w2bX~l9lM0zzVC||B-3`+mYPoh=yocNe=uSNP5@_)?Av;Ok=y;3E?qukqlq}n z42Hb{vd#cmHv{EBVpG(T7)FvypkQiX?~FuTOP}??0f2>0xpd&ERP3rPB&cGdC2F7R zQ#ZCobIW`XhEK$M!qpwe!D(PijeKdzRWz=zU|j1q7H?gXX>C18Z#Xj? z-t*Z@3okj=>b8~L!H`&piiUFL0Yp|Jc{5sHT0Stj|GJBaYY&3rygGpj030k?U4HU);MC!LTTWQp zxaZ`_(=$G8AU6@5u`mhmigsW{#|z)$_i<(}U-;0dVX^Gll2jlWbBMCTrA1JcaTXHL z<%t(+^z^XPN2;TUs1Q~)bkgRv70sQjkA5V{F`04fL z^lN%il4g>952%6|4Gb(e&LJOUu#(WofN3Fe9~Lt!Mmu1?mQp zc5D#Z8-ee$1_~#^IgGEskx|t<{!Y&l1s=SvvI5{wK6mjoSBvxmK51Ym&O8qz2SZfZ zyPU4Udm!uguywY9t+OeN1FY9UWu_axSJygNz@^I{a+>|qB;&-jS4yzo8xU152e~7f4sQy#V6Lh3cTi1=dz#t{ZD@J$mv!_Sz{W* zbOJq-U`QMxn<=A*kpl}x`$|Nz8pz){Fia;QmoeZ|s2mDuqbZjQtS=CIkGL2j9(H|{ zb$UtB@5bbh8jFwS-gbwu&qEYHCyJt}czqGy@sj5ref14<|7aWVXj8laBrba=eO%|0 zZkm61bm2e!-WQ+z#@5ufdMjz5XAKH#*_B`c)FLE}8q#J8iU?#mqQ3BsQ)LpLF{?Dh z{Y1&YD`vnk1|YGFb+*fV((wv|)XF-X=R_=8kq<{)fW%@U8l#A6o`U2ER!tTmd7w?< zInAl}s22qqgI+P!?RNJRS?iv?yZ^;qTc-Y>UBF<9y((x5?Xg$^A~3@tBA{eEIgk$w zvb9MpU-+q|V_*E1-s0JbnZ%N@Rc|U+p!kZNUxkur7PN_jO%0CqJSGH+5%1EE%00ag5a z^tzNKVM62I^|vBs{JR44psGWqt}*sfj`94Phm&NsVjD=`s~jUre>aFD(29w?aG0ivx|Z;<{9-n?kV-pe_p zQj)+k(SwN>ByL0^cmud7CYRLXJe_FtiT@dBmp+Lsveqs4X zu27V_W_rdmD;?^HX-mBqAFb3cl;mNP0g{P7YwSMo8;yGNc?(xprd^TM63b(1NS@L5 z%d$=!CszsUHfk=uhWt-IzvnT;|fTO1GkTZ0hz8rycN#q1HuH9JyWTmfcFb4etET@??c@1 zvPwZ7s24*__u9B~-wwd}!+vNPdy?S=ZB{C-Nqe+~tz5+jEY30x<0Kfr7VdLQc&i z?-9dcYS_ir)*{~his$3{2#?PI|1Jeqm}aGo&Z`e=gdbNR`-4l)z@8`qyT~D4La!89 z(zQ@yH5k=>kqx{A!MB-QEBaMWu+p@SUCA$rTco-*P{|Z6uTNKPhYT`TZZwgSzB}N> zrBGJaL0RVpfp%@!h|G;JUM3`#aoA9H?2Fzf{XSk^?{Cts@oO7?OTRsUq(Qj2uzs?e z<83}lsc;-z1aUtp=%9MX43}(#_0}4Ui7?TOQ8*=*>LvOPfISl$-%=>bF1^04s@5VMv)sLHk`rCi!dkYpQa|n7_Pmp$wAf@<*iH?qKQi1wf_#h z{U`SZ&Lqf8f}xF&#R-NsK^~x6Vj-L$XaGI zo+Ea>uTmpcV;g;gD0C*~LN{4g;P z*8r2W%;e0kPVd-ty0f-E+wOD^Mb?s$wR^9JM3`_L*J1JM;$74G4qri3djz0?GDayN zB+M*c=yiT3!iS%A}uHT`Gla zKV<7h6-n>GW9u~VPpm~zE&x7lO8Gz6D{VEL!k2|R(}N+P;c}$C7M^`@H+BMU0{9UF z>T{5!tyuJ!5YsUauZ7`{>ITjV)`rXj+h-Gj?LVo_97If=bPJs)7Ay^Po2un#ZYJJZ_+eCq`8kkws3su*p; zcu3@ek*$(X4P2n?r}7i|t@vQt+*p~;H@&YoPBbh*escTmmwlcinU3iK% zJrgMF0#KWnIr-#;E3ZUc-&cT82=n8uPb@4HQ93a_5r`tR+g*5yG126$7hXc}%N*0( z33#S>7_op*E-CUgCSO->AJA^uIE|f&j$CaIUUqr8y=!RV$ky$7N%ssei`;}9p9V@~ zSAR%cZx2*1Sc-e(vst; z%6N6IYJge*>K-L_ZSoqfY)OLwMKKBxCu9Lh84G73*m{#5J$`bRO{Z=>ysdt+0i4k+ zLagEQ--!1yWA9x0*!1+=g(r_c`6`pvYq^OfJu27B(Wgwb1PkO2e&CR|dl}=s#>OU(k3Q9o_B@BRAh$Gk7KlxlumcMcYbmH>etPaJ!qP>IRIxOpcju= z8QgFpZW~+T7KjocZXRv!Iru*E#;&X^KR+Tekuk8c^ug_6i!!o6r`sn(_Lg*R?vt?b zIo^{F={w`lgPFZjS_-T;fKTqM;S`O;@VsK6>&Bvk@;Wkmg$P_;fAE~B1OO}C9Mzq8hos-e zT?ck!55Y|UKW5DkB>#=?nWK|-eh5OK~n^jjUc+{+;&65k-P40V@bqTj-Pli|DXy$uI}|1kyp zb_%q3XxY07??ImTE|%-RV?4YP+M^%u8HY3`N0_G&Cjw%mm+o!mB05GDP83n)_wv1? z*FrEPEmK(*$SU=>=smp;lI5vD_?L1naHmt4JVXncAkrb!+@A_Uq=eT(hNBP)=kmS^ z*s=F*_I{#jziep9j|<`P=dK0%+@|jb5Y^x=uMCc_4F=x|*%qM5?8~ykK+8!3wsy(H zXsxe-OoYZn1P|WgU|7<^5TPhspaijo$o*s9Y|Fjk%$&7;BblANO$c!^n~{0`a=Y`Q z`Nh?{9Yx)^5uZ{gPdN(A?>2zm-*79qpo~uUI5&W768O}v3G=CE-?;mMJB}Q-S-W>r zYjK{?Yau}nOGefir8*zF?zoT6Igq%oDteJIDOtM+4M);`zVC?L{$4uf3~v(R=x5G$ zNoD&F>yKp&cvnC!0!-OJrV$0XVRmyv)fNTeC&zWnK(&cBjoDh z)a_hghC=#rYDE_)`aKLgJq)@7WP=RG5z-_S zE0=e4mKSYeWxZ7J4DeiZjs*{Sj<13D@P$K>=WI3Fm{XxTfYl>q=OV~Rq^IImClnFW zyp$y}yoHE>q{xxva>K`olGN|T`j12;_uD-nb1qm9WQ?o?yS*Awg5ko0%v$vxwKJvrzQXr{yz>R{V0D+nXs(lgX^t$IX_>OtGJ2$ z7F?<~YFvIm-2Gws@O#)UNFU(E`c;0ex23$!SN*NKQ?zbvLm7Q-Opv!$Ya8JhTv_<} zQb1q0*>l>b@ejt3Q6eH_*nuz%VZ5W8l?lrs=q|HLu0Qv{#PsCqne&&9xG25ZnOIYL zRY)Y_wLaB$yrk|U18XeS+FdvwVX|Rmk^+!SVPqtLC%~^-GZC@gML`fi1@c=I1aFNo zaXMSr=*ZRf;Psc5TQ6wkc)~W4dC>tR;<2J1?YdqYse0ssigqDu*-B+th_xEP<2z$~ z;O;{+zjg0z`-W5AJ*Rc$k{x!tm5Y_*UO}?m$$K{2Sb#7CEZsZuZeLn0teB`b(<$zV z@d(9T`K&?ia=;ikL-0`qTWgxfPoCcGO?~?Cj^<-2uuw&?S05v;`t8&46I-|JeBg;= zPrThFsVz)|9GdHw+s3O}N>?)J2;d#jvY0T)P;@g4*SZ+C2JpiI3B`y=GDyifoVqy) z+z=9_lf_HbM=fJSso-^HU*dsNl`;_Vy0zjOLXQyd0LPhe&r4eHjy*j9pq3u770KI& z*h0mOZQd-SuXU@(_h6>^o^-dF?VIkj8u{muP{pFo^G2C|usAPJ3(Fy3HH4GZW_9XK}& zJaXM^^7}8lWzPrq&uzKq;^`B!*x>z%gqX2;<4(n z5YC~v#OMzm23APf1r8R@-ov{B)_K%WAno^YXtIf0r&2cq`~-Obfq*D^h=RO>@g?i9 zN=SOxj%;^20pQmkIYWPX`r^yy8&m&ly*~MZZd9AeO^jU5f;XC8S#ky#&&gGW?E&&W zD4W}MKcoXkXG3L9 z_2dYs<*FWpih3&rz$*_G#>d8i@Qtud0qBwsl^#5)i+H5YuQ9aPSzJNACW_$2%JY$hO()FpQ>Si@ZGyc!Ccl^h?Qy{@ z%o{1-w@pRowr<_^z=KC0f0H*hK@_7P7AD*ReiwPxkiDc9)a_5!6C#S>G6@9A9E$!B z!%i22UWROtai%dFBLX23VQz$J6RI_N?!Wd=`s#zVVp|0_hI6mnUS+t4OhbyRVAM&I zda%M%&I7dy%^9s%m9xSKxX)a<&w$>yu9E6 z5zL84t$tx@+t!b?mRFwF?{#;^7KUknX~7T>S;AVYVrDV>_s*pMN?NP^TQ1CBY1k-2F1fS{Ipqny067QptW;YW3ZEBn zd4W975s^h?tawrQ&B{eIII5&mIY}#mft77ii3cJN)CL1g^jbJFIf1+8nr;gC2~{c} zV_%M~d^ci9vBwEAtGLWib{H%GcyIvx@_k=uJk%@RvOKlr58JiLnQoMt3`Wuh@)&vV znWh~t8AW8!U+*CA3}L|8#R$B`$a)|qhlb11?5yH?o8x<4c6+uT_`XTtcM?9Nt%Pwp zCYiqos4>i~&;NwimiITA3;b(@#!B8<)-Uudd}Lg{g}6m9k9f{h^NZUY%$}hB5UT!- z-IK3I=hhh5_q^vl;`6Q^V{}{_sx^!XwDBViAG<#eVfpdvdT+D)ByH6WZB|BMvoagr zD;$=n8b~j}2ntg(&HVVerFw3n7sAGZY3Z{dLvesHO$x@q+8EtlAN@g&smYZ4;Mr}4 zQq!uU4fVLlQ6O0>6dWsakl&ubS#3NYUI3F2qT2QCtoY7LtF2eew}xvy#7R^)3m)(` zAfyn3`d#18JlRwhGn=#`+_?r7ZdTUvrhpF~*&2WFrMK^P*Kgfk?=M}RY%MLsZaC!Q zHyK3WIXmFZFNvFxIE+a~R$ojdlPdFxu8L^)Ecu7KGBMg%iR|`M+@cE0c>BZ@d zX(L@ufW;UXTJ<3){g&=`ImbDzFHY>({mE`??QpBzI*>*tB44m8+c16|MObNd%+&6E z+hFS-f{FU0)T{J5%9BUtzjQ$aG$w&Rzj^6yQC)k_)@?b`V?MMS;Y!GdS|RoE1Bd*m)$w0y9O1iIoMs>ZU`u zz8Nn!;eUn~zBsUq`@?-PLT^li%ny_vG_&0bZ~4PV=3DeD4?J?{Y<=pVtTm?pV>_wS z&?KyY5byLbUSb~zfb)ony#j-FA4M-mM6n=`>5m9V2uOfy!J)@<^+E- z3;fR*xS}Im@pCpHM&*rod&)T_^jiMY`{N&}K`mdgiWStNHKb=@Oa1yDrSNMQl%*OO z+~c3zs!|Rz%P;SRe<7_Tv9QDIuHfWSA)hC8Uzb+wH7X5(uWP5quYc)4fiMr>9sbs9 zA?S1Cof^L%{)QlY9GD?h8Wg}Y+l#Oy0N$YQ1KLr4!}c<1+3O5N^1sQmo!pF&; zfj4ixy1M?7g_ZV9yI<_Lwc6uk;c^K82{FT68gEb8n)04rCLvA>o~Q|LHJYCU-oJY$ zy8qd??748;jn@rnFx?0-OWBQzpVCoGzdFu3YjkmiF?40^y46NurZ^g2yn0CHp!kpf@bKlAr9)0XK zlO!|VSa?0B)>mmY0bS3P_J(+re@0!xp4jp#WPe?jqv#GX?DR0~50DQskT*z-MH;8< z?v^9}j94@9oLW%F!CIaRPNUaLP&b_5Oy`-Xok~ZHGo1;ddwlF7W zJ`dsu!!)6b%PY5DTv>hb%+}di3mh{*tFmi#Nk%?o_#~=0S!{0G_Bq$@?Ob18ITBlI zj5N#;5XUK6ogSL$#LZ@A`$u8YGr~qoJa9jSCaW&+y6$+ijD z_q^vl+(D82JSiE#1I&Kf@T zoI`W>z4VTQ?d@rNedp@sw7#M-p3ttu^S_iLF)&S?K!aZ^A9|B?v3rj%p$5G zbL@Fy`qc4b&qS5Wp6QXm`_-x7EktgRqv&VIdqd>i0bHwxqTPjC@4&a(@T=>fMMZ9SD48G|(`&zq!U#bKDD=PP}hoH1IivNuxG7frw{8QakS1`$(hs0OtH4o*P zO!wUPQQ2XriYE6?P7#sHXhgX3Ma7)*z-pO|%a`SX@0_Yw1g+e&R(9h^-DRK`#u)Jk z=mjls4JZ*12;6IdHZ*LEULS|hGAt1vlnWUU#_9;mUh8}H46E15tVpas$k-S{Hoawb z{fSc-uk&&3Mi@SfUdh0y)hYr)-5<{BennCDg;>^B+o;tWsMWv>QxI&3*Qo(+Lj~i? zhNPwguN{(VZbtUF%34e=$0UMypLJm@iYRF~o7~*ai@O)rTHknOrTx{NfjfsZJ?AW2 z&Uxvu*8a)6u7N`>SK`aFq7cI)fyX3hwE-NTw)n*LJ15_J_Z@q^QE1W(7M(O~i$BSozj2!6)l1OcfJWi3tNqm0c%JuDb|J8G|Qy;XzO1Run zRS5C)L;%^<`j%~<&3pa1?&|7YNgR{qP0Wah(C!UTt55HYX14q$OuSfakwV!oO($E4 zo{gYb(6$u7`XHTs{E?GqzA29qWE8>LNb(41hvi{a+$5O>2gnJtFFazhEabdFQWU6V z85-FD_3k>-^+n9(9o(^X5^uiyHoWUqci~kx?!w^|ADaW-J_-Cz3=BB?mApr-)Jj%J zA9xMi8$#c(%la~a-~9X;{KbW1 z_<@6=800wP8$0HC`(W%cG_oEh+e^5$?(yBPxijAn{K^#Ye@DRjX1M;Fgi*f8pyL%@ z^TMw;yQg>tiMK8AfN8n$c`+`J^m`}^N8S;X)4$_o?0eqxp6UVls4u>3xO|=t!p1!v zj0^CvaiM0*^)V9Fy)fRfuv1|@PuG_5`yR~PF@kKq!=w*HF_wK)U%xOv|E8$ch@GVC z<8s;tuG?t)B`8;RjdHy<0?1%>bsdE>Wxni^L4wznOGe-r3tqO-up$CpgEhSF#Zi-N znR6wqNkfzj7pysX5S%eYQ4~9y%no30SnTEBc6Mp~TQ0YU-43EBY~6a!XH<kg5%2N<-vDEc|9tT!i7T(-BQ<-p403Pdp^Mv#ZZC=kRmWaMB?!QCd{ ziO;*XWSMc12I$FmA{aTV*vAIBG05ZCEDiGQ$FDBFdv@#W`%_?{4){a_qFOQ1Fc!>F zt<~7R^O3>&+Rk=s^+-L6$nr5I@MN&K-lCa3`@R-&{XasoW&!-i!_~aJR=(5o_?O1QSb6=fG7tJL zl5qsLVI+A-2`W^^8t~Tv;{uatbmO#qVXG_aHI+bw z$?0Te;p#fI2l)#TCx#$roQfq}wnGPAG%j_z!iYd43u`Spoi4h)Atop5h%HZkB~i8j zD@NjdkReLi=pcBK_Ia^d6j*nc@7}YR6bdNFpr8oOCMax*B8q1_nR~-xtNoqxi)+(s z{e0k}`Va|v1>iHWo(o87Zek0;>538YS{uSZIpVaU9Q?w{NpLb1CV@w{r1*EY9N6-O zyYISg`)p%6Z(Y4IJ6KyX#urEo3v;#rnUHx0k>FZhV@$-EmINQ9>pbc~V8Sj1RsjQV zElk?Lne!K}>vsn)yl&r?zu+}y?i@$|a=T^iv6yPm>Am|7reApUvD;SgpQ zE*FXR?N!K$8A}1p={S1XyJ#x!79-Sw-G|V1Y|%R$;D#BpZV$um5QAP1aD>S6erQ!L zcpY1kig1l3ju6flRpRuTG$L##(>E)G1UXPe#(`umN)4RA1;n}0jm02I(Q}ASoj?B_ zjj8GRsn|XlNdTCUr2=`Q5RwIqS!vA9o#?Hu>>IS!4ki&<14m?mes6$@=H!%_-TsF# z$(8cCvQLV|ivG*K27!tmyaT|KK@K1z49+fgPaj|De$y~*mWhHw)rMnPg!jl_)rA4} zaIlr^5#@a(-F56W1HAhUFT*=uew};X?&*trB0RVi__=A|J12nONr83(UaMtc45-4y zG$Tu4(kI?oK=3fgh{|)2KX!S5|Mj^?p4XY#`upJ-xQscm1tbl&;1>uT_89U>H|^Hxc@BqaThFOl)wGPsH1GR)WDSy!C>Nr4t z4+Vo?xmoxP&U?wo!wi%IRs@S=Bt?-3bk7z}AUL8*vjQqdu>hV!b}050>@_ze*2ak_4{9P$KLLB zTetTHD+{~VmX;##f!IbI2o{Nuk(|w?Rmf^VWi9HYF5k#Y1msyZYLXFe3~arQ6BjP; zTWJmV-L!x1FH@kU!h%30g8;X;JzdB7eftjXdgRfEuN!z17lx0tbb^qu+%K$guL-NH7OW!uEPsW9mQLl?Gm+`R4mOh!&B|GupEm%HB zJ?mk2G{8^2>s~x(&a7<%J~j>fWQ`MR+!q5~<9V6HfU|=c@jP%^U!h?GRuG6k8a3^R z(`GILI5q@+@y{PPygV`Y+ufwGKeMr6Oe4S}^QD{!3*)>(-fXSEar z-X%gFu>+dL0F%8H9H1`#`I}#y-JIZ4Gr&*9z(W?o+l8JPql)O!aR?zC4g%w}q`fgC zZd_0TJU0AiR2FPnR)C~Dw^zKK(nhwZ^;a+twC-|{`5mP-&6SqVTnl(UiT{R~c-dAz zo@TQIsW7xm`SP`2v>A*G%WHi{pe>LxfdFwBuS=L(`FMb^a3IFpJKmma4I0-|eTNJf zvv5YHwYZWtW>?RgJ$pw|Yi@Hy!XycXL@?{HO1mn{vD)54hJ_WcTLG(UYcMuJqY(jy z%CLFoa!z7StmTa|b^Zg{FU^9OC%E_39%>GDDtGXd8H|{>aK2w}_;ei3;1t0pwZzBu z+xyPEYPCD~s*6`wpLcns{pxmxMHicKfuCuFfcZRnd-oNGJ7FgGSq_PfKQ;UGBQ*|6WaPaVf2ai5>*aH?e zf)i_)aV`n~g51cuuQ&)o0a$r68hE9+!`PhhMq&*-Kn5n<)aF@85ZH3_S&qEd$FSSO zur~n7$vzPoM3!ynl4X|j#+4n_Yvo)d!5s)rEGKOl^A+Ny1Ms-2hlj`AmuvaCC1fUo zk0ZJ~zwiP_=7w#}`mq$4=M$$Y;5xucM;x7-oSizpbm`*rq9WTKk)wzR>)k%4w(j0W z&8c4lk~KckDX3(Vc~3g`<(keXCqj7$;Bwzg+;{5oE3*3JE@$`@D#%hmxr`>r(Yi}I zR7I+ANQ*wAwFP|Zt6zZUZ;AW6fIpsKH}CxkkQwiIQAUSd{&U3P1qA__EVq=RPUM1m zr*g^Ebr!&X`^aZ&r>XXDI*rMD2R2HE-h;@($w^=&o~j525iEwS9@-0QKn}!+Ia3+Q z+3CXbtS7`phNkPI(O$$pbnt_3xi`PPhR<&Sejowv*TnhNt8oxs$ zF68TBJ?#45q*+?0J{Ah-aoQ1juBe|OEH~c94WPH>eO~3CTpw9eEsfo2WErA4LYV+m5b|0SfitRsEY{i`^fQNMBSjJ!K50tU2T^M3 z(sCMKU*%{__C2W9r`I6Ig|Q$eVK5$*+mWqsvGB<7(S+UuCL(X+nJh|f>5;wbYA=7y z>7~}Uo?Y&~bR~~IlqJ!?S$1hF^N^D#%XUH1>X961ZveovtqbQ6k)D+35dp3STABnN z-c!fNUU+!RpWSow!Mf?RZd|!?DJt?DHi|g25V1AN*1FPx0aP&SxH_?DN*pRi$#+FSEprav|`h*n;~ltFzgLs z9U&$O5;InWk~{}+ls*|&?!@oF9}gH)W`=X%HE6~)Um;>EnyFpdF8qcFfM=TWFes9g zF0ZWK(94T^<|dnuHG#7!Bx-(S9EmOFTK)WVv$?Qv;nWLi#?M&ekvWGRESlSP-3*)j zCQJ-Cj*M1(Yqu0sNdidnr0X5RP_kd0Zs)c8PR&1iP@B9xHv!QRx ziSJ(q@Y|1G#-|t7f37<*`;7w|)iW~0W65)xhzP856?1_EqiQ_39!h2YzE6qyk3DDzfxmSS|$avyRuOcDDI*Y!7?3mh$a8 zCLcU|d1cEWch8BF8s(B+6T$l{97unN+gOMd3=*%Py2q?VZ!pCAS{HFzL%lBBe!LRD z{%#aIDd9+0;kWN-_dFH-g5ZB)?YF}#tH;BNqF_A+LiN`w3^8DFYq2+4QvH9cpLP^MJUNEQs(qVteUQdv=2 z(AkiK#G)udWFp?CfBv7~#ocpVWRnJGsqu1WHbW#{Z?A9`?h*zUi0=awy# z27aCuIiOGMw*JCuj`x1%(Qj`}Z+my&##@J;1u`#7aFU`32C1=dg95Abizqr7BGO|f zgksbS;0j(=Du!s}eKcBEaoZI6AN+=|!c7rQ%>iGPdR#OzzJgf(BR|J~j9d>u={@9E zN>}5*uLYxYxUnqBoFVnx=@>{+3JlPaF9x7>hS$S3ZU*Dm%ikk7*;vN@*pL0##>)Mu zd0w5%y7|k;f!97oo7_yuQDr?aW3C3J?6fckeU3;ee{^z%pykG|UkkLH))!vitd6i0 z31c?EVC(kTOQ+9VI8@m95XGq}3f`B>xnYHI0wp8%>i#QLbY?uc%Q^iZ0WcO07E3E@ z$h|?c8N)`hg$5iG&Ff&6-O(aE*?nBOAt6CsDqI=Q1c-7Wl*-JMi&Xh@%b*<@t3b$+ zv4DyA2)ZPpB1)(GK6>jyZ}`J!m)kEnzuapr_IGB9aMCoW!^T@#`F2nR`$0}MEKL&j_luh;@I&U zJA)#nIHjEZQY<7lp{J7mI4pid=zCGON?MmuMX($|G8VkPF0OAdE_vyR2b5E_>)c?4 z5srXy-kDC7sk5@I?XTvz1pEk=2a=ZZ{&S0S4_|G+Giyv<=M2X#n6Y3kA_CdU4PfN( z7=ni-hu9A>F<8TQyyE%(a2*$#9>1OvzNjc5Q8;vcI1Apt0N@l5e|~=Ho)3QdfnT&q z`b#goU1_ArEH z!e{lK{?&5V(tg5n>?_)~D`buNJjfUD_Y5mrBJ(n4~ay z^^lb1#Zd-fAnL&YF_VI=I6c(&<{MV~gKxfYb@{oM7F*kw+QY*c zC0(Rubx0h=T}a@U2cPx?nHb#0iiRjydrsid0J$dcsacEPyY=9<*6lYPTy8I~?ps+{ zNR2DV$i!lNv+KSLwgOM4YD_8`_0GXN$L%75sWs`$`3tk%cJD=p4{SSTfpf7~pzLPn z+}|+>DKMNg_~31~9CWA8T)As)y;ZkSOb*pnGy=Cnx3#H!rrFA_!hXrN>{C*-tO5 z-u%9YAN!W0=Pvx(L@mAP)h~EHZ6lxoJPF{v1yFRPt-tk!v(bYqy`Sndrr$V>(kK^$ z#>kk*6d{2@dvOiDl^&u3h+tv76>1hG90ovv7#^t`qBd-!-nxR9UB455|7)I&{e<6} z1-_#OT&%{$kKpyo1*PGT?#F?Gb^USJFlRRTUXEQkmqOYCPs*TI`mS<*=`x%wRT{&Y z#KzlG&Od#p%!%qXQeIy#&x!k5qXw%+k394x3S~&ijrGWPKdOZ&gp(s=m?0=a!@4*7 zt>44vHY-0~?pi?F?(jMJL;xll_Bd>9;nMt-XW3ePizCbKRLMkC*1=x@fD_&m3q595 zJYe34cBSjUHb&+>mRHs>%m~eiM3_6VMdkTW3X5tTQi+XmD%PDf<+-}ta@OGZZ4zCo z0*nZSE8xB3lZA957-DA^iAfjqhu0D%9L`37jU%M>gF}pMQW;A7Krh6TF^uO}mz=A_Mp6YE`+1h6|U1_n*w)7xTv^zOr3kKMR;&%*MBv(Ig{ z+Z_9@Yk{ih7@Z)Dn`)AXfR-^3%y2)FnmKjx^0t+B{;VShwp>YpCsZ&;;%+yb%LxhK zCJ3Lt^QK*=Tgz)Nxwx>{a5f=|A~?aXcf7d3IlfsqvgbrPD`;hdo*51pzr3xTHqsE??fUb#}`g6Bg&{z{x}&XA8quG;8S0 zbR&8G<@0B5tXXgRgCR}rz1|_6I00{uva4K`Qf}Ay{8M0|&0eN;$%OSsUpT&Jtv3Dr z!=!F=_-gx~lWmWNqst+<1`$kTIoS<7YQB%D-YQ;q=S}{(+v*o*fuFa)=k#5U(`2JB zL0Xpq90Ty@%e`Iy@8c)`;RB1y-?wVbyCPRa@3`lMxGo|;3tUKm|3bj$djPHicyP_* zy`OpLjos;O-!`!E4reT>kd3@SL>93#Si7==0mSvca~AqFAxInsU$ z)9nSk@viIf9k03>y9vKA1^iF~TsDDG;za>?CNR$5H+ycJH*W?iOtlUzzggWnzn`+s zl7Cfou=36yGD7FfjJV@LbxiLpAGo^eoxb!ORS$0LBhP!j>ooehM7Jj<{Bz@WukNp2tF$ z#g8usMih>*YRh#*$)Mv6ucr}Nbh=%vtaf4J8fpy#?>U{jOP zSy);Bnu`mo-@LHi-Py_T8J{G%w;cIe=sswnJP%05D+UrZhohi9>Y#oTIJ&DzpM3T$ zdp?}T6E8k@`sA!Ha!FxlP{=7rUJg|+@e*5fR6$m7Sg+qt{r-1#m#!p5;nAGi9oxydIT-stVIsj-HMz?9yI~%C6tbSY1mI)m zyUG3Mm+tM?r{6ZP5gf^hR>X=Ak6l{)+CM&a>R&#vwET}2(&n48dhL4K&*%k*58|HL26h3x8t_L3 z_?aBYReAWYAN*7_Uz`1|cCGo^oUG9(>xc|uieQEwE0-4Gdj(=2ft=yx9OpQOfIQQ% z=RMVNF+hFLMzeDj?|kXA@wON4#}45Co&tU<0Tv_hss{075p<5@b0a97Dkv>HlV`_4 zpBb-j{QLM{{T_b6WXtygT2W9nodRL%$Gxt>^W*oQs()4gnJ4kHa)7N z>_!u%krQi%C$)(1k{Fn|!mD|NAR-t5SR41^jwWm2O^n#yWLT%10@JaihuyuhW8f9g%EA zWKD`V+3w@oo_1kgy3if|$f>KV-+OAQb9p7BNAe^AqDmlJQ54E)5R99M5EY7pCUEAa zZM9!{-mM4b=g(byO?z#Xyyay8C*uI9z)*VTEh+j&FGE5g6b1Nnse0XJ&rcbO~Jp1*7en!6Dq=_9ny0Gal!CKizz;942Fdy)e$6e_e z$UtaGHmqN}|B3DMcH+JLv@tiNSm;6Ku8bQb8x~6M1HUaI4)AJpm+``#GkE3o+x;wX zJO+M6E#s?la?=+*_Wsei`Jec`6K8(@bDiGXuQn!b?baJRhSntMU_g6^J-qqW>-<4r zI0L*d0luXGvP|68e|n;Yzr4Ki{hh|lKki3q$}9T@fJbT)`0fxZ^UI*20iR373Yn86 zHJrkh74sM#sUITgu41Np1>gDFufiMd*oJMuk52$U9Rq7IAkpHYPzwD#6WFZWX4im? z{QT*D>or`X&anJu&oVn;`jDUeS9m}OEIf^HH>r=!uJTEZsiLwyRWwcbZc;faF&{dg zHbh^K0|mnDslJDQ6~>WKmI*o=)}t`~TY;{j420Lh>tT5cIvv)3t#>_BAVt0~WCLL5 zuGv31cmB$Adc*8cl%%GBBeFWFD|eqp0an+=JqWPtQoqW&v-50gb0lbt?jXnV${O;* zpdl`8=f&M3|BNJYV8N?`TJR!5xwITv9?LeVazz;)JdwlZ@^jVm(gUrD@voi_hz!(c zO#~7Gl=?UT#hqFyBR0x>5m(QIPnzUvZmjCVcT zxd~*G7N5QI$nHN(lZm@do;tbRd2fj^%o|=~0ks$%+7DWsnsS2I1;L6YRkO3da^} zZY_q{kOr;pt-EKZiV5IzHKIb7FF0r`k{sFQvB}uH;KHSg*JaMrw!H@&lE!(8;-ds3 zWUq6-8gJHvnVse!tc##~|A}Sui3>}2cbl{SxNjn+0TJHD@_t`En1#EeTNw$FHL$)w z;`(R~TKIb}eKz*iFercr+Q1)N<-Nr8h3;_cpB_K`_V=H@@NOmy3L{h2q^3#5))WsfpnR zIaV((BPuK+ib0OIR1!Fe3<(dg@QBHyRt%7ImNA>H;~%~GRe0HrldbK*znKL7Lj<&p z=R~9=^fAsy|GFSF%4m$=E06|g1!c57WUq{dY5{;fnTy+p@M1)!>JU4?7;o$&;?+jfA z;d`}g*hU5Z&6ad&^&*Ie+=k!1)_(T(gDeK0D8v6nhJpae=^0 z$$Pe7M0f(kk6fQxcRz++fN>U z;!r2cQ*RSK`&See4l)x(NB7(ceu+ep5#$xdAga}I`r?(tEA8yMBM0V=r@)1Hq*qlt zNYZjn0v|d!9ev@&x9*+1Ve9OaZ7omsm#z@HJy4dxI0xf^m;mDnMBefDqJZ@r6&(?; zVMm57aqAr{m5EF^dlVUv&k++}vjE6BL>~N+auz^hEFu>Mt4W#QV?5_=w$8&kAhi~; z2kg)xYju#fduYZM^*EAfYsP?jAxIQAKyV95aN>C)koRz6?elrJ9uBU|0JhTV)S6S% zbGu@5z5$%Jyy^||tZ?c+VKY&`uiI*W@AATe-Me>h9nGl;Z{y!0k^n;WPl~JA>l!f( zau9kVkRNCP@4f%wt!s_x-|WS;9fh&*6!GJlQIGxfWnh<(2(01diHHis!xj#2spHj0 zwju)j0wA9p_?Z`fY+?EPPMGMQtWM1B?bMpojZ+MW=UD7K8p9#>xg77f zalbzVv?hQzN5B#R=tyMtA3k_`+ZUEPKhSGVe@AYN@rKur6S8of9BY@CVO@*}5oaC& z_}pyy>O~-<$dULQac3Dj+zNj1?XSl@`{U)Uz%Mj_{}cl&glg}&9@N5PDwPG6;Fk-^ zua)=cwei2>*T$a>>v+1dC5-}1yOoAL`c9F{Ww}y`FR#LTU&=QYN4ylqw8G1XN{^+S zRQaSe72)YN0@|4`1;Wm6_B*VT%Ag@}18nlD@iu9F<9|1U@ZM(SHeOSP!lDDuppI*S zm-Wy#fC~d0eBY-Y|Jgxp`s+}iF+&IB&Y&oTvI1`pAxY_Jz)3}T{gZ>Zyl2tF@8GkB zy<@Rd_#AmQ02LV~YBBcg+=7V)ams1WOpG&vRs911xQcKK?_iB2y%+;eK<;>pS0PqA zKQl`B?5t$Pp%BHw7-qoUdqAFt^udZ))w7eWwQ!CTBoF|20|N&tGVh0-r6e1Cb~5rO zx7TZz4{V?N5N4E5tC1|BFZ zAB9MA7O~R82<<}F(cn<`1seGP>C$=sh8uT%@>}k`@rQN*pPo@qNq{~QVXs-4`oPRO z@X}S_&cy<+IKJebfArjZa(ezM7P|v4nXHI0p55x<1nNG(d-0jTj!9~5_G)7z!EZP zpChp1<2@o!Io8gxM*u=!tgWi^-J$LrCI{@(c>4{Xy#x5C+kyKgJz#wS@&$VX z+z`k+k5v`Pk!IKn=ML0i^#AMFD__uJT ze*433xjeb^KeZaOyK`g67>m>-$U8%{=9fXaMU03AiPAE0gg!YBLmrVUQ1e6B_7e6c z8Gh&+UxVAW;_4RQ=O%z(B;cx5uK*xpBXK1Hd~YNF{HsDpXW_Mw&xCZj8F=xY>T=z9 z*)W>g1c8&fEaq4xA9-fv{+P!#Y_nSM{9E~<;$dS1*JGXZf$8Qkdo00KUjEGu6bN?NewZ z930$_^ePC|}>>dDnhrp{kz$;n<>{{)* zXt~p&&R~dse~4l3Feow%^8(H}6h*-SPlk{cA)Xxo1JB-cAej6-eh$2=+LhzULK<-L z44*PqF%u#SM-@{JnOW`%^z#gB{UNRl`&dsBB>VP(wr|CHWYHmqB8re3!yDAWR=2*- z2|iV5u#jdZ>QSIZgfz=B*IL7iV&mU_-M;tT2>kF4;ArAKsK|M1nk_&+1G3hSo&UmT z{#C2frCVP7nos6Y{a$AxPUAuBui?4GnCgog_%eV`T*UWnu zS0KqVZ0UD#xV3=qdBL-BCs6DH-erJaFJ$@VEP(%UbYb@&96j^T+tXXWr(+U|k_3^7 z;X4IZFE4=#5`jD_3;>kMOyUZp#Q@RzW!yOF@Pps-^q~H;>Di&B|O0o~qt21+<&xvK}D5M21rEikn*RD+3SlGR_0X z!FzE@0VTdR70TMN@$cg>dQbC6jS6K2C%IHrD0=`181P>OiR10sY#_h10s5;8Wqyx} z0>)@27W0`7Y9Dyu=*eMyZnsaTka=NLR?}E29*H$`qn3m+5?NCgV(>s2gyY4^6)^|z zJ)A4x@;(d-Y@MoO*R~ndQo!qiH1uz!>3h-EyfBy2it&{ql{--wl#z%gszSJ$tZqZ5 zF)x-r*TnI1n^d2_VA5j>C&z3;bun)UkAi9L64%gjp;?wGzZ7qk0X zUAs0Ii_1XcS3Z62-+tiOh41N1Y^8Qo$G{jq_?;{qcwLs?&4Q4FVx-UB!FrFxXJ}-7 zq>Ja>-+$>{zx0NixBb+1;9|pZ+sJv4H|4zLL@5L(*&3D73O++CE`VqV&=9C)z`-1N z9)P|u}P0rG(90nr+O$Cvx~;KPsNbe5rh!}Vy@>u5y=Ju-lekQIgW7;<0%*kTjK9AG6v z>CbuxTNIedhS<5fjBmKw5i;tD=Rm>jPP=luidtUWqEzYuRbeDfb= zQT-co6CnfVt!4@(vF>DmNU!G8g@|A#RKNVc7?6t0k zP~qU|A*@f0Mlg3D5z1xRpk5~)PJI@^1cKD5^@qUxP_LKD-?am!@FjFg%Z-;GZ;ajx zJ4GtA$K9&}Plx>RcmDOm(-YY!IGJk91iApubujg3pE>qGKbgJ>wMiQKhy|`;%aL7p zB80@^WcMSL!peI>;T%lF7P3w}2e~g>9T?{haO~E$1kBA$V%uC36E)$o&cPJCj&3b8 z8)Mk&C7}u3LZxm}weB61kVGh>0OXiA2iYD%4!L)noI=LWiSpq}W;8mso`|hLvFJJ2 zP3TbGT@pI67H_=+6&ZY<0fPY|Up%>OB6-L4yS6UwpEj2#fowwFrOOIef!X)of9A*k z@aV;FZB6Z%=%p$3iJ2xzu3+bKsOD>}1qxBT;NV=r$2hti&3+4$YZve@-toF0c;O8G z+cu!3>$g^2_^L4*f+vnlRvSx(y_AYh5=ubYtoIbOACPCmzhSwjnhi?LkaDB5e1*|{(H~HHj3+rV6k|99@O`UydCjAC>Q{61ybZl^DfNt zdA#z*?f6G;dr`j4;E_q-JvHEuS-Y!(@>m#&J9mtaJE27O!2It4e>GVkc=EiQil83u zXC;)q$SqxV4dq)X+w}U#y;98`ZQs~WP{qWnioO)!@*?4N>&7NX*|g!CtSN`jUaPLZ zeRz7Iys@n;n2SIdobO}L`|p3^*Scon71W%jp*P6L@*(Qhz&RGK4&Xp7Fk@i%A`4s( zaU)v8?rmZA{9Hu{MNuG%BIG$AvgqT_A zl!?@xE}QCQ+?_<o(*mZW$IX7#He}8z#%<-G{%sx0tm`}jMM7ESn{M!AOzUPl0Iq?s=GduQllcpIG zpJb%uXyhFl!R&Ij*gXo~*XbPUeu!j!2}f#~|LJ#p)%WfPe!T{CYXB&hoZg;$$G8&u z*KUhjf>|FcHK9lyr~Ytu5&$oWR6@b2phA88?>KCBzryUbA#96SpmZ5{&S!Ic|G)i{ z54~z|!;!6n9ox~dgq|c0b;NFRA1Esha{jOc(?A89^N77i1HksxWxRRowEvpzbKiFW z_|+Mp9eY>0V?EEocxa++tFVjfz;LkumIlC?#ST4r>EiT>#pRpMuXp#fqT2Ptbn?x^ zw0>6+#c6Ih=eZ_B@vh2DrsL$CE4@ho0OL7lcs+qlBOn$p2sz~3nvzC2_YUWoHHPOo zsdvyhMDUo(huG3>;RW>w|KPekxQ;yn@8AUo&VhXrz)%0_XAeK*8b7hpn0tq}F(q*W zE0-3Lw+Cz?=hf1a3T5&h#^;EO9O-Z!(fT~T_UWoQVxF?MKKa!tnV!8BmiAn3fGkR0?&Pg zk?8BN6PtI4HlM17nS<85@j1Sx?oQsn!P_pp8{3FI*14ww?f7`PXY%Zq2G{6!02|+@ zn?fqzVk1I(&+e`FojrefS3fImr6}P;5QM?;QG`~4yo6DE&(YVu8a5))+Q>8Bo#0=X zen=QZ64gu*U}ALpITqGhSnuX2C`MW{kZsKH-lJg2%2uu8emI|lI5Ad9Jcg*`SOf#_ zAkoYc$t*dy%j{nOXOIH-NBaPv+OO?$&PZl?8<$3hi?3UTz?W8rw1jzu99QXx;G>9; zrqcsTUVDC}^VN@EUb*RVD{E4{c|J{L%ZraHCHrnze}uI9aOU zdaL6$xxXGP#Mlj3(u>uwFZP*tmzL?^&aH>G0v~At3p%g7*mi}nZVk5exr@uiFMi;Y z@$VkJu=9@|zxc{eoL_$X+6?eD7HE_7e-*%I*Fk@F^vv@*6LUY3C$)Mls-wNs!eD)Xm=ca`*Zt<6 z;5}!_iwKDFK9XJw>Donn+bizEx4-hH{#M}6Cx9PKfcs1-kSoyf=P@GjV)$}@H$k>p zZQy;I!)E+izlTC>v--kvio4BzhY<3>rvjx)5X&V9EmRzeg=Uowm#>qKqq3&bvM!_= zHJUst-kxXbczadxWAu)lr@R@muJs!MLbUDL$nZW;WxFZwkqmNKQZ7Hm`!|E}&V|?i zF5p@OKtW`1YO%I^-_}PjT)ettt=qlDCW!=o5%RI61OsvVU4!^^a_e@C>Y7X%B`|N8 z#EgZvF`Tg&WI0w>TUcH1A$No{jS;8B+pUD5@P}gsRB!R%9Xn%G8Uxg!CgESnq?udo5GlareDojE?sW*zGaqDV7d(oN8 zS6+T)rL{e(Pn@cyrX2z9(1E#QSJ&P1E-fxy?`<3n!OVy6hESpQy)=oL$fMA3J;D_C8>0&1uO%2Htuo z)${mP^CtYumJ4Ih5}y%WH+Js&MtW`Kc)I6_iSk<=2Hh~Ogw zXFLkyd8vi;_z-@EsN#vd^8heb=9aJa?;B%aoJZ;%ru!Y-Vmw~CYYTP)KRgM1oP9~` zg;)UazaBof^?0A&(N8B{iKszYXNdMvi_byMRanYNZ{EXthuG&x@*a}jDjKbMeD9lI zg||I__i!8V;Yr}1Bo2>gZ~^08zKqa}jEVG7`3rv!9=HaCylcGtIA0sTuh&Ap7+%|~ zdpJB9&^G;F@%R8kGBmH)&c#Q`s2mAqoH@>ep+}KAN;eY&lY@aee70qA7>+*t;T*eT=O~gq;v?1Q}dMAl1)Ec&~iP$~LJ3wVD3}EDh zr@SDnwR>1xZlm4vpd>|{0@kwd)el$W%RU*y(bt@{iKUn^YU!vIFGOh!Ti~T-&23;* zd7kXvRp;}fa`6GE_Lm0RGs=#G8N8PR5j>a)dU2-96rSr#gDoOng!^tpYFF3qMVu8-eGH$=&y4!cx z@Qahcx+ypb2n$*#L#or0tr^xcxE~eYk+M2o(&ccDFz9HELq(690Sn{cUP;LEzJP^L zc{`--(zjE-M`=>unggBs_N`Yx`|#tpvn;U1T0%AOJbeo0E!6q)Kc&6C)Nkw-%TfW4Gr0hIHOzvNfBz< zq9kKWWe)^SC}Rv@02^6&LqKHUjYHvb7XF?EG0!i<%B1Wpfd|<21VC_N3=3q)*s1kw zK#09Znh!ABUB}lR*o`~uiJt@Box-mgaDUp80qoZwICk4gbM`-EHf?|stj({2GEVMd zZ7liJ#a#`D$a|#45OH@2v%^LFt8e-myyoVK;T-V3Ch$!)hk3)BH_BA0;kYY=LRrV- zspu<&k}j^n&%;z(&Cf+vd{9t9Z;JYirAWl4kjwTaqra@)<9hxF^8dhFbz z4;)+kt)9cH-t@{_%v>Y#7<3Rh59`6}mEb*{`fh!{uA@1}foqwG(6x0OyRZ^xzz&@z zrSKscKLHS%N5o#|v)IeP_W z;1MIL0*N+Zwpy2lu6ys18-tFGut)|EU0s{L3cRHU)E&fCOuX0;bJCdX?%Qu#z;M{r z`f>*h9s7NB>z%%vhl7g|HKz)6g|YPE7)t=_{n#Fy}$QxZG8vus}sPRQ-?MR76#t)K54j(IU_cjPtP32 z=kfTp5XP^M|JG~c^b$hJ8#a0NnZkJ8`a8sf_mykgmv(V=Pa&*Jd53<&e&}y~#=hr0 z?+FT2%qOg{45BdrB+{2i&*2O-e|aQ)sn^Lxa!QWe^Ij8ZRE-PY`L_w&{%eDxS<8gK zrRDtbqj;#G#1P|HR!bvbVdu8ygVU2!bEi(8I_PYYnz+UmZLl2!I@qOoDZ-&_kPq<4 zAMb;;igF*aTHsuY*LWF>u`tHM+6aTpW3AoC;z}FsegW7RNzK5@!3gS#E!|io`=AY# z!hnfY`z%(b=W86O7L{!kJ+UHa!xnEy_(bY(;LKw#5O}5H&eSRHQErQ#+3dmldL0?$ zFeq$HLz~R5X8y?OE1ms)+o)~dw~Zcs{4{wRms!0yJ)|layoRjSF1!SC=@zYGh}qcV zMTh46B=C`lkeBqJsFDn3fMgE?mGiC|Q2jn?@rLy9*8@*&Q7cp})AHJG{^+=oSjv#Y z9WnrCmb*6}Ume_4)Tf(S<}m2>kTjaGX$%nHe8JYUVSFpP$~Uv|0!#co1yHOm7*#@&RqX(FT+Z@mifPv)OF2 zMmz@L_0T%fcRbazU-9rX-6GjkDi$-QfyZv&-FVNNU;6A{ZVp#3rm_h!E)#1``^$3%vD>)a?_{i?(s22Y{n-!^sm)U@y_; z3O-Z@W#dfYP;Q{fJdjg@BALJ-YGM#K?a7NR)9ZllzT*}Yy%u~n0EwkkzFYQq>pO{f z;lgRee3atqY8x5wdH}Igua@jX^aKuIBblvF3!{_wnLtG=;nm8z8;26-CF>dmz0Y76 zpQDun!5EUTu0*Wm-7_}HXlb=!LJt8>NeUAFDjb!B_p0zc> zPrUmzxOo!C=71k)06)R&$Bv^xWc^z|ifjF=-<96SLGS-{!FU_~wqX2yI=92?6eype zZA=<}K)kh2!IO9l1HnH+Pg*X(tK!*=y9=vHT@8eTB$U`>@HQJTT@#hn#dH@@QLAHQy*c&vZ*JZwHdBnJ%p zGPwxjTgSr}j+ue%t>rT8H!i@33Gg@(A3$Fc7AFm1*IEINbE)D0Oe9CuMHXZeP}D>> zvp92Q6%U`dh=)!r;@s69)^nh+fJxXQV3!K##x}&kIhLw+l**i8<_4uBa>9c6w>8Wx zwXLPHVE};FXd^P^p$bG?h80$RmjjKY5hdb-5}b2z1(3S}!#qbp1V<5~G)1pB!1irT z9NN1R$oeo)cOF}}UKAh}*1T_A6^O#~`d@1>z|dnyE*s30XCs&g+|TNIDD1}P(uiQ* zKyV5wbeX;&^;a}QV**~w^S*5Gx8QySI?okKTm}&SCJ~NS1oKoQebN#Zd0UVLC$lFg5VU{F1Gzntw?GA}gbaj0AXtgxAreVUD(8GT zC;6kHpE_4nA<}YX8<>fONYQ}_2dlKY#(d)nC9!LHjZhO;t8Wx4 zM5*Nf8EaAaF(Q}kZ`vN+d{mxf6ij^QbD_&Xcn6b)CmL_b7@@-vM!*8Nyr;`9R@y|w ztstJHk+H~n9=G4P3sY%?qSpf)TTqHKt;dNn>l~*Q^#qtWL3fxT%Mn$xfhVp`+VOez zHwlWfjqq2Wd)KaW6jV5-k!?i=168bI6T?ys=oMJGcom5=yv9r{5Sb3RY)Ie6a#D}X zM(EZXIJvfttHAy?urC*SfXqE3R{D)w@!0kle-;e~h`b!8;30uf)qZK{nEHYRCiE=k zQC{eBCMGWmuC|Sw1bP*YKY?H~q7b9-a2c=r#xSr&fm)tnayY=fHyprr;QcA^I7x1p zT&&~;0FPX_vNf+y|3hz6^g4a`%yV#;%x4QA%?7CVTZop=;}u7C;fMd;i?9dy)D-Zx z1o*59WQHm(ML}tE{JKKO@5kx(seX^sd?qrr+`PFTVXxn}el6zIMe&K7-M-Pdzg&2T9x^ z0;Uwk!rb_WNMO=q`Mg+YRq#nDG_AGFTmX*V2D@ZDbZv}3h$2wZfQuSv4GE{`SMbFr zFXD?&F5>uwHrD#=;x>s0K4SsT+f9@v4465>74QXT=PCoyl%W|u7B5uzoMZQ2NYnsI z*Ae>&3Xr;!WW&DqlKN5-vQ(g!k67wO4l@LvealUViwu!-u-;YoOYOG$IHduy%$EcH zS1u@QGU4^RmrpsbM&R1>M4uB8Qw9Q#GqW-=ez1%YCYo`QTV3nh@Vksc=O>-)-rWGf zrBdl6lM|71E{C;}(aRHzP2gJ@md;;=^#;aQR=Xzx*;qV4lGMW!2o}y*6gEXKigA3k zL+ikg4oc2b&B+A7EMf8H-P=w?!$Dzum7t{b3J9$!PB_v-Z%I%kEG(>~)C`2RWY6of)>x!F@{>OhmGf*lRhwJ7lpCxcuAaNNF9gp+Gh91>qEf&X%oNt zS2~Q7&G>I@M#!>l$AAgK0*F0p_|w4I8@JHg-~Q^`{@qR6nkTcR^LaFEA$GY4h%gl< zA26T-Ora8fBoWf$LJr0toB-Z?UUw5SR@Z1tLKSO}KZXOfC<1H^CY^+jYFHaMTv}}7 z;U~`Gk;gCM#Mu=rb#e?nU~2}j7A7(P$@(*iwoj}`l$o<6<*HhvMgrBeEn3EVLJ?Tm z<8-Ol!)uK5s^5SF!tpK`SOVNI!Q2KoIfQ)i~vjmxOLy|1t$Z=!ofO+MqXf|y^edYJAgUh z;S{(M2}w9ft2qzgQ>V_|)K425EJ=A(Dh*!?xtuMS4-}|+9 ztnUDRa{~D02!0iwgUqf8o6zMrjEvhRaq zYf5FZ7|AInjclG_+U10&Us z5t{O^4dqH0n_=O)J}eh}h@Br(k(m&*!yr(!~0elLbbW%F6ky zF(R8WX!#r5k?rk4UiKmboa3WAokjoZI?x#+RxgrRwBE6GtkJJ9oQBlFBTFn!wY#_s z)Q7;HaXe@s+& zWO(FwL=og31)R&_Bb^XOfXD+(!TX7 zp@$nfpkNC*Duzh=YpAcB#yekn2j2bFH?3_4exU~ZU<6#%?NSOP9jmT9Gd`?!Y&zbX zSi<9=I4*HLcKxppHt&ym_;mV}9zXqz5fASJP)Q{!tKhBlvIIb0mMHZ1n1Mj1;t4>- zJ1T|Vm-2zcaJnXP^qRh4B(uP-AzuA;JA76Qe92 zC}tecsq3YjgPH@Mc!?(=VyoD~0z+VReg%;uL^Gpb8rCF_^*t%f*^^?T<#PGDe9pq5`C>6o3dYW z4mupWuywuJ6$Mb_hzf^j*hAWF;ocjr!wz6j2hNi0O_p=Fu?pbhk3D%uyFUHZLtBF< zi>#LenTK^ioDER#En}j634i}FYJu)-Z$K}_1SNI;myCi)wkf*E+ck*7?S8|Fq1H#@*H4pqq?oxGA!2@ z{b=x#@!%`MI^ zw(;%Q(L{L}v(?n8UVh%+b`$)OjDX^L*@G=J@R8+*g5ZPzK=*oXbc0 z1^~uHfNmQj_SuAPZ2cGm&V~e!Vwhpy?pe%CG~x1$qb!Nnr3sd!z%8$P5>a*FLb#S3 zLP;lV?~s9_eXw+H(&#lG|2ti2;nsmVd@1L0dAktc$pS75PP!lG6KPBZ3*6c z@`dAc(w>{h?0^8rNh>VHKzE4lN*k$7L9$L?AUtE6BivyK-Vky!=+^2uvAlvl@GkWO zaq^OCXF~(%?wgreGuf~(;t7y;l`dtzFdFnlj>nqmn7vBIb1G(zmWnDLa?5RKz_0XoLFuB%ph$fL(ll` zwtGPC5f?dX!*xuz&g1*v^iq7o-8wV`2OVW2n|2k$*ABBBYoAW~Oum3Su6{1u2qSbHz~l-Zpv zg4xXir;cnh?|$pckKA<6jeAZ-Yx6_fzUu2m4+#}W47*(niTg#`7;5>%J4`A93fg0W zXzB79gxjqcj6u0)T4|+hztrpb0zcploG0Y4aFoKE8lrR(wl;~v)UevgaO(UOJoLm_ zJo3aPoW8h%<&MM98&DF1k{F0$I1@9wH5R$<87{Z}7!;CON!!AG;r>)(Fj@xTUT|5C zvBVML#ubP?aMOXkK-Oa`I-CcBs}g_mzQR|>D}JdUHEkj&pE+!F*P#^1+SUxdg8nrbPjC9!7!z)q`XL`XM4j zk$7UttaOryqzu{-{L21hjmnO^Lp>W}vbBy^-+B{ffV|F!L7aEeevP>P;KRpkuQvIL zK1Jjs3o3wNyNfjMq1InPvwa0W@QttcZ+On^+AQ#o>%f1tKzDPlR6#iY|36$CltxG_ z-4K+w>-|uch0ld_wi&)h>9DGAWaf_)3Vy2(JRDGdSR;K!^V0Hx))=a2Wk-U~Gl+I6 zp?v0lI}ppK?8@kt33c-;i}bQK=RE7HE>Kd!F<@(swR_e4Cjsm-c=Bb}Pu}&eSKao{ z?%J9>WL7VA3JmPQ=h?}bSNC@t&|%!chu z5&$Lly)gcg;d?$?HuqpAPb{p-B#6=`5H-;n5Y8=h@z4_&@cEeZ!sz=U{Z_h!SRQ$v%h(tgvdr|^(F8+)bwDx5uzPEY?UQv- zp7DL+cWGa>|J8d-6qVq8wU>2V=qg=@k13P(LIzJ3_uIO@geZg;_6!mX@d$;Sln;`JM5u3T*q|l9DeZaufS_=Yh0QGzApuSRWTLP z&}L*3&eQ)>p_(EU#g5}4gpK!kezJFQa|3dePs{w>z;|4*N0}8}kS$|4v>ufQ`q`k4 zYsKTB+Jaio`r@#08!YQFm*-~ibd&lk4VXb!->(JL0P33VXnDmYTN3P+vw>iq1zLL& z{HNDFd*55$`jR_;W`Dzd3QHIA`fv?3KSU!khzT&>A(CpnuYwhfF^G&Qb49aYmi?9j zA>$keZR-eej_qex%SL~D&y3J$WVNe;-ZD=p$ikUwExL~wi)(!xJADZcK6(<5JboT$ z&aYyvQvfCc;s_KaFg9fcLWQm<6C?^z*jC+B3;tQq6K*@3#NSC`LnG1PId?S$O z9BpqX#$c@j40zpC*JG8z0Zz8qu_EOniva;ky&Qeub?Tk)V%-{9SKc)fJz4X^$0#3i zq;#N2QqTwI94F-{=N;3ND|oj3i0^ybtMHoJC(g_OKi&X-OB2>U zQ@GZgemV%B`>Qw=`PX4fiK<*p@hw^8aZkyDELj788)d$;acUtT)5Wzo(@7cN4Squ@i&f7 zf`=u^LtDCG#WNA4z*CQek+m`-uDK@QXMs~UPvZZ2`wI?!_gn9|^(Xe&-eXv~h-lD4 zjT~a*VT}h|UT!V&o?UDF5f?OcJCr0r5M~lv7F>QLl9R`;@Vt(yZftdnEB*+QNI_6R zLBNc9UcBf1#2UrTX;KVeER0QI(H(>hS*0(Oq3f>iJkhS%BuQlF$YK8173!2Fu+(4S{#6m}h!s z1vCb*t$~FpeVQwNxFqpmhS@^Ev!me+%Ns&Uw;jWMqEZ{?bkgXN1F zurOVx&)l$o?gMi(+tSs=E4Qw%E=Cp(No--PC_>)DSRD%q_ZEwZwLq~Hi8Tf13O-IT z=!;XPQ@St#fKS&^9F+YaVn!`iG(Rh3?S&BKo!&_D2=9^QIj6+2oWzI{3kM4r11FZGn#bPzAc%_F&f}*v%8~G%cASz&^ z7&d8Q{^}xNViY7%;^60vcZi)wW7xr~kL<>t8h$#JGnF@jPHI9S!fpk?(H`*YAOAdl z@6(SS_|St-e*67ToO@N@)OtI%O}^y{JIF!_dR+Z|Kr0C-1ffDANyB-@$ji1 ze*E(CTc)<{x>~Q%*%;(msS_no7)L>b4uC}f$6COD|Inuo{mv)8_=6vL=*b`d^szJF zJwSTzwjI+)6JR;!p=8BHsgz_yJuiDW^2k8w0(fGrPoF-&_||@X>XsZ9kfa+VyA1%T zP^iA}9j#czATkxv|~4GOn(-cx4Q4<+zSXdq6*y*eI{A1_v=!vUXTpuC>!KM}_ipqEKq^Y(wImr%2nseI{ zh&&?V{uvKMh)@i2?3j%)Q?sz14-Db4skZny5msKTD~4-prE*6$1n)rpkIF|n6C!hG` zhw_Opo^I^r&!)z(nJ>8 zPfh6=aNGb-5=V@n0AU@#$pX0V)Wu)SYW01Y@kGuc^%+cS83&sN-}R>F`z^pnQs6rb zuv*dBD1WW^Ctt6AGmP_-uXLzlm^Savc>fumS{_w=PUwvfMTed_mdGkFty!Gquz3T(lO-Gk$<$OV_mwhd3 zqe(duDi9H1D!82DtvtO+K=H)sLq*^QmNtp&-hlU8 zm-R^MI)Gqp1eh4c)?v~na->*V@8jt4v-rY8Cvg1a6|A*0P!z+a37m;I;6l6x*7Ezg zXPkC0Tuav@{z#S#4({0w4Eu=SnWbu2{M#S3tC(D(x>Ow%!i-2`fDxV-ReSSX3lGoYXBa;)J^~V_=SJ7Hof!PT2nis z)!GcLHn(DRVh2{IcG7$Q;#0}h0vCtCU7j%q0MZMf4K&~T(ffXIu|D@N+EY84?TPJJ zO{cM1n?q-M5AHv|NFO_T;huHi*Go4x0UGe`Mad|iFy(>fY-g7h}Seb}CAt?$>W&><@L%jOtJ=g{utplItbzm0Ax-a>I51sqk z)pY9R{Wy+2@fpc+-b316#P@#v>-<*WXao3h4o71MaraE&ODz5s1uU3Hjh$x-As)wR zO|O;nJ-i;sJyq(wc;0;JQ4;zQ+SG9ye-E)j$*wxJBp{P5R60s2KF(Cf)|yE^(8d{d zkB-0iTAvFjQ(5y(QK90@i`5G51HDaD1W9X$NRc|3IVBF6s7<^ei{p9`B^VluVUnO_6SO9#ao_Q?X$$y~0np5KQj6=l4d8)eCtui4C+;5B z8g^(CWHv!&Be+@v!&(#T6yf-#RT==l0T|w63yvNi0JyMH+PKRj?nT?T0 zTt}B;^wS0&c;Xb+fv+0^b4roQT)g+3@P&-{V3?*!m3Y|}L^&UK$oqKt*hJ+aYKcZ< zfWZ)MSRgVnyq5)sf~{%w6u@u>6RT6~d;{0hmDiahEvcgez9 zj=uNAL1Yk`CSp7>#q&5b<0TmR=Kx;oFybvN986JwvJB09i0Sqc-uSFru@i7p!2L1s z0TTSEQg)(`>Cc>-|KV&;?0yE)+Z_a^v9FFmsDyWjbmJHPjhFSz3`ub+;6w0aR(x`?E= ziiYnaMTRs2;>aM9i0{aVKn4f(SXme3_igSuAtD$P?B65_W(c&y(4rZ6UebVCc#tdD zD{3%u&aJRi_`KjXP7O9Q2F6&~AHr_Wu%Lyw-q@skT^cM6y|MwBFw z6LQP8X@U{&<(Nr1huY^EQVZ0rh}}18xV{>i`jcLja5Gt>++#@5srrH^5kUW04z+B2M9Kij`Ie z4%j!|1_xkit-Ys6k{f+gM@|NXHSpHL+XR^*e!e$A&w&cyh5Bqrhn&?d7*l|^yg81% z)`J_WAVZE`4{3>yA|xPlXs@;rJCcC9YQHioavZ?tyhlGTkh7&cS-xE4BxEksqhyib zmz~qta|Qxi%}&l7(eW>rBvg>eTn)EP>4$t}HLJ2}JdhMQ>YX-jpP9f5w$(8UJXr%i zXgQc&JrtM+@COe({PtGTIMlU~$vi88sds4P1H9(hxB4x>g*x!F+@(=B`eySlgc1C1 z!Z*h2azS42&B~9%Q@#6{JpYvhAubgvKbrdR z=U_bxM;>!3Q(1;IP&kLu@()tVp$rJ)k0Av|O(;d|7VV0szkQF@QR@ zu|dN)S2rZ5eMK=~<-iON!14a|Pz@w`J_3+h1LGLCp#TH`W7zv)4F_2nU}xCHaGZ>c zzgo)Pdp=vjb2~`Z?nCz?k>rw=HjxL24D$63V#jA4L;B3)4H%ML0R&{eK*o+j<8(>|$55hW!)hPXeDz zfJ@|=rWJpor}A1bZV-gv0|QF=&Qlpw+Fylh@hWUm_A4DiT#eq)NDl@=m9Y_kB*&pL z8k@KD1^36s$6O1cA<&q6?^=!Xq4xL;>iyplo{Es3>Rt$nBmKJ>c%T$ufBg^=2%v!l z7C-`z24@I6GY9tzU^g*>loc@@K#NOAeC<+uVq zPtqn$*tm)Hp2OqE&)|y>oy4VuHBb~GifaJHyw>WR90MtBbi7?`vJT8m)cBZ3kOa=j zF?eOT_b7~93OW@5*qQ>{(ui!YLuo#QDKbRPBXI?y;SlMdgMBj-XtLq_hyf52uWTl~ zH4b-Oe*pEYj|t?6@&PYPc!#*i&?p9Ix*_&$nMER7XcV-L8}>}DO#A#wGwY+~awM)m zN*)P0BzcZ#*vJ0a88iuqBrRlF2SuE;lz5#RK^IlYbh5UrIMkpS@{rV(1#eB0^)R&C;| z28c`{u^SN_YQ+F|9ommcU@-;$xdC9w17(WXYM$du;7=haZIAZ3Qa+yU+Ec-1bNVX{ zo@rmhvXEef7eO-ye~zJl<6ywVZVVRRvj?j3ZqeGJgHb1wY2rD46sijCbx@ z*PaeSWN!BS__Z<|Ni0DqF8IqxS%{lMqi1vB;TzxbOu&szO!+;Q8@Zf#K}of+Qov0B z>sx_eJ)B_gtFLS9efLYQ`;mY6)pvgSO?U2n^2lVq)@Wby#qv4$_7c$V@cOfNK#@xz zgD_h#69zak7ZNb#+-N#Zem}c2;dw2R504;jnKv*L1^wVPPz$R1CFxz2-aKb_<&OdH z8!Ym24X1psSQ^Gy7@Pcm?7er~B}Z}Z{q3GP>B;+S4qD}eB#;C`NC*%)m>dl@#usqH zfeY9eYy+~50h@5IGxs`R9B_ESn4B{L0YU-^<*d!|$tTWqy?<2qoIbPXY)}A!?{7cP zo|&GWp6=@Est(oF*xDq`UX>ee+ryRLyOZ4qR!FP5KCUhp`$9U4y%= z--Bz#QCGVG9`~TlOIz!*Jh3vzG(E;$hq0{7WY%JA`2Y`EHO3ihYmC7Ms-T?+-;V0Q zI?FZBdf3^Y8(-L+P4rq+yB%u1E{$H7@y-epofV$)&~sS@t`6S|TrHyhz5z1t1GrRX z6O^7B>nWXp{@Lom>e_eqtWEuTGjvwkqD4<1f$Cq;*A!gk)(R?>bEf~YJ-pnRGp)`w7>-7jEmi$9L+JW0|cO5nZdU8klii&OKpP{MNdC+7kS1QaE=!^awo4?JN!} z=srZInGqx2I4oQbi}#a=AX@^0ek;cbhNFEsTb`>?7y(55xetDu-4Iwx9~&6Gl%`*a zDs+^g!H=@S%HNI&csPa(h$|s5X*tdCY&iNv78zbO;v40`#T6F1Ic?u{F1C=AU$~DE z%n-s~0;Gsqs0z%&&Nc9k6KY(1@rg5!d(kDQzxm}q^{{_>_9Gwi{qr|Xwb!@>u?M#y z2e)IF_EPOEP{~%PN|z+>k+_~$(z)MeqO&TA3ENwAgd#&`TLe_A2Ksr6-f#`Nwg@Uj zDfo3z7&+&3s@11oEYTQKtQEW9O^gJR8rAwVU8!)>EjzgS2Y0iu+@o5r>6y{q5J>!1 zKgk?xS509}zhk17#JQg-=y#P0Ys(@3@Je|CxZwEde|pIy&->=;rCs^-{7z;U_ONPU zC+nJf`PoYz$_4AI*(7|dZ*rsx!#j~-9enN8&wli`&#L9J>cCyBn%mCWg&oWu+{U@% z@XDv0&uaKu72X(A-FhCFgzZm%@cIuu|Gd+#Ts5~no1Ndm)cj7S=eM)IwU7Vtgo`K%Uj-31Rk#9#J4u15>VHU{C$WS5-q=bZ{a^(AQWZPSK>SjE7Pd_jd~u^3*m<^ zV>GhzX_Xn>Vd!A_=J#);W9y7f)ReZRvWDOC_xoYtF60Y6(>G2eLRi%(KP(h=WF%%) zVJy|*TN9R#ZyGmOJ!sST)ek#$&G*heetoiKW@1f4T4}y?(6pB4$=Xe_Zl=@6l4B4O ztLwT(MDqq}5=*$(bCFfZB^qw^_(vx?eI103i?@=A_f2j6ZtyT&E&l9M7gSz&KRANW z5vD%%TVwo*L{8AD)}%tao3nf0L0avcshLTV#L~-itVzh#wG(M2Vb8%8I-OjdiL%x3 z4^!~l71(1uuPEu1A{Ij(wx7Of>ZS|MIC*w!J=t>FR9bz^$(woE#F=RbaZ;VrFg^zx0Gh%DLm_;2L;cUHEtF_vLqt z=4S^~|MJV%{OXQ$^11Emc&#l45&S7vj>*mnmu^|hMH{A)$g4ZpX!=9Va8yuPe zm5kvH#5cguqQwi!ejW~AnEMKcmi~ZipX4)q%P+yk*Z~ z{d?Elbmq*=%n*Q{(0t?nsjnUZc<1q*fa&3BDR8f*ND!qL*^o64n4jS zypj$~F5a3qNsWlJ#0N zstG3?zmc`88)O+c$;rsEwJJB=y~s^>?!=@GT@G+Prk8f{*5_Qp#T(7^w6GXFT9m8B z>7ZS=lzCr?T`(gBMg`^%%@e!2hbkM^d;oRyYA#H-f`dx^Th@oSeZ^EIgtD zdmHe#HTXv2&)H=NkNVYf+F+Mqa|bT%!HZKktpV56;h(E;RTb_s;zW-?3{GQoBq^v< zj@-bqsCSD`-nLl%lP_KUZ%eB-Kc{Oe$0)A%(=~Ze(}L)&YuliW?@D504rUZe%e7mSsRx(!HcHg zQ(*&jX4M7P4&Wmc_UM8XENAM|*THa;-$^qW|xQEI`Q|90-tQ~Vm z3hKzmPq7y~U1o?O=*ua6$2pxo4SZ03ek7FN8-=4y?}372$!|e_w4-mro_Fu*tuIeJ zKL@M!Fu(|U)Td*-e6rz%fVgskpfi3nYy@3H^l^Njb^sCy)pFrN__0C@?XSg;cD$iS zOvE_v@o)Sr6ukVrj5zP{H%7m6Xn48&pu)m>UDcx ze%m6IMQ@o|OlSLwKNLFBP_-F3vKWQZT5}nq<^%q^e-jiz0whAa0k=-UH&(-EH(Gw{ zjB!qV-0|t`&s?zf;jez`sek!f&wj|BUwPtr^8E9*aN&lOlk3aOw0BZjyc;*SoosFo z`QkzHl?CXvNa&GBP9iy}=vFA}y`m*Z;Tg#y#a`r0w7f}@3~ZIcd*K3a;3fLLE!O)T z#w5B8N_5Y)cwgC0)U9JKASR_+o1&9fxbCLy+;HoDa=#}VEO`#oQ{!Gpst<8hQaTgT z=hr}3-+=s|uCb!dTXLb|ggPRVaNTNn!+JPl4XmGr)9diRhbd(7e_A(&3iRr5%M^Ti z7Jh3LJa!6RP}gbi0flT#Sb$fBY%mCpRBa5l&A`8`f#=M?gU8{;b@*@F@~y5 zNR>}}78Q_X8g;t8wGKP0b)+3Sd>c(j3gfNt%mvSOxsK?q_+uk|{xFW*Pq$kmj7!e= z@_x==Gsbhz+9+G#jZ^UHiW-^W4D^h;L%p_%{qQw6Kd#xBe0VphA%1pEBqtF^t=D1W zc#Y$y43ltG)gjjJxwh!uX`O~IbHt(Ow~Im9RaVGha26xfS2>(0-C@sSgm3?(qM#wZ zb5uIYSR^_NBGf~)L=xI!Tn9ELYMH<>;mh%cg~#vQUkGUzYdS-|6~f{?mh)Lg{7xBx zV8fmT#Lvn!81`+e1~$#}A9U*V*4pi+I(E`Rp8VZax9qt5o7eAt&TVtO$wlAO@AzrB zqgiu4Tpo`W1NjwQ|1_u~2_BN_0^|1nLz^9fNqm>g(S*rwTKwYa6D( zL%DsY#YsXY31aI|8E5CdMZS0Koh-KnQ%ULd91~*+^=g8IvwiHtfY{KsrOMZ{x9{0TXj{?t*ROc>BkNO@l)6dj+#22 zaTCxPhh_umq=+Qm2XwGA2}dhx`-sZtr?CMNb-8B6pHm(9b6A_uWe(-D0#4|)dYDYt z?Ip{>k3yVt*j%WYgo-weZuDk>9^m>)b&d0dQ7;Sv6XpFOnSWXap$lRelV@;$c3El*}i}BfBfoqpR_nR`|M6_EbSmT zV@cCgJ63s*Mt6ntwr*w`@*4bnlB;F6L?>$<4a&0Mu(Tf{|AHJVrxP$NogWvB(h24W z9gShn;!Yr_f*wY*@NT?EIer%SEV=Bm%lb?gRa$%>S57&hVjU(3qam3IINY3>HqoiTq2#CLN=)Fz^8^4Fv0!hO5v^uf8XWzjKZEbu~ zDr1}5xqa@={fjd@4s1?A3L-Fl0g+{$Yqa zOn$A{pn@$CzxB$HRbg8LKGlG~nXr6dw#s*on`GPR>#BF3yLIx$N1V3$)=SP@zw4nV zZET%;{KoX;*+zB47YB`3j=m_&Vf8zC`ZoWuHi zHKg$Q_G`_c>+OO{O7YW6g40zliSbL2ftLR83ov1zs#Bsy!>m!>NR2Eynj`Ky-qB#0Ke%&*y1yk&4^-O@l`DW7fYs$AC zXpdcf=bq6)$ zoo>&|IRi z8Yik7@2Dmy-2U^Bc4)_XeF!8d<}&(9$%OBFCo~%F(=GDt>4V=sX*9pi?^E9+lYnS*AU}$G>&s6Xq*3PwZ62(#*FX=bg_K5VQj(Ivro+BRIP8Cqfw!D&nZ+ z9i}?VjPKvhZ#@06Jamj~4g6Xiu2Qo_$T77130z;@*E1iw`o^a$&#ZY(t2#E*LmiYL zP_dT8ImX({oIRfKmgpW3o!`p-A7sknxps`S>oIx#ocLpbDn;%x6`Bd0bRb2ALz3~r|@Ii z_#7xN6j{&_Nr3Ys{v7AGBn9Es|MU85QeZ<4YYfygNPJxDV6p?p&#&;veGA=3?AW`1 z-S+(l?e4in4mNu%^eo-9L7vtz)iGS9rpGPfExQfmPWKmP4!@3U3J!Dl^&SU!Be2j; zz>&Ky;yRpl)+r=a%jMs`ku%yjYe)*dBHD|XxsVkPu z7;KXG^R2av;V;l8Opk-3Ycld`&Z^_r(W_ZHRyiaQN8Je<77p@r8)xO|>t=RuhE3B^ zu6j5QV!5^pzx97UdfEJ{liqZ&GHE-;B3AQ&H9BIpmfW|CVp7aFH2_O2&NytEkS135 zhvyxpvnJyQw(;u6UC3iLG_p1DbK~$I7IH)veVRtkqrO4l_doK@hwq(S`|g#o=|`?$ zO_q5%iy@VaYSv}d;$B|y;H^CSlyz)`lctb6QqeW+uxFo=EIAfFDf7d<#eJRL{e}A~ zpK&?^ZOAYG;N=-!nuwRj!4Qn7eHC)Jr0k2XcDcdD)3qTi{w+UKW*!`!QtAyH3*zq$ z7;X&t{^1bEm#E_~3V}f7_rkL{UitYjjQUo1$9ki$3ApXt(~tWr*F5;Ga1eXX<>XZ8 zCAB1PtU9MxpMCPaPV)Be-LY%?7r%SQ2fuU6{ZjULdbOruN? zMkx6E;Ugx6)8#WDR@8A>Rag}Ckv_wP>%`c;p%so4T}VwaB$81F+AsWQOVhjzxoeHbYhd?NkjYc)TVI=D1AkO^@T4&Bp<=NqE7s%yB?ci|`s{iF1dFw8ZzzaU<1(8Irq`p| z>oC=8F@9hNzxen^a><5Zp8=wB!W@GxImPw2w zMT)~N99D#CmN7}rxm(vU4ST9^2O>yVt}q4{dn7vohRLO)dGAULmktfO4ENhJ_so>J7$cH?}IPp0{nq?E2=d`>y%;l{;Sem0RaG-EdH*cV#3&N%y>R z4oW&4_vd|Z`4gM;I#(_!@@u?+3WhEUf6hrk2cr%l(E3p&@5^OOVeK3v&{ssf;{~-~ zO+-i$Qc;WR#Gk057T@BZ>vVVpBvC`A<#9MT4g1%@cQ?Z8PD$B%;VjAX&zv~ve?E5W z+u#18^KN+Si!a*#8&7=5-Y1_t**rO2aE-aUaQpAZtjv-0+N64rvERQ*$ zHDg*;dWRI@%lE^|c(`wu;|2`N%dk^=F){0^iiS*AT>5k0HcnS>rydTE1Rbt-Y=tIz4wSN+?LrTm5~Z`<+rU;5r% zFa7!tc0K9Z?Mr9ewM>0Zw70&9?j3CbZBa$t6R)gAGm#18qKY*~-6!glq#q>~#putX z6lF7Jz^G`jF8h1oV;Y*0^ZR0??X6rxXAFNp1b*aX!ai=NTZw8;s5@aoeR{JBWDVT0 z9)4#NJm~Z~CqL$dvB$miF{i%eH(zwo2Y>6ukNxHgFFt$!=~KA+!ZzHV+o&$@rP^5{ z>9w)WZ@==V|AhPot4WumQ=UnkcB@CXn~|oex>+=qv3iR2-ldH1$`I9e4C5QE8m1j8 z5Jq7X&jkefmecFgKMIRR&Uoc)qV@H`Z$%c=zFffo$(UdeIDon_NgCGM;`$GHE9%;N zY>U5Zt-9Fk^?C#JNyJbyFj+~M0;$5sbsw)Pd}|EOE9Gtb4sPlt^(|_+?K>jDcq;ct zEs9z=7Z&vDCzjM$weZh-GHPCJZ)Yjc5>~&qD9Hz!2pXBQ&mXO_AncI>W*OLK-1oaeBkzm(wc07t)I3m(v*) zci8ixh}X)r4<3RC?upX~do_VIs~g|jz59Ua=H^^msf~Ne={Qk*8x_1)A%nHnm^7^= zwZ@sbtvqYlCC}Nj)P2|;d*;r(Yv1xicP-}QOIfO@KcfA8r6>- zBItUoHTo+C^(LgO;iIVf34+;(@n4}}NMlrbix=Ppos2hHi}t$~&kF0;Xal}@11_Il zp=Cq`au^R;?eOFk*jIyZjKhc4)cDe=>uNVY^2~MDU3li!z3Upa>CXKA@q_#K*{qvk zk_2q3^@!2giahHdR$$aUlfhec=Q-Bp)NnL<3q0dtC$h21pHyJUIQ2fJ6g(86+3<#+Fw(d9D_zh9k+;3aXI7N9;ei5JZANj zY=YmYz={z)$}=q8EC3(5`tFC{v6#ImuQt|a)_YX)9ihNNUTo^DSTLqSr^%}Z8hMvh zd6)XZZM@>*b9nkGGk2|p_cY+&Q&{xOO{NZ5*aLiiUzU8}sv90YziQq8Ua5_*?xEZ9 zdfiNS4q!+PR9wzPYmw8_9?v^>3mf2-6L3R&)B|aVcp*O_U%h;X|-L2+!}HV9r4rM-n`Qr`~p%Qv} zL4b<^qryxuIG>LouET%g-4Pbn!iAt$1o{Vhl<6H%4j&e$NFx|lX#3DLY`;uUgSj#I z-UNJgy2{s2+BET{^UvAx@iR|6v66Q>r|jQ-chYMvky!K`XR+8s-FM<$Fk-&yU2wDh81)oosyFP+w|NJhhTna2#q z$g=e^_K-RspnIRcijX0)EMCqCh@TI;4~WwW`H4}!zo$4-I&rxQ{yV}ulz6uMUI+_I zl;!uz@yoyEb`)O+{Zq)j!dA;a4^pS}PF(;1|MW>jK~zv6Qo=fYt!qX4V#uUV1yI2d z*ueM(WTFfO#P{Jk4h!?~arm&pl&@pN@0Zhv-x-(|9YWM_9V#S#RxVc@Zblfi9SP+$ z1B!KXV?g~(Q30k?<}ZBE@xLxB`)^8IPtqvAB09Y+eyc|CA05_s^IZJtQz_U=YN}%= z)0ld)tFL0tm?|J8^ui5v=%Wqqnyn08MTjyX`7Y;Z- zO+!2Gj#1l@ogGw{_dh7Vt~ftSDbsVAQCj-S8uYfn3Kmg(gkn7JL;tcmn` zq)ET-^*BMTuLMKIK$>+}H#NqDg(~C;6!XHN{fPLXU`!v$)jO8a4o%>du*O?VWcdzG zkxqa!dY12y_UCVk>EW=JOuos3Q<%?G0g|A{R(_yBiFEg>Ui(`(iUtw zdsZ5E} z^;zo=#xQ<;#(3Ka>vFXV5QlX_Dj5yeW2(2z*uJ}X&66+UnJ11l*TFj*@ZJh61i6{} z^3DO*3B319S4_`OuKx5&b?jkXQu0i_#^Kkn(b^;tM>Xp*nPpsj`exR^TkEip___~e zicg<2as3W&DueA~M4O6fJM4Kt`PtFFcYmPF2S-APSF|ZF>jO<I?{LGVI++Emvr_H)zU5-VSUg$_UqsJr) z^xZ^y`J~D+C6k2QR_P^mn^ndp^2+pP*O)z?v9%BFR;Pb+-qpT-_k4Hp`t5VQZ{BeC z?O(p?u6KXwsyi>b{0F->eD~%9tFO6hdDU(E@`;_xRQ7f-2OKPj{w)eD8dx?uUD=G3 zc-ue+BfIXI}@3)1K;=Rht#j-j{~b= zVLjY__9Tz~g(sdd^QMC~<#&vDH9V&EKU6!wpgkg0b^8iEYw0s|jmEZkQVOSo^DD!i`k@7!^ z)@4~9r&-QVXiwo^(J}WkjXLwFal&jN(BG$A#y}xLy`r|hhapubfi4hYm z4h!EO^Rh#2-9KJSmujhL*Hf~36)LIjB1-*$RY#P{D&cw*g6Qf`^z-4Vp{aT0e(BQpz z|KK4V9i3~Qb8#d?rmUzsL46{GmOCFdBynLJ-MlHV?p-<05XrO13j)=8}7 zl|&@9Nzb^vWvy*i(qt*M$-GUNx4A5(Y1*>Zc15Izae1P?Bg1}IED860nXb4@BEj~ZF|(WZ{3;X<7<)H7+Eg5eYw}Bwz7wZ&BE(n_z2ku4;zQ8 zt+$~Y)=Wfny)-n|!FuG(_>7JX$9Fz`+BX@qSZ z#uOvuyMecT=K9BeYj5iv?a4I{ZzVM{QByM$+Nza;I>zW0yinFakIdwBZI|h->u{4P znaQZSjCFJSdD)irJZ;?+o8Y8LGFO~NP4{CXP@BCX>jdocvH=vXC2C#_Z|Om8}P2rTvff*RsVQ? za?Puo)w=0Qf|vx!a=P8FuTca3I}G?RSi<^z}Aws-mWlIgYdNO9tgR?J|Tf-+U_6{Ut;jE?)?EAljgh9co4AB&e4 z7-LlRIlWJedRa0?1Sc3P;+)HjNY@zCcFwhQS604kjA=RNI>t!`WFq2>;EYMg^B%dy z7-I}#5uK+u+Gnz9mSt6w*a~1p=X!Imn8ok0wz=-%vJNqN5|krH#2AxHmUl%=%NptE zjJdQc2|uW$_DeNuZ>d(2<%xPt#u`yyZoY=V9yZUDJAG;%;3@KUyAg1IjP11Esk=L@5u088R~ig-zZ-yn-i= z^16(Hcs^Il{;0%{-MoHOs8zh0?M zkB4)V1D}H`W8;rZOr2xgwMiFua_;(Ze(Qyga$6IwoPl3&=(Z<9ugCe>l>NZXz+Zgs zd)1rr>Ypu6%)WfNQmgcm6ypqeCS={rZ>_T=#*!GJ?i}OYCTr%m^QNaff{Ry~Kc9uS zRz>y}ZEgh3)dryN_~%IVL?l;6;YiQ#Z-noc^D*ka93Gw#(W4wUzAncNX^jdG2+u>D z5N3=a&$aVZ4lmLP;eIMROlqq_rWo`VN_kj@LwHci!vsvZK*I`A4h!K7VWM()nMlK~ zL%ab348gEx!@_=8820UfGWxLKh+sh&`_4`K|M{+i&F7?3Yw1Zs&nwyRPX9N!l%jC@ z5RmwH!ncb09x}rKAfm=hcz2uXVJQBdS|nRPQVHRS7hYNx-9{w1f;o#WqtBmJ?Fv?> zSB;>(%-Gq5zA=zbXH<~u*~^-eGv2VUpg}*rcpu&9{%MDirWH4DaBY)kIpQRd49UAa zq_-!r?#@cBI#!>Yy|}h^`uK0%k()1n_XpU<6jhUv?Z1O(JoGeP@#qs+2R~hf52r}C zznVOVa=jOw-jG*MM{CseV|XW?zKqk+-|#%|&zShCvlZ z%xqahHkM#rmzi#hvu(z2ow1cO;qnGtQbCXVbOtgkyD3-E8)_Uuvaw z??uZmWfiy_k(WR9YEv3~;X06GM#pZ^r*F*AtC)ubW597TKQ_TZhJX__rFFk$l@$kY1d^LD; zifJEE)KkIchsL=l7*_ue1RO43@v}0o#?NC6Yd6E54GTM(>tPspZv66*=Ob-9`rZ(w z+@Ge3Gi0NGE_!6v%{{3-N)ephkJL_^TRzm5(dhDl<(Zvh|3@JX-5p1fn}&) ze#72xZ(rz~m5i^k?c5^PU{Eha!I8fB8G)SAQFvY{6PQA@m&O3S!f03zuaD^vJTApy zg~RnCj(_GI{)+@xfwp+J2p7@wjSF*I-6u+7F)lCi?_4O8{^~ThpWa2w8S>!r_`7`? zhR%sGdQ4w&?aOP8c0NS(EMMbi0djK5oY2XgX}J^`o8h|Kx3PWiUXtzt7j7BnH=h3p zHo)Q}T$sX*@tV28E1SZ|t3N81;HQGV;>-PS2n&=AzoEtU$JKp>8QwF|pG6-A`hDQ`@iztOP43s{lQ9o@}j0qb;?-!)5YOU z?QHq!y=a8*e0~xPZF*#tj5Wuvr&kqfS&LN*2YK!(TY15%x||3Ps=DUCb5x~AwY9*+@@`)Kv`5O*&Ry?T!{w9kn5y3m z5#(SVjgW5u{_Nx5uHHf8-r^FYAi%2DRUa=c+-0pVGo14Vlu zeILSz-XA*iG(z7DrmfduKw(Vq?;zx;>(;+m^*UU_tC3fCQ~$a4Q1Ta?G)AzrNfLKyyf7}N?` zDVd@tb&VT6xTJy#1nU(uQMna;r5yMte6!>28`}N+rUEtxw*tvcd-7Eu{l@o?|Nidz zr>@Lw_?1>|a$UCFaUKw!m7FQF4C>J2k@bZt)75Z0Zrfv#&Yoi*7qx0hF4 z{17gHyEejuEHo2eZyi61y{W_0FaFi%e`R-d%{#Kn7%r)jlR>o9k~*Q0caVi$9M^zX zzwpU&?gpBx;lq>g(h8_Wwp9Z)eA;usO&PrFW8c`ct1|fq%adzf)T%Zn+E6HDoFQv< zyfJ2fRp@R<&*Hm(9%XpuDG*&GzjgkEMtDy2yN<~;#l90 z{Ev>27{u=nHZa#%oLZiFf9uuDnhOff61Czcea!b!g3v4K zShtspRnGjV!k2Nh@i@k~4@86t5YZWlfoElB8h%`qdx6-|k;&Tc-g4lrx9wg2*>qy< zSdU8NcUsf6HVCYtsKAga!Zk3AiUQ)}IXa62zrRLOnHk-I{%uJouDr z9=3`7GazH?I7LUzN8dcx*mCv94Qb(6%XEr%N!#yKPm$)1SUpp3!h)45>}XMGuNd5`!~BM|v=o zuzK?>PCCr4%<;II;b+e{o|E9^Gq`^YKBvL5;{^+CM{_Ezd-?6Yw_;czfbG7W!Pg@v*- z3v`O>rwlKW{q>3jDFjwLUn;vTu42E&EHfo-@4?Ys{tWh3fw zr$1cRq(VN5aQ}vi8#OvG(J+4??hxauQH3KCsH5V=X@q#?XW_d1{GMP~9_}qd-U^h{ zFMTt_7F0+|U!bqP_V$I}xMBPJZ&#*P*K%8>=cgErF(d_ZXnJ8JXoHD!M63SybY0H) zo_!n-$&30orZDj>(y(4D7NKEeD|HYa~tP-u#|h-5}2H^w-NVDg@;=Wi>6!+s*G-dTP1Y^!S)2dX*I>ulU?*>yW zu9ws6bV+=BFvehw9;z~)wU}7g&2!H_kyo6vX8RU+RTVxKM*49(2=~KgGJK2y(Q$vs zsu*$l_tm#TI_0!ul%EF-3yX22=Ky_8svFnc*TV2a5bzNf>NYcoX)mqgq(VB8V|NHt} zw^TVjnTP(&N#YHv@FVGe-3yv4jvK1}-uZ(hMtIrD3@Z~o6~KXT=P?oV|a(@8t2fweemaEW#l^}K4qnZ7$s z@%c}}8OkDkrR-%*@njv==zTwfN1mPUH-D_XJ#4(a8pK zgbc$$;OZqdz4lK(eA&UN&97|LXH1UwVGY!KP141koUyvjZ@ln{oIZ<8!<#1Heb%uv zEjqQ@*4n-!wFCInEsOlyH?MwHYi8~5HR}@(?$}z@rB!loHJ%zvo@He1o{siST9he8 zsFE?$oMUTe50}08Qcj0ITn+C`kR@$9D!ha5xwt+M=WEdS0ql{tq&tWTjohzUlW#yOp!3QAd-qCWx_@!jdD z(Z=`XOqMe{48!7v>oW6EV!&a}js;LB``Kg%@Fd^-A-ct5a1$i+8A zqtlU2GE�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 W4fy^uhR1jS0000 Commands); + +public sealed record CreateBotRequest( + string Username, + string DisplayName, + string? About); + +public sealed record UpdateBotRequest( + string DisplayName, + string? About, + bool IsEnabled); + +public sealed record CreatedBotDto( + BotSummaryDto Bot, + string AccessToken); + +public sealed record RegenerateBotTokenResponseDto(string AccessToken); + +public sealed record BotCommandDto( + string Command, + string Description); + +public sealed record SetBotCommandsRequest(IReadOnlyList Commands); + +public enum BotUpdateKind +{ + Message = 0 +} + +public sealed record BotUpdateDto( + long Id, + BotUpdateKind Kind, + MessageDto? Message); + +public sealed record BotUpdatesResponseDto( + long NextOffset, + IReadOnlyList Updates); + +public sealed record BotSendMessageRequest( + Guid ChatId, + string Text); diff --git a/src/Ikar.Shared/CallContracts.cs b/src/Ikar.Shared/CallContracts.cs new file mode 100644 index 00000000..4ea1dd9c --- /dev/null +++ b/src/Ikar.Shared/CallContracts.cs @@ -0,0 +1,54 @@ +namespace Ikar.Shared; + +public enum CallMediaType +{ + Audio = 0, + Video = 1 +} + +public sealed record OutgoingCallDto( + Guid CallId, + Guid ChatId, + UserSummaryDto Peer, + CallMediaType MediaType); + +public sealed record IncomingCallDto( + Guid CallId, + Guid ChatId, + UserSummaryDto Caller, + CallMediaType MediaType); + +public sealed record CallConnectedDto( + Guid CallId, + Guid ChatId, + DateTimeOffset ConnectedAt, + CallMediaType MediaType, + IReadOnlyList IceServers, + bool ShouldCreateOffer); + +public sealed record CallEndedDto( + Guid CallId, + Guid ChatId, + string Reason, + CallMediaType MediaType); + +public sealed record CallIceServerDto( + IReadOnlyList Urls, + string? Username = null, + string? Credential = null); + +public sealed record CallOfferDto( + Guid CallId, + string Type, + string Sdp); + +public sealed record CallAnswerDto( + Guid CallId, + string Type, + string Sdp); + +public sealed record CallIceCandidateDto( + Guid CallId, + string Candidate, + string? SdpMid, + int SdpMLineIndex); diff --git a/src/Ikar.Shared/ChatContracts.cs b/src/Ikar.Shared/ChatContracts.cs new file mode 100644 index 00000000..e365bb44 --- /dev/null +++ b/src/Ikar.Shared/ChatContracts.cs @@ -0,0 +1,218 @@ +namespace Ikar.Shared; + +public enum ChatMemberRole +{ + Member = 0, + Admin = 1, + Owner = 2 +} + +public sealed record ChatPermissionsDto( + bool CanPostMessages, + bool CanPinMessages, + bool CanDeleteMessages, + bool CanInviteUsers, + bool CanManageMembers); + +public sealed record ChatMemberDto( + UserSummaryDto User, + ChatMemberRole Role, + bool IsOwner, + ChatPermissionsDto Permissions); + +public sealed record ChatSummaryDto( + Guid Id, + string Title, + ChatType Type, + string? SecondaryText, + DateTimeOffset? LastActivityAt, + string? LastMessagePreview, + IReadOnlyList Participants, + bool CanSendMessages, + int UnreadCount, + bool IsPinned = false, + bool IsArchived = false, + bool IsMuted = false, + string? FolderKey = null, + bool HasProtectedContent = false, + int? DefaultMessageTtlSeconds = null, + AttachmentDto? LastMessageAttachment = null, + int SubscriberCount = 0, + int AdminCount = 0, + bool IsSubscribed = false, + bool CanSubscribe = false, + bool CanManageChannel = false, + bool CanPostAsChannel = false, + string? PublicUsername = null, + Guid? LinkedDiscussionChatId = null, + bool ChannelSignaturesEnabled = false, + string? Description = null); + +public sealed record ChatDetailsDto( + Guid Id, + string Title, + ChatType Type, + IReadOnlyList Participants, + bool CanSendMessages, + IReadOnlyList Messages, + Guid? FirstUnreadMessageId = null, + bool HasMoreMessages = false, + IReadOnlyList? PinnedMessages = null, + ChatPermissionsDto? CurrentUserPermissions = null, + IReadOnlyList? Members = null, + bool HasProtectedContent = false, + int? DefaultMessageTtlSeconds = null, + int SubscriberCount = 0, + int AdminCount = 0, + bool IsSubscribed = false, + bool CanSubscribe = false, + bool CanManageChannel = false, + bool CanPostAsChannel = false, + string? PublicUsername = null, + Guid? LinkedDiscussionChatId = null, + bool ChannelSignaturesEnabled = false, + string? Description = null); + +public sealed record ChatInfoDto( + ChatDetailsDto Chat, + int MediaCount, + int FileCount, + int LinkCount, + int VoiceCount, + int PinnedCount, + int TopicCount, + string? PublicUsername, + IReadOnlyList InviteLinks, + IReadOnlyList Topics, + int SubscriberCount = 0, + int AdminCount = 0, + Guid? LinkedDiscussionChatId = null, + bool ChannelSignaturesEnabled = false, + bool CanManageChannel = false, + bool CanPostAsChannel = false, + string? Description = null); + +public sealed record ChatMessagesPageDto( + IReadOnlyList Messages, + bool HasMoreMessages); + +public sealed record ChatFolderDto( + string Key, + string Title, + int TotalCount, + int UnreadCount); + +public sealed record ChatStateRequest( + bool? IsPinned = null, + bool? IsArchived = null, + DateTimeOffset? MutedUntil = null, + string? FolderKey = null, + bool? IsMuted = null, + bool? HasProtectedContent = null, + int? DefaultMessageTtlSeconds = null, + bool? ChannelSignaturesEnabled = null, + Guid? LinkedDiscussionChatId = null); + +public sealed record UpdateChatMemberPermissionsRequest( + ChatMemberRole Role, + bool CanPinMessages, + bool CanDeleteMessages, + bool CanInviteUsers, + bool CanPostMessages); + +public sealed record AddChatMembersRequest( + IReadOnlyList MemberIds, + ChatMemberRole Role = ChatMemberRole.Member, + bool CanPinMessages = false, + bool CanDeleteMessages = false, + bool CanInviteUsers = false, + bool CanPostMessages = false); + +public sealed record ChatInviteLinkDto( + Guid Id, + Guid ChatId, + string Token, + string Link, + string? Title, + bool CreatesJoinRequest, + bool IsRevoked, + DateTimeOffset CreatedAt, + DateTimeOffset? RevokedAt = null); + +public sealed record CreateChatInviteLinkRequest( + string? Title = null, + bool CreatesJoinRequest = false); + +public sealed record ChatTopicDto( + Guid Id, + Guid ChatId, + string Title, + string Icon, + bool IsPinned, + bool IsClosed, + DateTimeOffset CreatedAt, + DateTimeOffset LastActivityAt, + int MessageCount); + +public sealed record CreateChatTopicRequest( + string Title, + string? Icon = null); + +public sealed record ChatSearchResultDto( + ChatSummaryDto Chat, + MessageDto? Message, + string MatchText, + DateTimeOffset? MatchedAt, + Guid? ChatId = null, + Guid? MessageId = null, + Guid? SenderUserId = null, + DateTimeOffset? MessageSentAt = null); + +public sealed record ChatSearchPageDto( + IReadOnlyList Results, + int Page, + int Limit, + bool HasMore); + +public sealed record MessageSearchPageDto( + IReadOnlyList Messages, + int Page, + int Limit, + bool HasMore); + +public sealed record TypingIndicatorDto( + Guid ChatId, + UserSummaryDto User, + bool IsTyping, + DateTimeOffset TypedAt); + +public sealed record CreateDirectChatRequest(Guid UserId); + +public sealed record CreateGroupChatRequest(string Title, IReadOnlyList MemberIds); + +public sealed record CreateChannelRequest( + string Title, + IReadOnlyList MemberIds, + string? Description = null, + string? PublicUsername = null, + bool CreateInviteLink = false, + bool ChannelSignaturesEnabled = false); + +public enum ChatJoinRequestStatus +{ + Pending = 0, + Approved = 1, + Declined = 2 +} + +public sealed record ChatJoinRequestDto( + Guid Id, + Guid ChatId, + Guid InviteLinkId, + UserSummaryDto User, + ChatJoinRequestStatus Status, + DateTimeOffset RequestedAt, + DateTimeOffset? ResolvedAt, + UserSummaryDto? ResolvedBy); + +public sealed record ResolveChatJoinRequestRequest(bool Approve); diff --git a/src/Ikar.Shared/ChatType.cs b/src/Ikar.Shared/ChatType.cs new file mode 100644 index 00000000..ab8fca69 --- /dev/null +++ b/src/Ikar.Shared/ChatType.cs @@ -0,0 +1,8 @@ +namespace Ikar.Shared; + +public enum ChatType +{ + Direct = 1, + Group = 2, + Channel = 3 +} diff --git a/src/Ikar.Shared/ClientVersionContracts.cs b/src/Ikar.Shared/ClientVersionContracts.cs new file mode 100644 index 00000000..dc0ded67 --- /dev/null +++ b/src/Ikar.Shared/ClientVersionContracts.cs @@ -0,0 +1,17 @@ +namespace Ikar.Shared; + +public static class ClientVersionMetadata +{ + public const string PlatformHeaderName = "X-Ikar-Client-Platform"; + public const string VersionCodeHeaderName = "X-Ikar-Client-Version-Code"; + public const string VersionNameHeaderName = "X-Ikar-Client-Version-Name"; + public const string PlatformQueryName = "clientPlatform"; + public const string VersionCodeQueryName = "clientVersionCode"; + public const string VersionNameQueryName = "clientVersionName"; +} + +public static class ClientPlatformNames +{ + public const string Android = "android"; + public const string Windows = "windows"; +} diff --git a/src/Ikar.Shared/Ikar.Shared.csproj b/src/Ikar.Shared/Ikar.Shared.csproj new file mode 100644 index 00000000..b7601447 --- /dev/null +++ b/src/Ikar.Shared/Ikar.Shared.csproj @@ -0,0 +1,9 @@ + + + + net10.0 + enable + enable + + + diff --git a/src/Ikar.Shared/MessageContracts.cs b/src/Ikar.Shared/MessageContracts.cs new file mode 100644 index 00000000..8fee0ef1 --- /dev/null +++ b/src/Ikar.Shared/MessageContracts.cs @@ -0,0 +1,69 @@ +namespace Ikar.Shared; + +public enum MessageDeliveryState +{ + Sent = 0, + Delivered = 1, + Read = 2 +} + +public sealed record AttachmentDto( + Guid Id, + string FileName, + string ContentType, + long FileSizeBytes, + string DownloadPath, + AttachmentKind Kind, + int SortOrder = 0); + +public sealed record MessageReplyDto( + Guid MessageId, + Guid SenderId, + string SenderDisplayName, + string PreviewText); + +public sealed record MessageReactionDto( + string Emoji, + int Count, + bool IsMine); + +public sealed record MessageDto( + Guid Id, + Guid ChatId, + ChatType ChatType, + UserSummaryDto Sender, + string Text, + IReadOnlyList Attachments, + DateTimeOffset SentAt, + DateTimeOffset? EditedAt, + DateTimeOffset? DeletedAt, + MessageDeliveryState DeliveryState, + string? ForwardedFromDisplayName = null, + MessageReplyDto? ReplyTo = null, + DateTimeOffset? PinnedAt = null, + UserSummaryDto? PinnedBy = null, + Guid? MediaAlbumId = null, + IReadOnlyList? Reactions = null, + bool HasProtectedContent = false, + DateTimeOffset? ExpiresAt = null, + int? TtlSeconds = null, + bool PostedAsChannel = false, + string? DisplayAuthorName = null, + int? ViewCount = null); + +public sealed record SendMessageRequest( + string Text, + Guid? ReplyToMessageId = null, + Guid? TopicId = null, + bool? HasProtectedContent = null, + int? TtlSeconds = null); + +public sealed record UpdateMessageRequest(string Text); + +public sealed record UpdateMessageReceiptRequest(Guid MessageId); + +public sealed record ForwardMessageRequest(Guid TargetChatId); + +public sealed record SetMessageReactionRequest(string Emoji); + +public sealed record ExpiredMessagesCleanupDto(int DeletedMessages, DateTimeOffset CleanedUpAt); diff --git a/src/Ikar.Shared/ModerationContracts.cs b/src/Ikar.Shared/ModerationContracts.cs new file mode 100644 index 00000000..cb6ffe14 --- /dev/null +++ b/src/Ikar.Shared/ModerationContracts.cs @@ -0,0 +1,23 @@ +namespace Ikar.Shared; + +public enum ModerationLogTargetType +{ + Chat = 0, + Message = 1, + User = 2, + InviteLink = 3, + JoinRequest = 4, + Story = 5 +} + +public sealed record ModerationLogDto( + long Id, + Guid? ChatId, + Guid ActorUserId, + string ActorDisplayName, + ModerationLogTargetType TargetType, + Guid? TargetId, + string Action, + string? Reason, + DateTimeOffset CreatedAt); + diff --git a/src/Ikar.Shared/PhoneAuthContracts.cs b/src/Ikar.Shared/PhoneAuthContracts.cs new file mode 100644 index 00000000..477fd85a --- /dev/null +++ b/src/Ikar.Shared/PhoneAuthContracts.cs @@ -0,0 +1,15 @@ +namespace Ikar.Shared; + +public sealed record RequestPhoneCodeRequest(string PhoneNumber); + +public sealed record PhoneCodeChallengeDto( + string ChallengeId, + DateTimeOffset ExpiresAt, + string TestCode, + bool IsRegistered); + +public sealed record VerifyPhoneCodeRequest( + string ChallengeId, + string PhoneNumber, + string Code, + string? DisplayName); diff --git a/src/Ikar.Shared/PhoneNumberNormalizer.cs b/src/Ikar.Shared/PhoneNumberNormalizer.cs new file mode 100644 index 00000000..3af3aebf --- /dev/null +++ b/src/Ikar.Shared/PhoneNumberNormalizer.cs @@ -0,0 +1,22 @@ +namespace Ikar.Shared; + +public static class PhoneNumberNormalizer +{ + public static string? Normalize(string? phoneNumber) + { + if (string.IsNullOrWhiteSpace(phoneNumber)) + { + return null; + } + + var digits = new string(phoneNumber.Where(char.IsDigit).ToArray()); + if (digits.Length < 10) + { + return null; + } + + return digits.Length == 10 + ? digits + : digits[^10..]; + } +} diff --git a/src/Ikar.Shared/PushContracts.cs b/src/Ikar.Shared/PushContracts.cs new file mode 100644 index 00000000..50dc78ee --- /dev/null +++ b/src/Ikar.Shared/PushContracts.cs @@ -0,0 +1,53 @@ +namespace Ikar.Shared; + +public enum PushPlatform +{ + Unknown = 0, + Android = 1, + Windows = 2 +} + +public sealed record RegisterPushDeviceRequest( + PushPlatform Platform, + string InstallationId, + string DeviceToken, + string? DeviceName, + bool NotificationsEnabled); + +public sealed record PushDeviceDto( + Guid Id, + PushPlatform Platform, + string InstallationId, + string? DeviceName, + bool NotificationsEnabled, + DateTimeOffset UpdatedAt); + +public static class PushDataKeys +{ + public const string Kind = "kind"; + public const string CallId = "callId"; + public const string ChatId = "chatId"; + public const string ChatType = "chatType"; + public const string MessageId = "messageId"; + public const string Title = "title"; + public const string Body = "body"; + public const string SenderId = "senderId"; + public const string SenderName = "senderName"; + public const string SenderPhoneNumber = "senderPhoneNumber"; + public const string ReactionEmoji = "reactionEmoji"; + public const string CallAction = "callAction"; + public const string CallMediaType = "callMediaType"; + public const string VersionCode = "versionCode"; + public const string VersionName = "versionName"; +} + +public static class PushDataKinds +{ + public const string ChatMessage = "chat_message"; + public const string MessageReaction = "message_reaction"; + public const string AudioCallInvite = "audio_call_invite"; + public const string VideoCallInvite = "video_call_invite"; + public const string AudioCallEnded = "audio_call_ended"; + public const string VideoCallEnded = "video_call_ended"; + public const string AppUpdateAvailable = "app_update_available"; +} diff --git a/src/Ikar.Shared/StoryContracts.cs b/src/Ikar.Shared/StoryContracts.cs new file mode 100644 index 00000000..59dad539 --- /dev/null +++ b/src/Ikar.Shared/StoryContracts.cs @@ -0,0 +1,34 @@ +namespace Ikar.Shared; + +public enum StoryVisibility +{ + Everyone = 0, + Contacts = 1, + CloseFriends = 2, + Private = 3 +} + +public sealed record StoryDto( + Guid Id, + UserSummaryDto Author, + string Text, + IReadOnlyList Attachments, + StoryVisibility Visibility, + bool HasProtectedContent, + DateTimeOffset CreatedAt, + DateTimeOffset ExpiresAt, + DateTimeOffset? DeletedAt, + int ViewCount, + bool ViewedByMe); + +public sealed record CreateStoryRequest( + string? Text, + StoryVisibility Visibility = StoryVisibility.Everyone, + bool HasProtectedContent = false, + int TtlSeconds = 86400); + +public sealed record StoryViewDto( + Guid StoryId, + UserSummaryDto Viewer, + DateTimeOffset ViewedAt); + diff --git a/src/Ikar.Shared/UserContracts.cs b/src/Ikar.Shared/UserContracts.cs new file mode 100644 index 00000000..618f8d65 --- /dev/null +++ b/src/Ikar.Shared/UserContracts.cs @@ -0,0 +1,50 @@ +namespace Ikar.Shared; + +public sealed record UserSummaryDto( + Guid Id, + string Username, + string DisplayName, + bool IsOnline, + string? PhoneNumber, + DateTimeOffset? LastSeenAt, + string? About, + string? AvatarPath, + bool IsBot = false); + +public sealed record ResolveContactsRequest(IReadOnlyList PhoneNumbers); + +public sealed record ContactMatchDto( + string PhoneNumber, + UserSummaryDto User); + +public sealed record UpdateMyProfileRequest( + string DisplayName, + string? About); + +public sealed record PrivacySettingsDto( + string PhoneNumberVisibility, + string LastSeenVisibility, + string ProfilePhotoVisibility, + IReadOnlyList BlockedUserIds, + IReadOnlyList AlwaysAllowUserIds, + IReadOnlyList NeverAllowUserIds, + bool PasscodeLockEnabled, + bool ShowMessagePreview, + DateTimeOffset UpdatedAt); + +public sealed record UpdatePrivacySettingsRequest( + string PhoneNumberVisibility, + string LastSeenVisibility, + string ProfilePhotoVisibility, + IReadOnlyList? BlockedUserIds = null, + IReadOnlyList? AlwaysAllowUserIds = null, + IReadOnlyList? NeverAllowUserIds = null, + bool PasscodeLockEnabled = false, + bool ShowMessagePreview = true); + +public sealed record UserSessionDto( + Guid Id, + DateTimeOffset CreatedAt, + DateTimeOffset LastSeenAt, + bool IsCurrent, + string DeviceName);

_JdZw4)^7dRj`6&@U!MhP9 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

ms;rdW31h=Ahm94+BA4LA zL7S*$GY+w6n1m~=olNvU!jlQoj(sBmB+W3qvyZnSY2hY;^Ns`LS#Ar3w$a?Hax~D&Q3FfR{i7=WWu=6p=!!%|bRk#TvN`Us*IGl&T%>k@ zy+77xOGd#X-N$ED1*2r&kmtLRp-wNX`nGS*ca8LNf!VGVQ zF?}n-Jxc0bc;)J?u*A`>s+n6|nX`xJz`W_uWg{f??Ca>w$}kb&7uFH}C_5E(7p0>Q7BNglKuxtjr{zU8#E67Y9zVX>AB8_*jzndiJdqq?^A7 znD=y)Hi)KS2;;dKmc$JgDM|{+iQ#H!xC)Ky;ipGmj*A}a>_tmKXW*rdDsZVfBrK3{ zmovzioz9q^p028*1-5iQ=nOsV9ySge5G`E5B=+t>YcgE`gc$R>7(c4bi2pojOh}xn zh^2?!J z#lVXft8_3|?|l%PFc1~f1<6LKC*54%eUGG0^aAL=U$I$}MvRNL{?(Bd167XXwzmehrbqS>baW{BDmlX^G-8z!?CXx+YX<1 zn>jk9N|-lJm_OIF$NZ~i6J~_#k>VJxcb(OaW~BDY)T=nw_6-fkT~ZAvz-f&cP8&%S zA4u{qyOWsVerf?jVz7_L*07AiuVlOwHHs@{PsMecG)(I@wH|4bZH#Qt?J5*S=X>bA z5!s$9J11KEu4Q6Mu0MZyte7@k(~@FV>fan$;U641_z2Gkcc~RO(!hev`X+MWvG|WT ziI8qtX&(ZB%}>hd>wTcvsUb)&q^{cP$BrZv-9_6$MyTQbY&vzZ&{%ZRfSzZI#r9*R zo*iKH>y4l5pQ^>`^C6A@Wrqdi=eixmYElQ@W8TefYS{fGPmtCQ@y@%E^O3DLE{iEQJ1eQL#rMsgJ zh!BL3)QP+mnU)!w>2jrowv2|sVWA2~kx#UK80 zp9p`<%s{nTQFTVX6;-5xV7mwD&)NM`?c1uIoq=!St&M=#;LIT!w?J4?PUjr^R9dbM zNkq_p0#{S$lfedgxw*5BpOdGZ@54k*1OSEmLzyR;5+b;<{q}`h29EcxM38F^(x0}Fd_H5PG<3d z9`rBv2|;UJK{z`cM80u7gy(<%D?HON0pauqYcoE1RE9AN%kR<%`aeQd{+!9^ImLJ* zBJ9r^@C>dNPW^@tT!(Sy#;QonZ9pbqjGI2K8^#hTAw*^uddZv!Kl)U5xi1#O7bG02 z{<6A+FUrfyCr^W!($sW{e7Pwm*cO6&*#$}IFQga`7xDYh2)Gk-Fz9c(S}G;gFQm{o z*hkAO7>9yKu{J8QacjXgFwGp>#{QkHyg=;Ft*h(v!ZCw{hXcktB)I2>n%y!SLuXe@ zB$QS9`5)m=u{q-D(S~hR&PE{evNsn`&Sf9l(xtYWjM)&i{Dr>;mbD$A`&HvCivz0( zvWSX;g%!aC##;r2IiMOGIvyh*CyU{o4e5*XW>7YfJX+s;JwKUK)wXAmk>|_oYRv*AK={}fDsZA=mp>u z8s;_Gpe6ks5t9sd*jJuBN1i9xj00+#g(3j6n2k=9@<134R^&Qg_FYTIt})M!b&RDr zS-9>Pru)VfAR1W|U#VONx+`jwj5dBoXo2zXUZI(pdhi;%9~_tzl~cCH1BH5ZhPO8H zgz>9p*PsatP6W6503I1!QdIfehuxLOCAuHRm#1tEuy?)+yc$aY9KwCr{YS^g$4S)0 zG?~~pzi@Q?k$a%(OjJxvWO3htNsEQ1!_(c;tXtn@1-RfKv+1GbINdBg&Von~Lpd~p z0PkkdhXZG6kzu<@YJmrQnK$7LU5hRWNEAw*|Mhi0h_7T)dw&KH7`~S&cb8llw7Fvv z(`NW-av2S`PZLE1!$tT97p7SEnAQ&(Ix{*66z3OTu7Ut>+iea`BI>GcDDOA7fnaT)5ff1^4W%W z{9%dyJbbt0B}y~fe*M@9y`eWJX_-5OyZr|*ay~Sg*u9(gMe(}Noml5yZ5nT!(KFTP za?i1VK+>rm27!*K040HPcE>5x{B6g$vUw}}iFm<;^6_v=#8>*o2?j4eJAOL!<)tS_ z%xFPBJ>33A%~tigR-EfLW<0%nXH|0zcP)kSd^;gyjqai>Ud6ng>9ffUFj3W@ruFOA zZcNk7y0a)_>d`eclh>;SqmJ5?H7&)1%jgyUoWFKT9jP?XEe^gn(|N~OI(1Jn z)n~Fa$%PlIXFK$6WrN&Ip{<|Rw7}50TDYI-Qq;VC(p7ezWR1H)vu=v-MzkiH}gI;qQf`gAeC4?geO%pZ%e%m0x&IKhN8qbqMKHKwRLV3;Uv))U-r`Ro~a*k=pqc zAuzNO<7=N`@5#k9{d(`Rxt{Es&IGfo00e93Vq%4(LM& z_`A&VP9v6GEVLx8hTYnq2=d&v2L?}pQ2?j#|A$Jd)*;e@NvgDF&`X|S+>YZQ@Cuy| zq5$DF_aV|iTKT9q%Y?Di?}ecwA6+~K+V~i;YQUu7&0k-ao;Mmtyyy@`V*z9&5yl)TJj)x=!8vEapks zrx+Z?{B`tJ<6j^A_S@NQ>2=Hwgp4&IsXFXp&F#yTGgefLwe)NEq$PyH7kl`ZRd-4y5Q@3;Iu0 zgJgGoZzb;}XvI)X+T&!|uZvkuG(YV_;|y>c$*dj{cH%}Rb)e~=E1x`R7c9Z5S@N)u zo{3aAa_gBQl*VF5VnFlE!I9i~Xx<5(87D{FpRhNKq`>Fc9_`o|oLREERDGuWSzixGr^7Ki+A*Uz3t#BFMXK$2yFeeC?P?Sel2;Y5(-xZJ<@jck45X$|T>9mLq{h zN*?<_-HtH^Nzk71-PNaWNZb*32@QUWkjCwimQQv|Z<*@ReFyOZHhv3+j7#2ac!)IT zdVnh!jNBYDLa2%uXCP;Xk}#7&fVVA15toB29h_`~8_ zlT-GNhgeRIuZuT>uF^f;YCr0*8;7W~VkB~p>&^0 zuQogQbZBm5`_sygUshhujnw9xRygFDb2XPRzFb7aLuC$|&dbVqKgmBCp6vHFmuLC8 zN>26HDj)mJX{v^7m9&JjA`>_<);DhyX~P#JXK+&u>vsc|SZu(XTHP?WXkJ#U7CYa*Gk2W%IC6opH4(KsF zYbbxH^-oO7C*}_vd!yz=`LeWi#3DJ3aDBZx2K7GYeebE~ZgH*Dz3hV3miBbVhw97y z;3il!7_2vRzlHB)c1h4sU@{hUVl0u=d$Ksu&sMhmwGE;q!-!#-XQUt`#INy8m^J$H zW}snE!uQKAn;V(w_|lfQU8hDbrRYz6Z3sJm#d4!y#gp$aQTt_&o^FGOt7be!(Uhe6 zYeG4p{N>>AsD4n>fcKE|sl@?@V?VbDZ=f~K!z}BSenK`j7SDywkCeogxWQk*bkm51 z+qa(5?>)&}*yXS~S4gwP)ax-bhA^_KlzZ?8fgx=b#u2F?7EWv63^|TbrPZA{TdkMu; z3*gc%qwFi*ofRq6?YujKAD~+E7j8@fhwHfXQ4+~Sg1_WtAQ z7}`ejHhXjcw*rq9=SdJ8Is-^oB{U!z^l-fxLOw1F4MRo!A8f^|15JlP}oUxGEkb-@-ZM9=GegL>l(?exmytV5pCetcm4E~Wu{(AcId zayfrxi-5@-Lqp9#cQQHxt8U}apf^LiF8k+rg>|jX+?Iy!9)evBiNqg zpz6oi39T0_;gR3SGzuCRT76j*cFey#8(FQ$ts49dpqAQ<4{|@Y+>zsfpH}%5mV?;` z@QGowoDg-o&Ak^mz@+*pxkVU-*4Ye(JIaa9u`7Pi8->0sEtdpB{$Ep%O~8A!+AH0? zV9W5hTk6iZG_niSL0s#A*dGZ4#?)U&_$vlDf0Tmhg>5HZ7!ZIoOvq>-n(gzCa^~bq z(^0E@XeLCYPvnt?(SyAi28kY94$u6`{h3AyvP{y>_13nb-0{3V_<<=IY4~B#q~qAe zJWX79w*j{dzv@fOM$v^S%F8@q=YpkYy&W1w!BU5{OHcJ>Bk2E@?+XQjU)nZ+dnE9q zCf?81u2v+8ZxLZ@U=;GEQiaD>Yn^K-=c2bShus*w!*ZrbUQoHyGU-NhI;iZ9eYqae zz@$lg%mNbTr9opcW<%1rnfDn_os_L5Gw)3dCLY!PlfxRWiD>K!ni0CS4K%qmXon{@ zYf@MEjb2&3#t%0giEM{g2hCMypkC=05oSxi1bU(|=}eMzhzMad4P?Ke5GWKR4Tb zs0{CzWLIkEb+DEU1XLq`WVSliRxka{gcJkKz}L{mP@Tepms-8NXlPS=^jJwm>{wje zt!%fKuk<4nz7tIY!^+eW>FtL65=!F|IHW8JPfSeNowE4)>75rIs_V;Si)L58T~aiB zzIOQhgi^0b^{MKzoAU3VR5#`J#ih2)2LVv-hx2>2Zt2U(E9y%u& zx%VXUT+3R4<$ANfne>XPqU*FkyOurHdzV@PXe>zl)|Pk8FisXGx*j3VZBj(E`ORz9 zeWejcac<_{CR)1d-8v0Pe)AWy8>enHj9Ah9NP)|YJ(-*whrCei>-zo$&hM!@8Y@z$ zE~U*+%^vdm{)}AzprtUj#q731(Xp{{8f~BRka(MwvZYX3A7N(n_dj3%j|-rf2YtUk zO7@c>W%$c4WVy9Gl``QWY`Ed+rA1k6YDU-JyV+;k`tjiYXJG4l=y%M>dk*M@7-G*_Uc zVo@*K5(Pvv_h3uA*RiE?VHSC`Z3ITR+h;iJaX9OfH1Itn%ZS6|sT;8L+rsS0#v`6@ zwZOXU;$4la%J{P|iWMPXnLHOAA}9 zE#V{Xd@0G1OqqgNA3;(ALqfe9k~^*K6(6yw$Q?c%0v^P#H~#;DAdXF3l8EEsZsl=j3TsJFld5IW2+%O8!`OZ(W~A79SEfW!?#LL zuhc9U$M5JsTKrex0Ict17$WhnkhUOg!< zK_c$Sm10~uhWZ{%UID6P12#V3evNL|YEaV90T|NxcfDdy63`8KD;x0wTL1%~-O!_F zu?Mfd@G8~9@#Ciai*jXu7?vg_iEZL5RT*g_iRV_862&uaE~(#d)xAQpL6)+8#bJZI zj-bUm=Nei60t%17sM>ZyHYPoTiz(xZw_{*SGN@*_yrqN&hvV%4cGp(f8XR`PD|CR6 zg5A*(ka^D-`>hzmlyL{97GpNj!Es&5fuy=3G)JU;_^`MrvVMtRie*d^5Fvx(+y<(V zm#DZATjMITFi>bcfd>#z8svon2zi(QD+8kJ%`CH#^;3JJ>1TLk>w2#jl1!B~Duo?d z-MIF~xZU;lKf~F zD4orqvMo?fXmm?i=Kc#Xr?cq=jeZ?)exlM5BwdJWbXzB&4(?$+(dzO~f9e@hp8uSK! zX_hNz%w&bl!|#F;KnI>st#zG$IWYO?*7QubA?tpm_Ib!h=@d%cw@?Ocr0Q(UW^88C zzl@Bruxi=aVPS8_J!lo({H3S9>|N*Ig%h%OuO_1Ux#N?fJsr`G?opr!o;;MKld4X4 z0d3JyH2KHXfI)-20JiJRqMbCewyl~MagA`=rfDs&Cq3)7H%R}9ogB9^pUTQ^>>GG6 z=@kF==1dH{U6eHV_HIX`M32JXByjlAqaHWSiI&^t?>e2MchzHN(%9m}v}LvV}N{-?D? z=BntS_=#Gc^vLg&v;k-T(w#(SYrP`UJ!$f!d#PCW>RDk`-2Spd0@I;2`dwLm;kGlQ zZ@_H?eB&o}0)#VXR*Hc6wNrLm3{^t~C*u$hgC@e|E%=UpHyOzNwkY zlKDOH<9Ts&e|I%Z^-vn38>P}lX@0xT5{#Mkg6y20T0%h`t&wl;KzgVTnRnWoY5Mm> z9p{GAo_{K`(B59xZZIRq|L#D@Sk0@5(}ZL{&o5{g0gj>+QBNrk8 z-V^9MC}U9OCP72Tq;vh{75Gs=#EoZ&RG^BpU-G@AFHL$SFv@93Hu;gwNP*WE5&`QJ z--qQ?)GiDtBlAspk&jpBLKktvGbD9S{8fUw9q(Iim`Yv6&_0aObZ^BTwrg#Gcs1Pu z{RI|+P#NKf`Hri$;nP?l;26FjuD6+t-*q8077{U=F4Q>QkqZLNDv7U2_>N%EP#E_|0dz= zUucKeW9=a%s0Fb-vIx;gV=GiSrl$Caa6B(m;7e$l5p_{poFChYQFaa{0~x+VF@l|? z>ZEvGfS3@XF%c$&T|DXNzTT^@b78w9vN}2ilP?GI<^$V-n39iPVSN)C zwg^cB{G^3|&oSHTa=Fir1Klb*2`GDs_Jj#JYCge&jNA2x&y>I`CEZ)QXAHp7j|3z| z4PDX+4*9l`~^*g^xc zLBQuP^g+LSSpp@+ks^hnvaq#obdSa1v42KTzlOB|ZD3=yUx&pIS_byh(mN^O;UYhw zr!PK`Bn_O@f|7{or#(Vu9;BN`6`)Pvt?x){l!42EBG4rd0&P0OkTfuA(mR_NYgPzG zbL3r@d234j2_9ycSKAD*UD>aZFl#=?j0j37yq=W*yv-#3uOmSt|7^ULDmh?pGy8V- z{S*^f-^^BcctwoD`(&oK-$>Q$;H)O_ZiG zgXSlR2b-5HHFBlXd{cqG+;QI<_m|q+C2zEO8WF?I({3X1bVBa%>`y^r{_u>7C!d>` zWa>AV#kxcZmwcPqyE^+L+1bmohj;1~lFrQOV~!Jz8nuSaJ>$vtG&;4uZ(a5Z>PHX* z8Wmsg@iHqK;`L?e51X+XruN0ZHB@a?{u-2GIIKCWrdLcG_@KF5P5&0}&rtIbW#UbHwf3#RlG<2EYi_0FC z&=XWnO>M)fzZ3dzC%nnm&lWVq&SXsew(-9v+iaaPN1QL@R!E(Pxear!x6K;|{E8wJ zCT>%o%~!aoeo@A{iJzM%WKR#px8K_CLN&E!_C*E+YzT03RxHFo-9M4Zf9*-B{|NO)^Lzi)mkrZ*c!miFBTbuJi<1||_bq2L2n;F|G^ z0~m+o=VDJuJz#iE`badwrT|o7Qu~sJJR1MzJK3%HWbGRGzyP>VfP;~daCi%c8+!*z z%v(kgD@xL-YFQY!gfze?^(KNmka#)}V5BTEx`(Y~QrZ6Z9z}-6M3sB$F<)^D()#`n zlN$#!OJuB%ffL7k*PXlXJss%K7-4#@wQ}-O1%+KECRymnP#&rwn}nqyIQ~nyy6Qa! zYNDNW(U=BV)IpElMyzBQ8?y)flXznOKqf zxgv*H6A3^nGhA50epWzdgzM4yDAl5tGs1~}{aY4x9|_S*t#2&NK`s!Qc6*&y&%#`# zux-4@dNmrEwqm3=?VgGP@jCb&UQ5ifHHuwsA)xXPdEyFscRg%_Wt9(>vU3>PE=MfF z($sO0eZOs9Y(i0ws;!Tt85+`-vxDo3ia;0Wib6oG1NxIhxKB}NtFT8)m#*#0d9NTi z%=s|G-RN1Zz2nm!F%+I#@tW_8!%vdoR=-8a^iC-Pa)AAAqTMKJzi;Q|1>rLMPeM+@ zz@G?4?)sILPd+4o+d4NW13~2=SQ7EiT8NMbs_lx&st|@%RDmMr!)s)cPy9o+ku>NE zQwN3Nw=I3QBXqvJCY_%9uj`Zl6aM}4^GngI(E=syBmxQ;Ot`nS!K)*ixY zqqK~>Na=YQRtwchOJ$PIS^koRaVLOJazmTGUlX6esg~AYnu&T3hfvZ{H zD7NBlF3id7-WO0N53Yl`e>dT*RV%*4Gt4UlTP82#K&(dGtl9kUwh4vV#f<~~tE{6N z#ecRBd^L4+@%pDnJF5)Fha(3Q?wfx(;gT>pHZ*cngcXdd;5UW|EgM;oe3zDuY_;q& zQPT|8jJVB3s8*K5jf~C6o>Ai34ThZ8*_0lSI^4EoB&jcpVx^YZs|kHBJA9WqlxJwS z0iQdZbl46*7g~AtW9(3eN}H2_wJ2O$>4VJZ!a8=t)krA(dy9bU?YIXEb}~n ztj9p?>^FWkHmXr9y>$>B#Cc`N{&`7lV^7e#nUa@B;C)|DH2E@9=S4|sv^1~=H8VaA zNjxk{Ir`KoQnjIBUeooR+1$(9@_RvZ6s2gJN;4>-_ZN+0LoF}bS6Rg*+t_hnuCV;r zL=Wp+>)n`RlD;v!)?$%+i+gI{KCe{NAU=scQELOlrZzhUxPnLN;EQ*am5PjZ z8wm$(d4o|~8_x2+VvUTPvQ@O?jw%1TX_YWyK7S&9#;I|@ZHTWwJiEs=?%kCquG09E z6WT9JF`YchY+GaB{>#0wj#qxXi3)RB*X*@~sR5;D73}Y(`LeYFzqHO1cUQ>JGP`6;<|rWdeiUa%|Q-zDFKkA`8jFu)q*UJXhl?>V)I z08Ne3ele^Z0M+%Ct8+2;2;cSI9_M`XbZ28d^$-1{lCnlIB{|f1sdosqO-|j?~OW) zVF!)fpPyH_?L5{uhRxC#hE9zTtnkGxle2Kn|F^2nMAdFVzu2%3Wcjs}zy%&T{s0=+ zN_9zjTO|-s>V-@_C+L1w5-KzwqMT&v1;U;tHU|Wd#QjgI`vdtB5am^hE?tMD9-4ms z3u%s7)vs`K!`Pz^GoM7ZbxBUf72|Ny;ecj^wVEiN&`Pm~{=)_LB#!9;Aee+xHVNTT zxymFM(2yn^Dp}YBpf@2;*Qe-A`RGQ~38VQs1Qy(R5D?tG^fd-ucvP`O8W_jnc;#Pw&t>Yj~Kw{E|y4{Cx4+fUOSZ zC?2$hk06cM6SCG0{{%g)Fvl10C)CK;{Jo3WncdA-Fz#sn;nDG&9bDba&vfs|n$!kR z7o>UtfMq)7&8YFJm_f@3*SVAurO48}A=+D)e&97Tx;d(`?1}l*fdRew*XFZ2;KZuM zG<#fNT|oiVBBLymX~SVmPd2QoI0&iq-vY(o)ALKs?ZD% z!38vMB9qcPMc55C1PbHN=kQ|EHlHer7^T!wCI>xll)PS>a9sr z&+u&jw4(p6Aa3IN^o$tct+9UOeckBD!-5Px|3zpT#e}hgc3gJjTyas~FH`Ri9BX>n zbMrP&7y(n5ftikyS(o|O6hB3*s1P#An8a2-1VTb+WAND`yW=mUwm)=vLJd=dEr!-yA@@PZ-=-hrSlorPc|xgw#`=l?11xl zVs5B#FRB7~@Q$tc9dcy7t;Lhy@XZ_aj?Hf#ewP}Q5;1RIcg~!rZ6-3v=hYaAj(e2c zxgFnpOFyB|YA||ids8M5cF%siNGY|%f~ z(ADJ^B>SXn*?SmY=sABhzNL7mN!(HB6gN^~KH23u=c<}-dN(j-sNJa5pjo_pO++q5 zzBbh-E+D1*=ZhL0d})h63K!;m+UMnWQhoLiBR^y#TO$I?+o2eOz+@zl3*S8ksQjqA zAmzjBj=e3!wTcmMOAs>ukik*zBZ3fi97OT-{Qg7uJ@{I|b7(b%5k<^&9?E{kz#e2Q zFpys%vc%hBZa^g3j8joASAA16pxWtyRNyrG4-br*fcAm8!))_Nbp(zKWyv3<+~INu zdGN?*It;g!@Y&0&y-tv(+lWe`a9Z8B5DX9oz%4$$Bek<4qj1^6wkNX5)_zw?BCD!EN-nb~iK_A^02l`3q??1z@HG=Xj$@mM) zSAgd&q_PF`8v=q34i87i#K1A0(yEQ=O$X=__*xD%O#1@$GTsyuNB+(ZOLr-^xDS#U zD(=X&L7G!NhBRs(Z>j`j@swo7eihaI@&__4tkF9HGsh+N7iy%$zBgE$ay zC8lq9o~M+NYuP2&L}N;v4M_`!{`OxTm+}|`{Sc0qbWa#ANpk+}H73aL?sypQ2C*Vq zIGx;U!GNLhyV>L03XD08>zGzikhroNzda5MPvW*L`3(2YvCZ&XHqSlP6Wp4%p}H|yGB}MKU4EYI~B`fm*Q$=Qm=C)ecE{xUz!s%t0K)t zePveATuRe)b`!;R2v)bj66V{ql9`w1SgS-AeYM(?_D0D5v5Jc9C+?B#XC5lm=M1*`O6+L)Of(UvKVPBxt7)WmJU-bkC_XnkuJx5m9fjrq@i*Cg znZ;S}dJ}m(le&bVMWyd&IfVZ;8kU^%kD0Srk2h^R5hpWaxgFX+^rMYc*8RaGE(q1Y z$M=#XGBMorlAj&lT*49!E2a{zxLGMTV^2NJNMxp1j4wZ!q?)O9l?dYhc``HJ7c^6)jo1Ey^AvLMQBE5Pv~JbbGjo5R)c@ks4wYx(C=Z|;8H9LE0+D$1DnmsBJ=*} z`T3ZH^Qu41mG7xuO}mQg2Zp5NhL7AFh>aeU?{Zls6FsI`5xq!>4xMx6T9Qlpf+{U%65oSvRnh)(XL42(d9w=;v>{><(JN8RSl?V@?3&+K&IPTn>d}gT05PxY|W&F1q?;p z+r8F#jxG-=4V3TJ%BK?BKE)4+eC2^Zv;*WeM${pGWI3p{gP{j1M96p0s7KkvWLh1vz%!=XqBoc$dlQ9MEMAWeb zK@*mo$Rn)9{w<*~u|Kk$uX@9jchV9cgYQIIBuDe=sbWPY z1#N3(YD-cg0TB=oQ4x?U5G(Lw5wghiNSphzUTVTWHpCYCYQxlq@Qlj8g&VJTU_u z1FAgUlR%!@(^@h$jAU>(y3L2gm{_UI5w8@pZ1=&<0Uxt|31X z;L1<@MFXBCcpc+E0@Y2k3LYim7ypwPwLQbgM0H~UCd4tEUL3#-swdwQ$JoC5zoF4g ztNRNrPgjgvY}WhU19b*fvKNixWYdHr45bt0XtLWBa-vpb8U$$uquE6P#T~?!4=(){ zr4_Bs)~Vm{d#->WfI^3$gY!d}g~^74kSgDuqNMp?h7evn(KRvfMC^`^9S&oC7QC*y ziw$*pqE@mIv9ET6doPaN#NeO@gn>YIbC?UzuHXw0i!{;~nYqC^2XuZ|8pDMFD?0MU zzr)V|If%sg4JIb|a_zv+m#`HJ(Xkh{P83W>FdBAZM8Kz-#r!7>KGWddCxM(jf~)5j zb2fMEP90qAWCFD+7duCc`_TJRKTx}p-U6IxUx|olIKJEBnv;+58we9tsH1q0K4GNp z0=_1$3ev0!>D9*8m4(r)?tVo`kn~{s0z*{P1zqAp^#dGWn!-l@%hze;Q^V zGdFvQO;c6Z6@Mp#Zm`-otA7cZ9s?Xr)9oS`p0i$XmZE7dSuHs*JfEr!eWD^j$>%o> zk0uK{Iy*lK?_U<+2qX0kf-xd zl%;RzZ)mUd!jHErEaxu{sSr-k7B|mGeYL4^bn}$wxlP69XJfST|1F;_-aInd;ac7} ztrhMm{uah~<7v?|hhjCVj^t+Pfp2{XEg~-&3_r)y5ma7&JMlcyZlYD&yXLP}O4K$ZD2!nTy)9 z`d2SeHs)svuQ8y;n(`>4FPdtSxhSkVHlAkGs%+C4a`v`gnQO~$Wh8p(g*nVm|Bc=^g;=2BnCz$dg$Gv zv+?_cQmm;(ouZ#|bFn!Cg0mQ&mOyI+7n;d_h9Ky!TfvHGr!GcY7%^@Oi?JZiehhbb zu@i%legI)TIaSGkgo{8v|F4NjV2869doG&06MN$xanoX&DVaf*F?ItGvlMU3e(nc@ z$$P|o40LJyYyd42v4B6MAidV5=3B0Ckz8J7Itjw=d$=&J0NxH~?4-bYj52@pCZnwzt^m z6Y~3&^Hi^IZXee}YcX4_O~jvMs|UOmHHsj1C}g-h5wOKW19F6Hv@EJG)&+B(L5WTK z1rn8Yu7^Ma6NuCC(e$dj1hBTDubyx+hRu&v8^;MH6xX)#Lty<@tb0pA&_Emm^j7%N zn7r|<*QgnZ2B0L4z`|j%8#H_;dXVtLwIk#Ub=Wh|TIi}sFb_d2akqovwnr>*Ksy}V zQz@eaL(I$t=OGwL4**;(2yjY{Z7r!cevo=IF{elbtk`l8slP5HukOz)Im&>0l-X;G12(gkn0aH6((v+?LPtK z<*%S0w{^5sU=?ct7KyH<3knJdHJ9>xe-fk#nCOH%HSVds=N6+_UUm95Z^r?q|4x5d+%EE>@Qh5b#WDhaFwN{R(YWssoKm zTg7;@{LI$##*X=6VW`Ojb&agPpMl;bZ|7w}v*hak(L{pk9pfEHNDp!H-{ofI^f!FI?V8i#k7|ATXq%kqq)%>F*l@I zG}Jh2P{Tj|pAYXHN~xH(^O{xkgKVvBoY#y;!a>kiKESVeQZh6)!;{`rraL$GHXzh$ zcsLl(x=F7ey(9kIRG#sYK$9)uS`m~~nmi9YvKMixKOb{mKjn+(4o}H)M>L~O9(+=G zslM>MJ?+Ehcr?nk8zS*3tmEOeUXq8Tk4n47!aU2tWo6@^yQj^jCmRpW4y4Fo>P89N zy~5Ka@tpXw=(bypqV-nOJ>eTgvciow)Gwo?J8L8(oxqsN)<$?5N}!hN;gG69*^?JI z{fp_8Om%addAe*zrr%}I^nY?>tYXl#e~TVq8LW5gZmmvJWl&v?Q?H{i}l^xMv#QBMJ#QXl|?h!3*vl7+gkz2fsIOU&S z!@r0%yW_>Q<)E?KDm zYZoQg`2Dixr?9NHZsbb+QfK(eBuTw<%iQ6p@P#vf`K)nUY_SlvR@nb?MwrEncjMYT ziENM5Kbt)|{5x~>kh@2HT`zU@^|o*N+c4TqdQ1(D>^Bg~@@EuYsbV+zGoh5G>TX*$ zlsa>hJJWHUJwF*)aJX^Le@0qhkoeof_rN~57X$)c6ikT$Q`^j3ZoF9|$MwA$j?n4?egW||MT zYqX*8jGFkC0bS+EaW*L0Y(0oIf1#gr5j!Sj|d4yBD!;LnNf>zZgj4(TCvjbE6v z1_W|j%njRE?sz58K6@F{2;kLwW#kG29th`os~~{KSH;WPv*W_i%B{NXE7LWLc^029 z8SuF9eJ`NITzlF=#toKLS`Us`*t#%icCK2WHK0C?BQcV^#V9CXTdeYg(F8H`BEExS zxRxSqYZMld?*>JD83z9lhCNI@w|+nz85u{S^LuSe-ghcw=F(OnQD94UuSE$OV${if z$baTzdj-TUewC@cdR};lq#Be9+EEu&8*NK{+6T?>aTY+ds#%$sLzJil1cZApcFOwVb<29JC>Yv4u7GE8#q%GUGBVBrp!#-B@%#WT0BX&xDvkHN`zS z0H?M)6eL>1g=2>b=N$LE`aA-$17n4mbqEZMs$|4A)WfQrbtr5s7?Ng0q3NEa_I|jn zt@-QsHpYeh%0>29xHyGhDgB7X`2^xP8<@CS^=I$jo ztNzLAc-`V6V^}%|ekm9>8>o94iUnM$W|h`e+%O$jS#*dI0ES`tqWQ)vD@ND%Or8jV zuOEo^E!YeCRcc+`q6h-COrp}ZWV)uI6q8U0$OC(PV{&khcQF2FjtOL^Cik1sT(Gh4 zrM!T>smJMDUBGs?PLql=+q+0J5wl7JsJQ45fQK<_Bn zo6r}(Z+C1~g8K{rYFPrg(+oaopC8DMpk$HzMTXOznRl-FX69eY$um^W+5q_>TNowS(RyW;jVUBLNxCuh% zVwYpAFM~Kwbhlp9T1wk3nT+&!;P9Xh-cmq&@St>v#2S^RGl%Tf~}WY%*zUhUR;o)9eQ=$-WkDGdvJJ&0}@5~0?-V(6_< z@k{@lK?FxiH+F4Yac9%lrkhI79S?Of!qpmJ+m=vI`5fC=>N=U(KxhAI-%lTuh<>*m z^oWqodd;m){d-*4Zq1o0kI-n+P%e=;5yK**NVcstt>6&n=VtwsR?p_9^ugxYp{vgG zdO}6PJbmcx-G~vzjX2rgE5ogN=T1@`_2b?cGWyHC#@SOI1BQLe{-v(r2HO^{XtWu(t6I-N;n&FVz$2x9to$-%8xKNR=P=E91n*N=fID{>)TBh zf8Tbm<+1hft^bb8`^NW0y{MpvX76pcoRsfwD-j|ONcnr*^o&sXv1$ZV%%QiFpN9{6 zjf-z4bJ!|+%~ZMc?c^}iXlV{8#&t(PgN`>?$T$t#k8{1PU47nL%LG>KbDol?kDV0{ z-J1G@QVOq}_cFk%qrdU3#nhzbcd464`hEo;uaq0jZ8MhKKZl+7 zU&H9_?#SZ%%9aBlQojJO-)CBQqHQg-g~awO*EjKIgMd3EI}(HpB|1y#qVB!}37|vT zvXBZ_(6!zQ zj?O2th&dwPx5JNYI0%jR6A%5(>}g4wk(WLOG5b%iMvG#_u_F7bfhG9k^1o^=1OFf| zlMjlW_*-Pnq3ndhU;KOps-W5jhcxiSau*ppu=g}0Vp_(KX-Ux~5a7Yr&#(mrTa<$L zO?T{nJh_4=+m8{@kqSZ_EOb!Av^i|{@Z{tfoT-FpPCPZq+0irEx|~)>#5t>=9VP5x z!tK8G6>j5}wV>D8lxPti8!D@s7asyg)4t~|c(X?#fB`VQ1isQpy8$5CnE(_roo$PS zJx*$tK1kDJIfa(ze04X5@e`x~7=#$`yi4JO!RElC>q#eNIU``8!8)lTZ zU$#032p>WZ^Ve?rvaXJ)M&_&rM6sm#Yd5|UA}u5|cTcdrzo5lgj&++Ld;!QIYVH=X z?8RNn$*HM#aRUwR>imoC9q&|Z48&Pt8jODg7i(BdKd8hhFCf~iwixT(SWv~X+3Ylr zI`h>}=oihu6*v$<1J*#3WVC%ZJY(%yss2eZ!h(Be@zl+jEWR>P%Lv79tqsNyEa(6x z#u{N-3PA*n2|g&0zBY^xfh^CTVIr-#PI7YMZs7PvAyn_b)TC|L@H_~uEY{}iPq>n} z?$~;#jt|!|Hij)hg{Gc?iyQzs0`xWHb=!@C7OM>i(~ltGW9JiAlM%>t8J&Q|-p61s zn!^lEuX_*9R>9x^R2KKz(hTv<77r|gD^Xg^2^fzY3HCVqT(_iGhFw?GSV$DfG3~h< zg^HqdflSK~f}rX`SSYT6Sv4&X{y+leIe+PBbKS?PTP?IQ@S-G8 zH699>_ZXD;FcPcHj6C5F{Xe(q2t28|x0d00%6xUln6UMx1LDA6Nj1~n_CXM;5FkGc znk=}g|J2n{oJVh5JFLmpS3a*PR~87BFB`v^N!rl=)Z@wV$kW+49QyJOD<=Yl8J0&8 zh5^~Y!8eADN+W)gm*SvsJddkN8*koRFjfew>|4L%6Iq+aYt^L3X+w57!<(YbKjqDM zNmUII!{SYRv3Nk*qs@Hc0U#IjO1%#*j{KCi^KwP=`gHpDdD~U$`)W$A^?k*CW#Q~Ej5(qxbDft#Cy>~9)#C+`L{y($_S9-7~)(wYBGvY^>@czAX! z*t^{(P>Y^cqcN``?-i<^DSxkN8oT8=y)T^J&;GD)AUN3GWUZT#^>-KLbcKK&U6Jt7 zuHMbk2_{GS&vDP!FYF?|na+w(4jh&jqI@b_lBeXK4&MaD?*M)onPHSW+2vR6825~B zmN{)W5%8o$@_Hy1#5t)rLXpiK?-h2u`cE>ydwOem{b`rA<4q%9)~Aen^bc|6==Ibg>(P&RV}WgRheswqa_MJp(CLb) zqzr4)!=-QM;u3h0bjS;hKb@5S>n7o=#KP9cXG|MsuklAa4tsSb%$GeHxl|J&{TwLZ|aLs%mNNoC zX39ES%>VMaysNfhV0nK|f9lL8<*UcSKH=>3c^#hWfI=4+o_^LIlSj;=bJq44?_uJ9 z;=K-1<*>Fz1BwijqjiqMx)#6=m!LcO`a^|S(=&z6jxi)oK+3VszFIYfe%VcLTx8RL$6bKq|XbR*1ZbQzgi zSj?QlTbH}VE}m5*cf|Y>HS5}Fw-!V=T1EEYQ^^G*5Aee5t1qqFS06k=kP5Xq!xh*M z|FpoB@DDDaq`3x3+r7m{v4WvCpju$P6k7iqGU2d6LiCFmuEU;XD3)RBC^dvs+7Yx6 zmJEJkApYcphV3zkVAemjbW!y?Wt$Von*}c!Trf_#RVM`0RLkzWYTa%5hQz;#5*1|) zwc*`%iwqR+iqZQFBk;a`uDK#c28$AvCYC2!0>~QgiP;B8AhhqEPF;l zRaGPk_+RNVqKPF!t~8C{2ZXv#n)51z9Av~G+k_|m4$x_3v3U%Wt zh&4e8T8x<_V1=nOm2~>v7G&+R-VPfd z%uPFhu7UxIbva6Vbn-g5w~MQ^$Xe{{(Jx$4i8kW$mqT07?SgN}DMvIX3M~obHl&>j zNZ+}Zq07KdXVjgr2tnGYta3HOjU*p&bkDJYy6;^QK(yZB37R(RB5b0FZxya#Pv^(z zF$QDd%Nq44SO7J?q1=#Qu0}&}#j32j8M7R}25c{Y0#fHcgl2x@CEr-Drr5 z>u(`Z1gLfZZgoDlbkjdq$-BsCawdDr=sXeID`+~Wc3Y@VhpNmy}Aix z&@5=Z@tDq&0u5rbHUht6J!<~)|F{5wq`|yIOeXL#8LEy@pm8vXM<;-G1ui3J;hT|@ zCtVIP8q!>^uBcx}U%lv8V2fsM067-=01TIDG-{?E9uX>rc=>T&vj)b4HGt>mif;v& zs>#u4GUV#YH$|iiZ$(&!a#_bs2e)z*wyMvOKHU*AyP^HR(~cFMHc=IxACC-xkb!$bTyto&@z#&#WmfeeuST z-;H^ML7JY3XGHr_Mm>?U?D5x@P4a(hq~l&QCwSwgJZB+A&V=THFb{tWJ5=}EjuTdnF3O5iK3Xe$9U#WE zbGnn?V^@4?q+-hzE#nnVD;5R%zG1G59PwgazWWi{6^NMo+D^{LK)lA(SEmwvUEW{7KtS~ z>RN}|&_Rq^0Q-#%+eWh81F5lD{F8X$FfLI9tnVvA)=4)f>{HN#u{cC@d2;DFfBgT| zs&hG)O!5of*^S{&fTf6cAIJ<@&4ZJH`GWAR(T5*l|ExSB-CoWD#`tW9%X)mMLt<^X z5v{Z!RBPD5l?zy9Cvz<^Uo`}{;^469zPp3vAgCMIP_@40(q<|4eMapSBC?|<;a)I} zvribm5AP$<3TSvqDsl>t!WTFrgPG@_Un8Q3c zQ( zkSBWXrq>3yY{$74+L9kI-nu=r1-`JvyCU;>%mt~SS)Xx$$C6Ps5Zjc|_I5>{2qnH-e2p&}DiW6%m$eja`*5itKXy0fe$mcyP6~PA4rC<=i zBi1K6`P@jXH?fP=tP)8oR`|rsjD4{Y#tI?8V;Pt|)#_sef!JDq7bKA1KSA9FZYiP9 zV4?$rTPIlJ1`24v+JdXmnIviub5fk^#jQpn+w+$W)|3CFS^N_yPto{Xbu2ThuKx-` zl@%}yKNGM-th9Za*2ulYdpjK`ZD^8gbWS_myv#;e&$dAm z8P(i1hl8QpL*@h@h`mcyeY_br`5K^9Z<4&a8~QyvQl?Mu-D$LdZD14l{(!pSot&Y$ zQ7^M+PE+%#n}eR-J{)_0dnji}a@2?{kbf0i%&_!;$|cb_yOF(|pZbMddP{hR|F)Dr z7NK~!pKH$6K5Kj&2exLE?n0`u6w_B~!A}nZeQPQ(64kfx`;zh__l1dV^Yn8iP9J z+WqN=)0k)L3}n)!q4cuanfUnwb@NW#X}7xh*TVkCs+OVAlp#5zvuP}UoYG$)J{I_f zTToy4c#z#P@I3v;=cDVoTJGMt>*OFke%M{RZKm5KQBvNocr&-)Uf`U&mo$6cz45i( z#m6n<7eJn-I>xthjAu}zgq>CkECU8sP7U0?_n6N+<29cQ^z2p59CJv~7bv-x7bu;S zmd&2KoROOpIj#|tQ@Uwsz4^YVZ5Q#xZ8!#X&ilyRp%z4Ce!_}1(qfsV`&=1`)hl1r z|EAm-aka{(snkN=Y=m;F(#lye(Hl2C!89LjL7+jSGxYFu1IAZ)o$qTKf{Yve7yAw~ zWf?OqgK9=lxUZ@bR#$^)UGBcDskg-~9ag+0LdlFGK&bkvN%eRC^yTpy=|7Xhbg3EZ z6ZhC7nYYLHN$$)Ac+TEVmLCp3Ucj3vm~%vru#}xY12T4WeHS2#lkRl}#=pi`IW2;7 z$FknV>rK?eQa)*BF z@*9JN3Dv^sWmU9Putj`pEBT|s!rl!78*sj2%|A+@KMRzdTRX9cz_E*8sL~}gchjQ6 z`*j9hk?=nzs!0HZo;&|XKY!5EGmE;fGloQo%pUuFl_GE0QL}$ebVX~9061{M7xQgA zcQK5zsoQpoK>16r)LM!nNRY!X2|eBJopE*RHr59dk_HDg1KPn|k+4w**YU)2 z@dIKp;k6JB#tYTS#Zk#Pd%Wq@#6deIGZ#^H2;xBQ4NiD9p^jxmDAMm%Syw&_)%Cy{iV|9Lc3n^msB zI7NIYkVTLg$D8t`6`cgTO~xXFvS<`5CYE{)gz7yHJEx529a~vcj17cAjzqxrsx2Ys z*15jNYKKclUM@`Fbd3mG0?2IxY7Ct4tb-H|8Fm)OR)L`soB(5p-x42yEkM2juv>Kh z>hTL-4EGHSB*?=6=Up1vMsN4uk(qE4xwIMVop2|l$cUFbD2(vmfR|lcXC4esZ5XNE zPHU_YGlJ2K6f3D_(I;f&au_tlb}|@wq)!iEPIo1y=haBulL@r4D4=G5@0UvflO?0) z$|uOc0Dpl(V$8@mf^QE5<0FPKNkaN)jQ}}V@@B9jtprC{wrJ0xB_>dY*DeMB2=C$8U z(`Fc=qK8#j2YUBuI%=hbN&l-#seZpxTg0?BxvRT<;i=wqkDO! zB}4MBJinUXJb1Biy!@zheTuZqw8pD*JUNIJR#x{kZ8^O=BWOqcr%yO{-dYSj-PDxa z*s)hNEYyjRABe|fc<`JL-7%rnX(C`?@0WvH?R)j+j99&Gbl;U0xSX+i`2mSH6J51Wf1kFVnyc-w zO5ac*u)5RIy?^R>i8F89QhCGcwVf*8nRl+{)v|EhcEw;)HM>^X9RDEnL{@2fRV$qA zjV?xtAFSYXN|lD*(RC~r3Um(I#is&v>1Ew1t!uJsG==XeAJ0E_p5EK^=EEjwb>Q^n z!_Ms26YuXik_GKScF4N5opWoN;^)uvl`kI4Z>fg+rS_gloq?MD=~wCm-1EfBn|`#{ zJ#5A4DKJw(Dt8E8=k4Q3o-LCVi>yE2dTm9E+!uT-a){$FpccV;KpL#3Z&Al9BFA1# zplrBd2@%z6Y+&lqd<|1l7E%-ws-ihV+wC#neCxxBU=sOf0uCucyn|K;@XK1KD@QA< z9y)0v99M?7)jAeR5W+;mJB9z~3X5?BolN|sR!Ak6&jcHfYzIn+f(n0xU!QSojH6>6 z1ZhE<5?yOII&6Vj%G_7(Szz`9}$F(ofOm;133h7R&kG{OFc+$fBY6VL|W zpz&tDg8|{-fS4D=?+~FY&KTl}uBM?8=@Kp;zBOUAVTJZ}2~OqHVaU2BmvplA6v6sB z-rFC>%EGe643~sJfTV7wRpK4T*|P(*kEzCiK}Z(6^LKXG;{ZbgKmt0d$nHx}2f%Cx zG{{(`t5oIV{rsdMr1)J%E_VuVeKI6Y1mwZVNuWxc6nC?#{@{!hXYW4h*XE?MATuXBV=`oBd zw;0o(dmNn!yVnknb9%Kw$fB*8jwKs|&4E6Pe6e|J9Id7n1^-$%aLWq$p`A*Lf1W8(@;X8aY6GhZ^r)S`vjs-1`}Mpx(jPAB<7r zLRRn*DkwM(%8zz_rF%xfB>k=jWcMY;C4qk2mI05RyDD)a1PtzU@`^G)VsW!C5kS z^RdUchcjo$>MF73N774AeoqF%{_Fts!T=e;@cN8`7iqL#gIcbMBt{o#c(}%AbKNF~ zM%Tp6Tku{)%&$~>4!=LFyU=*-N^!3B2aO?+?!KpVa~|oRQx1u5#2wE{o($Kv)eA#o z`aUZx$YY-q%`LZQ#0QpXH0lys(ORpZ6ji75{_<~))S5z zD--0Rsgt804JYkn(H)=VI8JsqePjAYr=)ky=(T?KxZ;xXyP9bb_xCE2=AX^CY~m|S zrW)UDoO-@_eC$lp$%c%R@^l&kOG2xPOEpU_+Q>Lu;lDR7B!%58=vP*eHmA-h1F&3N%#?Z~8o(nkH zLylz4Mf`T+UgkqGYvljp%v64jwnc5JhD5Ze#hD+(+8#_+IACHKkZEW1l)F$^&4~}7 zP86TpxyID~o(MVS#8>z-e37vzA*^H{H7|?IJ^{#RP5jifC@nXbRa_VY=d$(Oix9)w ze*@$|O+ofNvoq5Q+FNk5Xe9a>Au~AWzz=@MIY&(k3LfY)_$5sMl_)7m^lHMtwxJma zpz2|Mb||@ix+3yaFQN$Wsf}m_lQZvjIymylzaU~UwFeuvscM23=*|Q#DuMYM4t2Hq z2i`M5^^JcPHZ*J^@ohf9WQbriK?8(kV{qSaR+mPJXNmhi*%T3hq&h`Nz5FLjdN9iH zp8xMCeHSA1=1{CnHTyyZGH&s~4BGCd^$a@G+kkpuf+NW}@v=yw4`L8)3Mi8JIM|hd zb&mIve96F%`?|y`)w`d?GzZ~JFhHo3A<-I0+qq zPN#@?3aCv26MrQD5f)rLUVqnJ{Fk>QVzW*MBwVQ?|AvG+H6y`~oO`Uv5=-Hn%yTf= zg^Vz6B*ug6>ALN4AgXy?p7*G(TW9PuA`yKZ{x5=@>OwTJh9{zF7<_zW;`@{B;}IO;xdR5S5YT*6pAOezbD3jMAPdxH<}>xT&@Vc(T#lcG;pIH6#w z1xt2I*u-PG2Yv)eA$NrRuRaJOLt${6U|L|!W<+;1h6s%082Nu!hY09OS+I#4?mi2F zE9S;yxN#J64F3gT6s(L&k=hmN18Ym^awHyspbg1`8RzGeszihfq6bi;u*AiQ&{JrT z%3)OnyD&F%xIVxr1O3P{0DCNN8>fxTQ>f;!Vywc$7lH?iTo@EBGBP7LzHd3@$5s=! zlq#(ZT#Z`Rz)Hr3(?6AgXZLD2n(Qzm>)Ugz!m_457vMWx3Hy}{xO9CTke`SHmeZPD z%K4ijoyCmr;U9KY3#KPjB&cJu0ep%vun@Z@%=?;oxrQ{HZgbszk_60E1lsmTy%b}e zg~ult+sH_$DjXABqq%swub(z1(1CJ$&xcqJqX(rMxa~ZNkV8&Rj1>l@i;vX5Y@Zn%$%|_m=D(F) zYSd*?z(%WL+brzPM`5B`!UN>APFYWHdUARkQD@rExAjkZsgz!#%Wk~Wdz}YG&pG$z ztR@UR1`Gr+uxXt!MClrPy0~7zmS}y;&EwrKXNE?T8)rX; zy5?VFX}?ySMlu>Y<2=8nnkQO%W|Nd~EuN`7uZ4#w?DQJpYmcVsiLa8AXw$!2Y8=x5btOE><_-7&ryNbil|6wlGi4UZM}oiCNYN2FYum-F66DEz1O zhK`TAHm1y2)Vw&8L@=z2%a{9P(U!!UPeoomaS+jFmi-P2)Z>?Y|8#d+t{moJq$Zv5#uRnySjKq)=$xv=fQ`n7iXy9R&<=`)~B3fZQ= z@V$la)lZz5E~`(`Gg!ymiR4D4yZ+?cv!do~N!Q~vp|;YLH$6X6bNpok_ho+I^u3#h z8=2(^HSU!BFr&d+K`>i+*>OFhsWXr}dPA8qFS8ztU>kYqHQMOa!%`(3ix{piy5ufD z->d*`M8b}RpH2m*k3fnm*52732kheRHnd>~8pHdzt$e*Fo_fMs#apGuzW`D{%?~@{ z@uV2m;_KRX>@3?wR3bQ}-v!17bN+F3YD@G0_l~*oEZ7Wv24#7Tflm*BxGZ0Yl`_^O zE1|#vm)TQYhrSMm;~on!tw>(d3sZ-{vKXG9#R|5Q3u->jF(ER})t<#WJ30w&FLy^r zow-xrk(5J!7zgf*3{H0-VcNwM1nhMHjjvZvC8&}(Fw6mRk>4`kcV%($$M_n^0K-XD zhlL(=L)Z6s4m&Zl7`6drIxCL~nEw$aMnDMSfo6IQY!qBqGMoh5$d#N39PjJ4%hGd; zEZtzz4WrOcePcw##f>Z+&~L+?C_TS)d9mfSDiGL7>7qi=v;-2I3alW~lYlISF|fYR zCz~Wr`G)nbbO-GW^r3oPH)#;Jw|Ws$sx{H zZ#?n$K^iEbegM4Av}kNA`s@a%vyQEDIpt?JhOJ#odg~;Z4e|T*GMA$e4| zfNK4*_4HHlb;8I@KJhW~Kdk4F#aAjnyAAeIm@k11$BqT-wxhtS3q3i@$r_EN9=FM) z3xqIgYs|i5xeJRZaEV-q_6nlrWmtUeTeL#{e_Vhi;64IcBe>l;k~0R#fZl}@pY%-k z#C4Y6iXV2F{K_=LSb90svG!E1AxNokUO}Hfm(#PdXd@Yk9a%>O@makN4SATZ(Tp&b zl%#DNAhHIuOsHvfP}YgsJM@agc)?mQ#Ecb!|3a`V7V&-R?%eP60WucVNSzukRjZ(H zfjNWYJ1Cg*9T64DFc&!m5Jl})6W4w{f zhf=a1b2_FJ)z;(F&X`g(^v;?!IoGdq!ZkRy2hG8%sJxHA9=20Umgbf7O`?8Prm$~s z%Do$Io}Imi`J&sSXC7_(+9q>RhMhaHyec(Md{FBXqYqrV+{JZFb|l$D&+O9}-LNvB z!Rt@X!qz>VIW^XCBU#>kixLgSUr(Dac%MD1INoCXUsWov zssGQ<@0M>)F}nQsg)O~40U?&#y%#R|(58I*ZW9}{ueg~R&Wl@z|9!qW`$WxS`!suS3iabP z+LF6&6iQ?E7r>I#7PHhR9eE<#;IARamS0UCrjVjPqIf}Kd##peHL+% z-gE~Sw4%M#WFs)5>-n1opWAciRI9yIf%BirTc*q1bEg9zOUTc+;_Hu>7H}FQ}U{D+;!;fD&g!6VT*8{5bKT> zTYCc7jH-rl*?_^A?n=)wV#~CT*709~*s|s@5kFmQkUgZg90}fC%gPYQ!O%_(eGRCNnfvG(s6?QKG z#`acUbzEn~I{H%sH+ulJh}1ElYc!#2hOCM3&WXMw<2#Vm z@d>s;-#W>JR}tKhDoBVnxbuSV5#>uGn`y!K*dTZy_LjA~O5{zLWiaQ9X0B&wvHnvT zEz)l2MQSCIKsGV3*;W5FQmQ|MgK9cR+YDRkwIEYsSsnrYqcr@a_(V1_;--Z8|9qM3pqFzBL_>n~-XYhS$0 z2E>4!S%S!`TehI28PHN+Dvon6^#H9*ho~^|=1Fopm7}l~DZ*6(w~JPEkE}`=XSRNA zI@;o7dj!beZLcU_-4(kLLn%5QU2!5|QVSv`2I48yKWaAhJtUi`;Y-YMwJK#|Q5(cKpbN-1}w)EPKecS47hrNk-7K|HrJPzt05arj> zD2!*QbB#N%MT>*mVnX3)vD))0Xm2#&e3K-niXf5!nJtqd?=&NFAFtsLmk~=5CzOk| zt`zb~FvO65E@X6Qi=UypvNfuJlomhdXXtkb))u6h7#yqyKPMBfV6~@yR50$74c_xY z`{ZORU%$mABf)?ioPGc)CzwR1kVnUb+nH!)J-*Axw?fNLjI7BkI$xVEDH_V5Dn1Z5 z1hIDp?fa;#O@zyjE=BETY&O>R(!owhb23d+C(B=pW>KQCkN$IQ{|Hxqd;to~ z;QoR6KWbzzK`G$8bW1G_RGbI%y7MKU-IHL-7Xp|x>GQJ z&Pz8!nIU=gXn2|X0E<;;pHgn6gCK;f69!Xy&g14&n>m+jw1g@vYzE)%Qx!zWDayBb z?D6jFY-x@gNA=3QzhKkklu?LTX+s9pe2@E?N;rb(W9m4w7261;Pc!oSG**^uyR+%u z(ohybDM}kEqdysJv0AXWD9q`4+h&=Tf-1S$9HA7Zo)NyuPnN&6gsX1n=Z)@JW)}M7 zQBC@rx!i2@Y3pIW@b1*{mu?DU)$hDwFRIcZo?;aSe)o)tweyy-TdR+$b>IOgxAe6I zS(aEWkF{vEWq&Mqf~*W2i#UwuBM6-43GYyUy8;U*75&l2(p!%qF=OC~>^q$z{ATtXL6gM~*g_rjuB`DzXDp z|E?h~n{_&55wJ>(IoPXXXJt$t#<3Q7nEqNx6TVh@4qgxWF*nz;#sb+DwX#T23NYQv zWB|d0LHsM!o2*P9-6X)0K>k>@>ym0Mcd3D-THj2WcZ@D*(M~iIV=Fa{9v&Rqt`S1I z05ub)0_qPg7{KSoc@0uS6kC!A(!s?F1O;v(U?ov{b@+844;NcO^dNA_rJaJi>?LYW zX%xNy#j*sc<)EeHW7i~`1BZlp5$ADA9*}7DQv^_W5B>cKr{uO<9oM|YA(|*Z_|(J_ z7ljf}$9u&y<_-;*`pJZfI|N}Fy*V-XNj|s>erROe7$u+3yZtIL8p@iH8cRqJ&|v$a z3Bi1#iC0kWpaxpsEpZaQE;09rbwAbnUzS0^m<^&qjtGui-5rUmfbW-W==N2jnd#{9 ztxk*|h&ns5FOBp9xOrg=9c)+e0mzjF#W6&h4mIvBeAmcO`uBn{*>^YV4DtwghmTbA z9e6%8GrWm*QCT# z1~j#PHPC{nJ({^a=qcM~YQG?KMOI0&L`%L(5(5q8YS;xS_bRgcvrTJw#U+8D&e12H zFWW>}$6|wg>D>bM>4`h5$bylsE8sSZ$qQX8n9%Bsr`jbO1#aa0*I6;(#>@AbrwF@* zul-XmI0Mt81Xaquvm+fMsX^nd{hISnhh{0tss2&7A$CUG^UdNVA*>J=T&Y!b@W=6t z$2z217M%t-9zg2XpGgUNr!1GDA=*Betr z*_0gk#N#hBvnb!JJni0yc{K3q{DMzAJtF#HmrSU4CMy4o;W)4FApPw?{!R zhN4Ijs8V>{vraMLdjftu-ZIgBWkh74e`i+je1PnWjGmC-wEXNSJ^u3S;# zTEBPD2SW^15}~>rG0dBjJy!I*oXd{?M{QC*zwz@{~8XZIEH1IZBxv%eE<-L}Q{ znC}Xw%QJ!tq-Df8TmZ%a4pGx0o)vCh$PW6?GLT=f{cxkrJK&f_UGNX^qqD4f?EJ1x z`(|cgIp9=+E|aNK!|sgNbOs_Nbp{eqKQhoaOq!q5oOJOcWK2)dasue z7CqPWJshe}MI~!;mXv%P{=QV3bh*TohyaQxIh9pt;-g`EL{17U3XmrlQW3qig95UG z>3*Pfrw513`O$fNUPtqfFhIT#r>;b{H0sBuo2$F;n0|6Y4TF zK~;-j<%;v~T@gUG_RtHAM*bIF`3#JM>bTo)~jvZs<3~=r9}^6SyV#$2C_#{TM|AA+Ba4eyc{T9HLBNh%%JBg z$j{h<7K!eNl@Us*Tma0c-psbf3`yw^2$q~ceo#Re*$;i((ZSw;(>_=sz&l=?8zqQj zV~3;s0HYIb$CcQFoS$_Nsc>z}C@EfzfuzT?YA<;`5`b2#P3+tykcLJYmV$O~`oH zL=6OKevrmYFf^WBFj}1Jt{L$;u7w;8#_c-nwUt+csfT z8UsxNKR^0dAJ!4%KmlcFx@`U{Om|8{4uZd|}!EME^Z^gyp(2vK3)OP8=r)Z#UyMTNa@TQ9ljRGc52jUGJ-`y zc5{S^CSSvwogWcDx?a|~*o@w1rQ^;#8)bMVXdm2Qu#%3%f!i{hrBOr!;IpC0A@+E&3a@FgpC#**g4007t{`OZ`f-avE=|(!XrmxL~SNpmD7V<|f+t*0{U-HEBS}OESN%wOv4+z=%2FI+l z`zHfEUn@7K4o%0&tmk`q7kE^;fkc1U#z~Jc^dpz0OZOc(8J6Y02sjS$;vgspR3j`B zY!3QE%pw|g%g22G6gQAw+VeZn6&7d+9bVW#er$H$3~ z;}C0sYv(W?SP~=o#C@E2NO`1@Ii(|aDpri1W5sXpXbF-!?7@!)5O1Mrk*H<86+~#{ zw56!q`gc4Ia?)2Nnw01>-dVN6`5>gC@~83540k+N+{n?Et`6+jsYS*Mite#pWZz+a zhCbDD)JIm)o_5Z^H~C6P0{O|UuO(Ky(7|4Yw44kP;^@R~lF_($8J;78a^W;apot|d zDH+mT7s5k8q~i#TbCbxaPRcopTUI)fC>%c7z%+qwtK&-D5`&)}>0ZojrH|Gb_RB|hOF<044sK%1*1&ngL_ z#{iuSR5%^|VzBft4~gM0Pw{jJl(t_dUh=Ql7#Cv-y??gwxXQ@uO+!<&Wnkv4;Nq|? zK;DJ%Cd;vqJ6h-bcgHhsRf)36S-DU+o?Q;JZ9}$}m3K;_11;l-pgA67i=7)7teskW zyhDd|B}SNK4iBCXN*?htgtM38q@vgTGUZdt0WZ#FQ+ipakHMNUfTe30z(%ZtV)dxt zF`+*Zi8Qf4-34=OFbcyF#c;`aXyoRQ++_ZqP;RfdDV!blPYcvYZvQYdR~iZWqwW28 zqXFUpVIVP`pNbgc&HmBAo%;yMv4{KFaYpx|DbT$zE>^Bc*IYt9%(itfK5a=eM>@6^ zoJ{^dnyv(_sWa`eBZ#121O$PKh>glV0uot8R8$sImx{8uc64OXN+^-V2ndLP6ruyN zY7L_uTv;sW=!9aNW9 z79H@$S}`lFkBG1|0WhZM7*DEb~#Go=MkGtfA=+2X#FiXLXFq zu_^7w>eZ!Co!jD2)X&rSsjtBFHM3=MBq7^Nm}5U}DG!7|dwy~)XBT&w-nrTjK-q&2Crg(3kd{rSos_+b#P8^l~dOt|~%wuZr zdi|w!?&~>jg7DEzJsRI)6M ztbhETQvSqh@&}Lozx?uZq~))lxRYm^xLoePlWTta>h$=xqIE(;tZBvVh95?8)P>p$ zVN3EB))m-_Ha6bG;f=jX!b6Jxjg6W`S>{M-fkT-;^<5+E+}NAq5+WCXLRB1=)*HPm zt@q}FprXKYxy=nLDQ^~Wyrs4v zGQb3rpd{=~rN!mI?&=TMns4gxT1(C(enb=#JF#x@b@Vr2(N!~cfK5Su@wQXTpcKGd zS6#akWo4~%sb13#YxKv(Lz}~V5tK12BT{$k);Ow@5rH0iJw8iwd0bqj6Y|S; zV!fb--E*QCb_!s})&6;jaaZ&E4pul}Y0JWu^(A#z-8QCgTF&If2TaXX1g7mX^BZ>wxjVXp-6c8k|tbu9p&%>7vXo1&HY%(Za z6ORcIGim~Bux0oM*qL&J<_7O1-v|p{u&J!KWuLn`HV~27r>m{rZm<(Q6JjWJ zOi`g!nT-nS0)J&lreJ0sjIdb-V?l}`F8`PM@XqnIJ0h|#XJxHSzvBGTK-yC#(X}@a zUd%eLyGw1?o~Xg#o{GxWB|3wF6{7kd}7DAc8^ zy1R<}M@}!#Z4PLTPsMcUMbq3e`CG4!zY=_rZo(b40sQN49pYc z=kH9n#C9SkkgLIiq}x3h(l}-QQ)q6C-U&{vqxjJHv4qVQXjDG^&Hf|B-jZ!>`Dk#` zf?de;k%yLKP+ZP$D2jspy9_8p+@yzrA-K9-@IsEL}B!0Z`VDg*X=6WwJgR(03JoSYa zvTW8d`16yb^_IdWMJqS5No*ucvllHAewRMuMU!^Md-05$=GMwzdwn`AAE`N;A@FQ? zoDqHYlEEe84?LTjEZts5^))(r-B0FO+xBIPCjs<;*xn~}-bt98MPUlw{IXm4?)tCcg6Vo zFuLd6*ez~_0Z5u&D)ONh+{q?MU~*wi)2x5v9B-}X`UCe=yJGD6RddWY=lV_dBs6X+ z5~aFZCLCwmpA{aLeP|O4Fzsp)eXy~Q;w`mnx{-DOs*k|VyhE-MJp}KFpPpVBM z;_(d(1FVV%c?xWsML4E+Vj<^)|2L#hT|{g`p$0+jZ@wa-XhqOcY6%>PKyBsFb|bz7 z*ZqzOi7Wj3juMlHT~i>%{eVInF6EcTc%A>RnUhV^*)!%%^$hHQO>WN6_B-`%vAgd! z_eUVz+zb`95vy7v{9h5dbeAVgFjDYZbmo#mE@lK6Pk&ygxrQx8l#}~OL3m@LQZxiO zt-1UO)ZVK1L>-CnlQW;-9-+IP zr0=GGhONurqzOq@IPog~4g%dN1X*ws@kP6%3zKie*K4o|qr__k;?yBLhsGWaMsMcW zy&nnZM3^}z4`-~NV0X&8zjOOJU69I*Sra>f8|m_YAm$bqu&dbuH0Nsmu;#>esxf69 zRW@+&+GLMvzg|sz$W_VWaU&9R$#4kSyS{H28!bv6I-!o>CPN45ZNTfX(UWL~T%L{h zp!p+#m}u%9NiSeHV#NsRtPkjm^;%-Cgd(=u+%z5Cm!eDoHrt(`btJYFP;HqI9Ga}^xjC-Wt-vp zW}``BPaLdZ>2B17ylcytir+QT;v@Lz;0E3(%GQTXIRKv}DA((UAvqOta%IB5!A<1U zKF4&8r~=Waa3bLCjLcj8#L3yb9TW1l%D9#6j8xp|sDw~)<|0rQ&nacr(N>a{mCLkI{1JV5qSnLRJx|xd zGT{xyOZuS3!AErW#(8JE$&H$sy~~Z!RoA^`o_}E}_4NuYd&EP-4S(jL}8z`@U1z zRFs?JQZClX$eN^kIuiCzsmBr2to!PoR_qThJ--#bW-2W+$UU!k32Q9h`VDhpt-)*N zV~^Y#$VhLG%QlaGMQ_DW>^?lYI=7}xUs~8*XrJruGETz{J%LQ|d zWvLGvH5wz%s$S?dbZ)B?=G$YJhdU=N;|I-kG_^h)nNt&3MvMOB?<;ATC~UixVa)u% zTl?{Se8L8U5(9%0<_U|(Mj#sdmC33_Bv(S5rCseR>4OCKcCtImGbCrt?H?j6!g zUND?lR{-&ABL=hLjinor6Z>2EB2hlx1TkKRnL9$X9#!@+qh|adw8dAuK1Y25tD~@s z#TtcNJwluF?TF9;0OeD}K)fd8d+Ll%7;#xA#am&=%s?~#=yo9pE1lu`v?@B>*$M6967b>iq{cX*=V$O&Gr1Cnk>DxDD z?W}H1L6!d{=+`#vYzQy(;%<>|mu=!8Tsg&J!yIv%LV-V_<)$0F9enJ_D#h1==%5$C zdMYc^lFYSkfEkFMfy0dQw}!`f9e~41+R`{6_1SUOmVtD;-!rrHD0-i@&B=Xu z5O$hjh$}&bwn7+H7oX(_920G+>*=fLDfpcaXrd|r6tHx)W9&|t8?^mIchSD1*LT>| zu1!279ty5-YSE?Wuu#3NT!rl_D-BwCC1nGrz=O1TWCmDG#;bv8DZTq?dn0+9N;&NX z1=xVl>pO+QhTl^`UlXJc_QA@+EDvm;@ypslLZuK*)Fckl6UzDmS=_cJ8@8J`_WIvST zX|K0%%hojf-qwyXfDXDMI5Yf3CR|69=kNr_Xr2DSj}z~w{XA!e!^g@Lt@GtCE$3J= z{jt?>4p2=O?DdXFRn^BgFwf2^8zlxk>pcR(OZSGn5Vjbg)yv-n9= z`O|~_s($^_tcL@PNf9Ob(SZX=5>LSc*?>K>)JtOI)hRf8T(VSH)yzg#RMn4ANq8Pw zF@JXHK<=o>LpWSBeJgpqM)+g6Of%__CvUnd?!&xmd&0Iw>}}Rr8tVDZrb*T!{2i-8 zlae15<_)q%XGS(@(`x(17D-h=CFIK9aiO)ql{<0eyxi&c84npH#x(SiYiSnRxn1+m zq(ApbbFYTmQaihG`j+gLqMt39Nm2-S@hSop zdk^<>Z8&f4g|2X(_JiUrn{jWgF=bKRK59hptFu^k^(f4O*^sh>AN+>i9J9Lu0wUP% zBj5$j3DFkWPHkEQ8uK^S(WJjYAcCMayIwa3teulfV?t7){LdQv56!eOs10?X-L)Z( z#`m0`d#?4)>8R&8=PyAQ*kryNOA8#s1fQl1Cj)t^i_C*Fwn zK!id4M0Y_-Hhr~UtIib35-IH@9Ls%_JqWS@YP{>9nO!ym(}$!c=aWwOqJkWS@*Os1 z4sqzBfWjc*;TR$hB`qv0v{hOnK|Kvb0R$t)6do~rLRag0=&%9c0*RKW!XYHwsx4_} zshdICI*hu@E$_0Ak`)H60JVyHScT!QaH8*V%L_WO=IMp49oKp_;3iZH&xu%=byEiT zF`H3)D%XF$qnWO#GgV5S#=5O2dx@=#SmQ#E0vo%W+6wWIQhE*$_Dkr9@|`yOra_Z= z>Hj82-)u}Xf_4lMqvrfvi4i#F@WnQo?{xV4})~>NgFdbltttiFFUniZFg-CzK zn4A3Qz1>P3fy(W>b352E)4D;bx%nBUVq z)!G}|ZAgWmlhdh~KPFzgrNhoO0{ZGos1$T!{Trk2kni3oJ*P+~XrNqA8-mdXRL#+~ z73!vCsTB@Z;s~G|;mv~NhIWJBxuDPzD!jZ*L{s?ivCm%2$QU~zU4zt&i*RFO6?z)> z*Ci4D9ch|TS4}rN1XK5LgeHU|{&i`0L9II$ZedapQvGBsv=2WLQ#*HtAscM&9^oPM zCz8^!XK{dqdk;}nh1x^IH?`YhfC)}Q@#CKURA%q0x_5x(^`J;b07ER2 z3QGV3BO}h^40RO1Nmw_blBY+pwKd*-L@UfQ5MpKY>mY~{3Mg_2IZVF%?G%_cU%cp7 zPlq;arx)@2fo?isG7iD|Jt;5C^&8MHqS}aFDQSwx8ZF?4EAY8lQAVy9DI#G9MWvt^ z1f79^e55R^h%*+dLOVJ6Q(aS^eN$4#^m}{Zyc6P~E#~I5DMQ;_%d_3N4YQXm6@N}f zMqa?vzL^s--V?KzH}x0MD0Um$lv^YGC0;7t*CzOsiT@m25Up;X!fsY~IG@^UU>G#< zLUW#G_hTfP_>>y;CZVTnw_-Y+uaIeTM_KVr-Q$q%J{vA%G(0}ehf_pzobx>*{Y(6O zSGit;g%#k1bc5L=q`@vksq(@V4^t6ZU_hgBII3xLmv1HMxO^k}#{55xw#+G4D z^e~mh_ol`$7BJN%_07prWBGc;I9DFPoSh&3x<2}mdYOVYEgcl`P6=Wf=9>Sz#x~Gp z;T>P-KeI5(jd#B^cA`b~Tx;q#9L}+g01k>5EY{F9_gqW=bHZr>rLMdd@bpjFTj!e$ zJnWD&S*emM+1+-xwYh)%qw#5?Y^qG^ zI+`8Mdf234-mE_O=(mDX>Cs;(7D@^rJ}TMirErxDB!=_bj0M6^KgKgk#$pdyT5OKg zr_+ma>p1O3w!r|2kE93bx#l>;RgFfKV=rKD)PDU#X~O~ZsNh%D2Q&mFxiX0>COnd( zNnT!aD&bKHlgy5JqzWog&oWCpueCU=6g%%$s}R%y-+XTbQ(wxcaf;#t@mV~~eZ8BT zkZWK$!YlOaIM~;o)7*l27Oio8)XPC2386s(3yVlh-&FFaNHd1L970U}_b0_3R(+YkNLKzN;A_P4p+4IW7y-7FgNM zyOA3D=2X4Medkl$nZM>5h6MuNKkJUHumAm7;{gus@SS=FSzXN6rfkw-=Vq65svV}c2y zNvFSQu>zC`ySDo5*8X6yUCsSArDdA2vwTeUqEZMY6P@GqZDb3COp0j5>gx>Qj@#Rt zW5z<-zzD{bs)empD*CuDF)+&RdEBk5ji!*aQ7tj|Z7*U-MG}mjw$9Sk+k%z5K)X1# z)0cE}h`&-f?s`9fN&gI8pp-Dk$uA%*=N}FqnfG%4Y2;75m@fPq;PDaBc5zML;T&D= z*;q?%WgEYd@3cT`8$>Vg-lRW<;$t8Px>{QrLtsZ)z~o}`&W2(d8Sdai6YC!s&Tb14 zZO$0rS6&uL;i!q+@G&Gp-_zl}jn&~&s2(YJh+U_FO@I`}gk321cr97e4fDIY< zAI_T=7JrG|9y9bZ3Vj5t;`o7C>Bxz5xdlJ2@8)rn5M1 z`KB>#nQ%VY)B$=az*UFM9aTEij|(a5^s5TpF>?O~+}H{=(#VCunVAE6Bp5D$NNJa0 zuSs}sfPTGG&-LA)s2Xr0f=<33MH(VKIy9;bimr~){P_8uQxI`5r;kF#$I1Cl#bs0) z1fRpQZ59_SkLa7EuTR*@uO?s~6o$wr-+CTc6WAIO3`0Hd(M%ebAt!c#oUEy589MPa z?n{#DYC{gFSgIr|*x@3!f?HMvO4o+A4a)~PoB|EAfh8-cQ{l|!$&v3^0!8oJ7z1_S ze{f@0YE(eVAnS1Liqm!(&l+2&ZB8|gW=DID&m;+qCF0}4CBmhkjg{^2Bni}rVp6(3 z)kvZO%C^36r{Z0ymm+!YTTD3~O$ja~O=l5zyeZ{58CBU;FpMP$qsg-BGJf)0y&^BVVeTw*ZtB|u zLpp<{V{Zo&dv-`{=0VQO>dR`D^LBD(*m2Y{;cN?i;olb^tGd zZ9VYB4%EOf`Y}Ssim5Z#w*eG;qt%pme!*V-jYUWG24^N7OqWj991wNhGH#Hz%ugCL zix$?*jT#6u!r7MKT{HFJp)@*beJ?oTiEqs)_KgySf9@Zdy;>uhpF9&SG#wd#f3(l} zKuhO5)mSXOFuEQMNHdjS!_efd4>QWs>%wA*Eqw_ZH@@c`d4x=wzZfmV=@c6Lk zkBu=5=sP~yv%5*uC#&-k`pFW*&lU?bJ=-?KYn<0xwA@vvx5|)${b{nnM@Eu+mQSd| zEw)Tc{a)STTdRMOw6MdGg2H zxdZYKf=^CdgN6m>Ycsy++wPZ%vmxZb>#;V(Zc&h_!T0m>1KS^W;`DH2M=&4F+-hf# z4n-{JB3^FuU(s6o>QR7Z`f$fVj>*LH6$aS*240WJE}@AEom@vp(7!t7gBJb1XfuAa4w6o5r_J~g$QPyMV^81Yo}k(}4-6 zH9@apdiVvzr5p$)N?WCZ8HNcjg(iQmegY|egjB4dLRg%L@6cB$S4IGfAqb&AVSf$L zZg&$z?h~9fL>?d?WTJ|4Z1Q7a5~4C~2z+nCFaU=r4nIFDwfEKMC6||*ahb5WGjYV{ zFa`!h7y#luQCjDoI{ZHuKsns`-~7JA7GsSteQX(J!g0q1%riEWA)t!-64$2)2p=(N zS90q#3E3nhvZ591EdT_4G}}Rx0MQOFw>L6gG;BQc9-M@(se5tG(CwG)A~%BQ+%Wq) zcalj92e=E1u0EPeYIa8mazA$s9U9@_G?K zWf~hi_9+jvECZ1<6LG{6gCO_+GT8{k6gPtazW5E2e|62EcC$HbVD|74p$RTOCR}v* zE#bXx!v76awANN5^%$mQ}1w%41kS-U96m@37O#b`EJE zfew~`!kt)WaL^2j5T#>EXE<+!5s+*AmxJf^%c$v{S)#QpUG)dBKr$z_l8`=$cC{r% zx8p{d?k0OCB*$~o0$bLkjm$K9#J$Ikocfmfa-ZQzqJE`c$ zbSRwof?Cm-WeFf#00P3_)SiZ|aNz7ea8Q?mrXIPp!f&g@@{M zJTyBYId_w4qLZL0TPhq+em^O>G5xpiIApS#+_S_Lt8-K#B({;f6R!2 zP`+86j$10b`9*5DS`yE)iI*&2O^n~Bvvx-(U1HaqO`n0R-G*ZmUp?8Zx1$_l9r*-% zZ4P#9dmIydx1?Fk@7g@`YqZs+*X$EMiZ@IhI9o6|sZDc!or3k7xaMJJD7Y~`=7hiY zQWSXgHqFj9b?;7jnDRm;RejH>2G(H?j@n}#X2M?fv!cr*IynvA+dZ>gF&5h9t*Q-4 zUDK}NlMfyqX!8)I6u9l%@x}NG6P>zM!Q~LmI&O6*)i)NNb8AxLc9z$UZS2_I7CqXE zs>rem9H*BkH2NKmny($qavdme4R09yUGS*Opri(HpJYyU*Z$Gt8P#a@Xw_)d!4%fQ zTE9OxrtN@H`&4-It(vwPxe>_U^2Gv$*o!wkIKIGpDz->heX{(#JELb=(+A$@{U$+x zbjVUZE|g`D9%mj(KziB$GG&>nqHD0BFL|0Rk8hNJnq>U-3QeWdY>2yIvc%)#tC*EK zUt(bGGZ{K|zIUZFOZym1r@FVSx(-`DOfsO*T(8c`;)DF{=@J{K*4Do;Mvumo^wu}E zmPvU;1y>j^@@qD}FlM2euidu24dc=?kw;SaEkZi9!X3j7s0mcTrgy>MtDQR$UDoyj zz@y-?v*(pBrXU*gYQNr8!+1l}WXG)imGY>(FJ2b74jMPijkrpxqL;~bC;u5fmXSKB zf+exY`F5@g9GD(GkF9{jbhT7nAUd5FHsaS$D8!Jwcpm%Em0iX&d}KUdcMaRzB6A-7 z=PhX#w6CM`$a$LRlq|qe!nxwEQ5s-Vd$xBx?zH*ha7q^U-s0uz2`BGd>U#|5 zi<~avkMy(HnH^HV`+Uj5ej~5`^rCZrlKBU`SW`!29opFM1|| z45Hn1490sWHt84`yJMM|jHFo5d~qN2=jZF1k)%L;kgh{ekcfNQ!T#Z#a!bWWQ=^ZS z50J`S`vDTJ<4KZw61SOVMLr?T-q#%fvt{wXd z?myY>P)|@AE0Kv=ATo+iCn6RL^vK`}bQU4s9Eums?f!l0nVR)#xF^QBXR1ptt@GT1 zP!CBo(H0=ED39-tIg+vZR8$@a?dIC{gNek3<5*p6?d>6`ADza~gj4`m_Ehn_VRHAm z4PzS;k~ ^5(qjM4uN@agVGV)mMnSYpV$|N_gB~!{bRVClfgay@E*WAx~;iY^dLo z%X~3x=~YRvf6v&R#9VBLek&&I?yITTPQn`1mXZJi!pw}3vx3TP__}^6u2AXx|8)mq@0Wp z(H1S8KGrvTzNouf!GmNiduL2*k?PkWE&lv%Q|7BcAq8BBvQGTXR*N-6`Fo}3rXtA^p~(z6Wtqanb*(SPqD zY0>^rDt*b9Pw((!?(UX|)l1_Cn?BrlD6O!6H1K%0AT5`uaY$0CCUcI;~Qcs(^5!+773*dY2VeAH`hr&njPaMrVHMy*Wsz-oQI$_~7s zop8EYA)ZMpRQv%c@bI~z8DS2ZjgHu^M{TooIhvg)w&qS#lHRQ@RXwlTCBt;ucH~QJxzSDVhp3OZ! zT|A_C_d;?reD=$c^<4h@quHn87B1FeTp z&l{?^TjJ81LKN>Tc7a~0pp|2muNHPfY-r*MLrU&JB~ zroKcV4P`Kfmx#Vv-)rswC<|-8$@2=it$d~82Ueg6u?1GXA^Agkcv!c>R|U&SyL)f!r=!%zV5hMF$ACg@GExSB^@}Is?&EU~ zJD=)8`*VkR*&>XZlvs5017Sa0Ri_WkGX4cmlFb$_w11_HRXY+LWq=$+1U#xOws{V^ z`$~;?ED#@cbiRYhzvw+W5<+NYXPI)kkG``*EVK%$rolF02u8fJ9ZoQ=>D~$XPa>3t zzJihqoi6-^plaoaA5)pnaE$B-n!3wi`S|h+z?Oj8fD2`v17Sy}`iLDN4xt^D$K1^S zrIcfC{&S`{A~OG5xLFV$9RL_zY6%2rz#2;m0$U;Ie!WX2uM=af9INM}elL@Vk91NWDRf`IU9|B?u`jr+dB!{f? zSy|(55eMU8pF}9h_@k%j0Z6Q%Wcc}uu?P!1#RJ~2sI0+F0Q5z~+o*K32;}M@;*y9; zEaT8>Af#kz=^t{{0{VE8Dd4|)=-t}Ag^r%$_RuzFfKmWm)O`>Gha(e2p|CK3wMK+k zw3BK(wyC3gJ2c{;Y!vH;(jFQqm2Izd+I3I%>se7xkO{rb5iJu?Xp|gC_48S;b2fb9)qRacer{eN`bM8{m!-#i(!q38NM3 zPFcM+QWJupS+lYxV6;tcAZfQr;=_c6!`x?P=}h8f{DT&h49MsM)1^M<$FL+ClBvlL zWnKhf9NjAF>%G3I{1)?7aOl9pn!>#7H)-l|Gl?`ekN;zO?6mtQ^X-vM?*A&67;K*K?YW!h3HT;LtnB)5R{5K{N-)g_%C0+jUi4d_m4(2i~sEKU~<`r%uM;W1G{79 zEiov97SQX_B;)L2Q|b~RkLhlDnN^A3iS%m(ftV#UH5(-TvA|Oukurs)E&hF>l}3Zc z0kv>#_&VJ3N)(TKNnNGdO&_-(XoN6$qkM_|>jki{`}U=~TP8Fgp!G+kpQwA2y7gLE zob<|$^oa3+F+MENn@M5$fhLW^Uq9$}7T|2rrW}aVv`lb>+cG~RB82`l>n{0o9#TxP%v_4>&N6%?lXz4dbwv>a&*^&>y#Tg zH6={BpSbHveZ?tQT>A43Z7sBIP(@5tjyZ;f(!576@%tONoNuy71=1YP<9| zj&{@wPBngA`nZLa#@pLxHe)HQ0|cjdYLINN=&_s|mZ`w%aGr*X{&`*jY0y=RqHn6D z!<@U8Lwj((d*>onSkXdgY1?#Gz~&UOTVs)O-U`Qv03ERDuqcEk!vbNPphej3MzxXT zLHv;@bwKMc5B(Gus|K7SAf1cS7UBzQf(nORIHPgTW2%E8wYtT^h0Z+0`1?hSv(vUh zzKl>+frbzsbl+h{L>_D`z+MOZeUr#JhNki_55C+V^>V*A;l}|Cp!!P64(4HnW4!Yq#{pb)%&AycQx}nOLKdv{y5Xh{?P^kj zK$?>@Cmo6)vxdK9|18(p+w||*gco0b^~+a}il<7auBMtEUg)B_AaZ$&Ri^ge=`Jgl zx_XrSQl^}o&zv7x)4bZhsI z|HjX0;R-@4@1AR2aiV0cu|S{7oRq$TjX|*TQ`L}Yd*BBmGSPtokJz7DeATe+2F4k5 zA}vT7NjyPlW~;KkwgV$?AvG2>ox`sq;!|t&+CWv^g5-;f1D}WWWOtrtjpvf|+GMv1 z1`Y*ROySXI47+<=Vt5^9tb;O=4|oM4j+zz$s11q)^YXG|3z)ZcDeF94#P^i!?RIsk zo3i*2Af<)i^5A2cus*PmaAp= z>Z0;+jI+8k^e`+P9gNEw7pxQa^gAp-HK9t;)@FZOw{5ijYIEEw_AWbYt~adl_K(O0 z@m!N!EF7MKTB1)MM&I;`cNl=2E?gnZ*xG%tM8;#OyN39f6Y$canygiL{#<@;zL|3T ziZ(xCFXR=_Eory;SMfZG@MXM3crQyEVnMmMypXGROu`_oCX|p}335y|B!}xFt(N+)d~0ilk7woH;v_@cwvHd(+II!bd)w{QACZm2hRu zPZ025HJCb+0>#gF?4};LWF)88B)<-j{Q2B9foogR6?~7GJwMGl_S`w!p=H7kqkp^| zWPIw}`TCVle2gG2xim)aXkQ;S*kW_N8>@ASheA78)SaFi%sZ5)OUv^=taauK>813* z5?t7eW~@lZD;w&5=l@aK5Su)RCE9UksMHP42`8mhWeOK)+k}idH!l-vTq%ltx-c*L zkMpH%)A3{Se~idqHMQ(+l0B4uh#fRL6(=kKgD9?Renxo0QAxi54bP{W$-1RUOJDyj zB1N^RZ~1ce=R}bjty(xsMH zM8P4tga{0rL_<@L(ZXXQfCj*D7`?`iVG};6-&|KyDY2$@OBcIv-0s$Qx7e@|x7)X8 z;*2>HNw!ll*4nl7X7MpoJD30y7LgKmA+NXc3|sUig#j4f%7B+j1nmyvSiwTbWwXDy zA`5QKXkKpTAb6up4klr+?_x3bRwR!JUyci$p$gS&F+@-4oK^JOL@TujEP(D>(oRqx z&F2Yy4HdVOg)f_DUZJ1}TPw7>`-92Ic9E)sKr z9tZ}Z5l<+Do+3apJyJFggNG8P1+0~{8+dgyLKnk^>w!ha%g9)Wa2AxtcqwBogtw;! zjv)1Aa3rjxhzGd}%Xck`62mooy5p+uQ7Dmvozz%{N!3^sa}|5P0kr zoO`?hqoMjpfEK~DCV?0e;^2+#Kp24Fxf6yvHaTPc(sBqeG()g9usFa-2lz_#-z@a% z=c9AbgMoJM_S7sNO>28Xu>pfa890&m$$iS*scan~Z7n%K_%^IzjF!;IQXwEnrg+MJ zgGxC;`&Y!qj`B(#&yfh(M$Aks5B`FHsr|uyk9`53TH|pZF38pg$SGW8h9;5)YJ)e` z4Zz{cnDXTlKD1DRNMS-#h;OpRM%6OHU|?fn_HfJtm6z42?$mc9&o_4rduuMB>}XbN z<8QNjuF|JV#lOH2tX<=GjpnZZ^5w)2!9cwh8ECx55us8y`6PUWX9a%5)|*1y;}foC zWzptAo~eaj86sNN)&)Zc^f7_TT`BGjpAH??c}%1*k*zhc#H#maAqz4PWuZ}T5t9j* ziRTEu(km)21AeQPzB9j7#@vhKRE5w$ktCn6ltg012g0KhKFw;;>RtvI+b6RXVtctu zbn@%KhPiiZM?UH-)6Pbp*(|pDwK>gwY+>oh*ztJU*>Te#FOgpE7vPCqzLOYd*rT2i zsM(&=XGNVXEvGHjr#2qk;%07V17nHbH#kDA(nY!2e%g+E_~4#H?n_FidX6K_^vrO_ z0!EVAUg8eR*STj!r=a|^1{4l0;rYWCBB3<{$sg6BWTPa}QE5lh^b5v8?(3ZKi8m9M z3Ih6;MVG}xvh;<-R`I4uuS~Ip@$t)J&FXuoanKde*%Og!1j5Bq;jQNIIcE#B|?$GeGeRs$6*byA&B~)&2FWhV^a@~y2VbNo8Oxg(xR7(7LQ^Q z@^nw@c*LGdsX?B}xt5=PtAXIo&t82^@?V7qo0r8bhB_1kUci7sFcghyC^v_x!lt?3 z>Sb4({z?`F26?r-@Dwc((9T|)^c*wa)7qSq<)g2^Z6tYi!*@x!3!o~K!atVKD(*2D zdHpWk@&VKODp7;T++F$a2@XJP(L$X z2|^I>A#7L^_gd&#eubj(S=QG2FdEjDFuyBI`8IfzR$(Hjov3W>MIzG0(#D%$BBX|` z_^FC7An3b3!2xqp0VvW`q9_C$#^312H$MK*j;w5BF|3r(_E)4qQobcn5~#VvF-^&| zy$8aolIyC2h)vka2%+7N2}ut4#j(#*5-P;dUAdKp9@eP z+V^?1T}Sc*QQyo8AnX{j_XsOHstHJC8MtPA8qTF5^$6Hf#Gefo4X9!4`t|BS6Qtw! zA=9}PMx^8#Dkn5O+Y!kLs~X-=EmP0Xmn#D&@wOu?iWbmDMPfwA%?TS)a;A|-E{$P7 zhd3M&8z1EWeKWecV&nmA6OuOtA3N50m``CeMrIp?;|8U80ajx%ymnN7@NUk@8Bh&= zta7sChHhh%-DGy+CEIw&4D>$iIXrXdhzdM#iAmIE%?rBiH=JQ^guqK(ecF6Lkfv((ViqG2qo>QbQ8vAO)P8B z8(^3OF`@$9Wma@}+pMP(`9chWLP_+Eg~}@!3%E-mXl-GeAlPGfl&n_)a=HO`#C5n) z%wvAwI!_!9lf3TqlReiT7~QP)|nO+ zr|a4Rt(%IkGdB<0p;p9FCw&i=8J4y=ZSL_u2*A)*<6T@8`h1c}LccKJjaSp>an{(n zE-+5W1EJ&eIS5YH;xmKPjV$w?aJ+F;$ssg9^@JQh+yGpKgjZ8a(wUOKfwz00upFdC zR8hb%vw9C_W{Vc#+ax{^NZ$pVfjCBhn~bZ3w~aUcxSe$&PqWcNCQB50$v+H=TL9Kc zMOweNET>R2f^FXh`;e6rdxo5M)>H8+NPJ_^Gi}x(hL>-K@mc|=_EgHMleqTY9QtV7 z!qUN4lY(Fikt15QoLqdIXBisg! zagc`F-*)b^ADPSvS7^c=?!zn;okxu&%aH~&^0ZY+e^;ZDEH{QSz^D1iImsWc+KV38 zMvF&iW3;JS`WlBd)CZi~f#-}UwJ~~njQFks*HZDjoEM@$?gR`O9ktCl0sZ%hr^Kz$ z2|g)Xz^rC32o1?^BQui8bGA@^j2;5n9Btf8 z(3kY7OVVmN>pJ$ArCOI#?WsdO!q#8z*QP8e^K_D&Aj%I`^h}oD}nXM zgAr@z682HPv3%CZ#O~;rBQ4=fm*~UjNViQh?18>7UX-`V2{^B>f7OoCd1ZgPm&t#N z7Dg)?lg}k90=PWe6zeM+LZo}F*1gDgJxqOtSEf#ibt(zEB{ z1*Ngcw6V0dSBS79ZJjMGj&0M?NzK_a;SSyX%cvB;hRz<_kM7ZD-?ODgO>doL0bYL< zFm)s=a9ac%iCq@$Yr8<2$;OF#@ScilFF-Re)zERXrjh_Eq5^tA862_&l(>86b-#zmF03G14NB{V=&!IVOGcdkOGV`9!>&-XFV4K}jQIEaD9{GP5t3EoE2WIpE^BP5 z_voW71j~RFS*BTnKZxM9PlW%~`InEfmDFn@6aNCv} z*g3*6sH!bs0YV4i>VDqeM1V)va|1X_aX$MitYJ=cdIM$$RETZKSoE3Wm7)2N9pm7S zZ0HC6wz=b$Ayv;L#62?rHmgWb@Y18;_&RznmwNJ25jGiDMT;oZY#+K?Hmd@F8-t^s}JOX4qFz;FhNRJV4jVQn>nFHmak-_<}s>?dy>;| zA|60OVloPUaLmBBQ%a%wAk@Mv0>7c0%uJKb#v=I>`hH$R+IjjZs?7S=+OhZ`hQ-);9GU3qnaAOCkCduGX4kVl3<&m#h#iY9RX@H`Lzeec+3>9= z3bv55p|A9e;#;ru{8jg)37xSyP2agK8)RrxD#gNYEvVh_*(GYNMAufi{-TCqeTPzq zNU1}CKuEQL1JoXfb&&aShksg8EePg)7qzVc{KDyy%;{bs(Ky7JR-Bs{S6)A*^G6?@ zDv!NIg5)(c##du^#yVGuyP?_G3eEbu@lY&TffUeD`)UUrc?sOPP{=HG0gwX^J5Luf z=W$PKU)7pQ!Ns8Wnh@ z?$CJn)qZ`X_V1(j?&6p%p$w>pp)l9l!r2qC)XvtH`aF27{RU;jp1L}t-x4EW%WyAK z7q}rhW=M_R{cPJbPXnDgr}l)Sv$=Cg{ZQ?bnEdGC+Ltk}pmf6p9*toljt1IIdP6_M z!AU<6L>Nkw5ryhN+oSAi#P>k>$s@c0@haqDD9D3mf@PbS|g~%=6K=L6Y6cg52rER7*8ab*36aZL*MSgV?MJJ#*a1;sfnZR!mmax)sjEi&z+SI zv6Itgy#8_@NfK*WGP>qWo&6GX&EENRXxIWyXuU=|``&c=P{g7AMYV_WI4-T-Q@r7r z$%rRw;yZkR(8Kioarij*(+01BvQIsOFs9fa^Aq|7CDlqRRWqF-GzX2|teGoUk$(u6 znkHSk$sGT2P&iWXf{{E`YcRFw^=N3erdhncws^#KWQ;jedes)^`J6h#sn7PKW_089 zSMo2p<6g5yUL69}5u`-%GD3(Ed0W6Fg|^gAOo+f$4FA}wjgVR9Id#LG6|&W&uJl7v zDHt-bT+3p@9cj>s^*HA^_cykQd!tsEkq11FN%A_zfaLB_ew(0KevW&qW;!in&{ z`*e+5S!;;g&26m5BjSbZg+MBbO$^j)E42OAgy7G@c3tt-tZZH3bK@K-s*!PQV<&yq z8l2-FAp_#z(8xevYc?y=)rG2extO9qu{^{F_+qz@IuV@i)c}Q?43n%~^)sevv0&*! zUe8Gn2Xb1^z-_OcHVdpYXOocXW7k`wX-&C(rp~Z_Z4WS^he3;N*A)iRtLJsNE3K54 zQuQ;kCeT)y&^ZpFqKX{dTp!T)lxpFq*vx}cY^r#vK+^-)lHnQ8=@g*EBU)qs#|od zTXNTt5J{HMvbU}^n3zRhEK@vYKr$6brmGOM>Q z{(4jv|LC|!@s692@-zwJXJuezK{p&v;B$Ul2y3Yu%PQJhY>+NrLcL=4|>9qs{SZ)we zyA6v|yp5WxjooWw6X=V|#gBl6wg*zE1~>nmzZ&xK;O1x^ z7FS1{htcE9n@la%piTZ9Co3_1?eWLL6&Rhi;QCpjtw+yCM#&uIYSvER6WP5ppuQ#0 zE5xBG*xNGP=&91EDQn#za}Ad#Hq8Ec)J5 zT99MwJ15aUDxMJ#GAod_igRp&NLUmE_gU@eHw~C?Khid>8T}}(%h+>ziI?n^2b{Lm zr&LnMcK5K9n@WA#)&0+HrR{+{swaqMcEWE*Ym)dIWa8jWPsx&+w;my9Lrg`AxJFXCW%{Y5E}}c7|$+DcHN7Ky?aLO_j1e zjM~7`b&E`?R}Xh*eEf8)LHwsPbDi*n+r9%o4aMhTyXNi%%rVgwAB4&Z(CRjp|KZH6 zT}QOSE(-P()xH#dZ-MUC!8@(xshBzbV3w=}B{Dx=3m*%YZTIT8lnw2}42soU+`PJ3 z=xx`x-9Cbw8a-ziKHF0^$_kh1mL(oeIMdkm^jY^AVb1Js#>``T@eQvJ_HDPk=5@Vo z7Scicu4-6($D78mWSB{)!kbCrNr^zw88rRzXjAu#vxU!D+s_Cp$~}e_a;&zv?KLbN ze$-0yxUySIu%aUKvP$85BJEGtN;N5};!nvZPR-htefn)sXek@x4q8fOZ<(cx8+UGO z#Kt)Mopo8~^C&yWWJg^t+f8O=$?|_Bi5}zCrd=h!uC9q2aGuJyS#sr2d~8b2QT>&I zra6ll?xz%wsa3}g9Z6y6)4T-IpA(x}4VZJ2(p-haa%={Q9oldJfyY5a=GgLFB$2Lt zrT=0$46RzEMHN|9@?tQu84H2P0v>8K=NRo?Q1<7S(MkY&OE|VI{AGT{Gj53 zTiX3CPN1BssBMRaznlL0$V^kv#jB4^MA-&``k8_1EtE=exy}3?lO8t=S55%^CvspX z{)f|LLwNwyGza)}nNdLx3MEj!@%RtRTWYZ{T1+M_a2y3JK`dcV1g;b zhD>51BaI#o*x@G69hf|Q7LSC#4RQ*sUWgoP?0u|}M1nj=nkSdmI$-LgVAjLl3f>9G zu7@DD%{X0Z3vp*dBK1Q4uF`Om`LiySa*}9f5(;x`dKY{s2sev1ZwcXx`*&QVzY#uz z%Qv_+M8pl1i(}Y&c5yxwhb%BKLCKCy&&Q52cE)MLhfPjydU*j{o z7EM?dK6nqJp5?uYdrF5o7>Ra)Z7!w*Yyxj6K0cmK`!kF%FcAG8!|>y=23A{@XdS;A z2o!kU%5_gY`r>}QTx=j$zrk>2^d7jS25?})8r(Wu3bqa8EC|op|1-$gTpp=(%m}1o zEcSUViOiD-l?#^u!dI*c-zqS=bSW3K31Prh=`4Yw9;Fa8YYbi~SAmJc5|s7EH{Dn+ zU5Fr@tA)FQtz&1rA_`Y5HPkxVIpGcgX+utg6GycJ_Mh>=Oy~_*IQ+bm1Um&QP%#XGKotZd0*V!o$fP(xWil45$e=~+t(PHG69fr} zpn!;ofL08HTI1Cg)V4y2gn3lZwzq1_7(l93NPOzo#2Fft|1*SSq@Q zMjaIZ^70>y%B5yyeUTHJ#&{`NS1L!(_B;nm6392ag38|-tE)UK44yMVCrY!p0ig&Ij zpF^1Hn0M;4UugeHF=^7sQe&k#^-Zzf|9Oj+l6I=P|BgMy@xA)EwO0vl0Q0-`;5XHE zdbgRt^8B$?MP+mQ;u`ztmKDf(vZu6wAKATZB)M-oVDJ}3`c%s7W!bYUvVT0~d!=iK zbsJ+dLen#AH>dqq)%NxM;el$=JN~;;)(^}el5d9PP6;;MfzdoBI&opJq_^5bU%I0O6+QSV==FWUZ+?d8vQNJG z&TUVcIq3Jt_wx{LVs}IMgK#x5C#_ff6DxIQPsK_<+-PX5=E+x1!TbAc?BSZ`f$fma zsCVcMcBBlYmQK$VePyCa+3LV-oSs%gBwj&Z+UVEN1J9I?6wFB`!2Z*8N~ir4zQ4Bf zDwh4Ck^+}-)t|>vSxgqW&5XtATeM{+1)g=QfXEWZ;%1z^rDI!h784ImJTs)Q2=o>q zEgCm@NHSd%OjY2_Zoo+ccSZ|)<4xSC{mfOt(l3paTh7|o+Ei64(qhn|;t0ryW*mP$9$zmT3p)2llr4Z^gp_b`*o1^ze;${OIg6+|iGvm_89{8KuU`Fk zlaUp83f}(%V>F2M_J;5hL(1p$s2ybUb1=Ji9PJ(2UZwHBaj`m9E7;Q$l_l{Z22IZb zJ}8(jv3(+3T%2IdwL8co`sIleTWm%%PyqE$ZBqtOTa!e&ggQQd!j&V6T1)82L~riX zhT{;I=Qh`gj5AOWlM}V{fu{%pQy4k?&)eZ8!IV(P)?zV0DiM+0Alzt@VMm=IUtd(4 zLt>VO@;s>~nK=(i`gDExq)Vy$*p3r~+=#O*=ou7l?6%3Of!u+y;_0Xg_ z^qj)8J;@DGlloQ(Un!SX8#iZV=oDR6DV}b_i}nfi#0R8+rp-`PylXPfq%+IY#!sxhbZ z{TLV_-*d~#!hs~iguzXhBz!27mgul>C>!}sxi%FPee@Y3m)1R)$dw@qq<#S`JEw>U zT&R?C;1zI7AhRI$F6M)Yd$1bq1sN|ZA0~2uB0$9iEFA#dYc2iI1=1%GGR&>wCtL?o{D6Mo>gJK=6LO)i@(G!+rnh z#TSg>6aF;aQ6UhQ%MI9PBf*tpP5jg+{DH|cabpHo&QFk>8y{P)1?nm&lL^A8YpTY- zoEmAmBJ6gKP`ouW@0+Ymd1q?*4MXS7;ov(C7EJmWVHVx2fqe~FBDk+1BDQ&)aLEYn zY7=YX%Vu~|Ijr3V?n_J4{)rzc;K`|;s;Qc+W!Q?%tFsrXzTZ@<&{RmO<;jE6Q=X4v zC)DsBGFzMenh`&$?-O13{1D$_<~iR(ExU9>(7DS%TvF*kK2?V1r7e{N%6~7F=EjTU zx5{4(L=~c8H=;gcInhkuVxbAgi@e4=dG^GIq9d7+D%9^AQfLk_%Vg91H>acr*uyiz z1My9<8TZp;&03l@S5SWjb!;_qR&R*+qoKh1?3Jy;GEET6Z+G#Sa~n(3HAZlt+>01%n!rFJROl);XOEKQti z>Klc)tD9i>vja)id%)gm+o|TjhlB$eHP-~ASnS6@Ib?UULdE!k>z$FUb@S<|bQ%sK zSV2NEPIpkH*kO>mUYK{qgix8FE&EsuKWTb3u<`%609rp*ff=he;a~-un&=kLzq(J| z2H+D_Yj108MkL*1e;J`?ys9*G5q*tkn7kGxut;o{K|xqdobd{%9M~)1E*I@Xw~l-` z+Bw)up37AUap>|Vdmc3QQP?WinqFJ(-DX8NeK0IxUBLDN0}&50$d`nDLD42L%Mjnz z?l{!Cpm>|+Ov*av^@402{2~zV4zV z*Kun_Q9&1s}mLuJVa*oYkxk=J4mpJ0w-66Z}~a4=|T zL`6Zj_&#W){h_e40#>wpnkabW5Zm@SM8}8|UsX&z^3cZb!4QcqGd!R<{=qY%0EKr0 z#5cK-1&}*ItB6_fKl`)P;2N5Iv#JpBMVJC6&O^4FL8sIH3obam7V0CgfJsAuTjMff z?H)F^uP6pb{_=u?%KceiaUY|_v7=w4AqJ5w2G7802NS9{>eQt8f}ci9rUp3Ms9r!z z$E%v#eQn5C@dv4F4p9&8Co;UD`B2X5(B2qZCU zmTq>-Lk&cLApu!&OCtIMn^c?8yUpqvnh(9NaJ|yujzIT%7UZ@U@FIO3^_$xDA&@R1 z(MPS_$T)de&)}NCy1&-MNxXgh>8?tjJikuxOtIp`=Q+7`eed)&x1hwpvA-s^6a#z zPAuq5aJw+O&&i=Ed=eNp$bA7c&*5h&X}=j9_bg9SJErmtNVZ#6Tdt(=|AjKS^~>k` zOrGx>8^&_Bg+*UGad&2FEn=TPEQ(}JA4!wUdbZt&K*#SsY^scPTeN%$&;sD)vo&Qi490u)z z_cRT+cXqJ|S>DFu$;^e3a|7|> z$W&>ysCRGq#Ff$AFIeq!oM#DNRi0Qt33d2qo-RDp2SB}A*Li1##3bFDOCOzM3LnIa z|F|Oi+aT?%C)`m_4k-?lkLL9a-)l6(0k86zt{FgyFuRC{x z-JRb$#rn6jK>pKEM}bPYhQ1dH2ySB}rP2j|<*FB67OWc0V5}g`HJJ+#Q};i-4E0!I z4WSX?)-VWlmAan#wn9+9ru6*fLLIf@letsBCX9-Akaf{jW#3gmf^*-3b;%LwhpU#= zR4%vZ#OUF#L8x)4>*J&Ixraqu920RHF>Xi^fQoWNs@Bz&)W6T_nDp-Rve^AB!C7?Y zbNZ_-*SEkC8H|D8RlylHQiKjWg+vn{0=!Oic`hq(3MoyREle%X%YGrt>mq<`Q=s}l zk;(ls9J!>RIjh-MoR|Fv96_7RT&>OGfA_R`DUUHc!!Bl+hR7L>wv_N6Y6#)Cz6X>y zY%#2f?HJZHtgo1+*4{BNaLdfiy}Sr@PP0xq%+O7&*Ar59Rdafwe;ctTUN5>}2Fp=B zBwN6H4GuC0As7qpv)zQoZ?W=HHBiU|uG7oK+gu1_1l>(>q>&~>vW zEGJDzO!~>Nh0F8B=gKKbACpmDcUy(>Jv(Tl!PYRd*zCKa;W!_`3|F*>))29-Xte)9 zr8$bl2(E?!4E2B>;SBod*@nIOYbY8G;YEPoi#86)atnk@&ZJ+;8B~R10eVtypRfS{3}=m zw+>D_^s=N#5T6?|nVl~HR;JL(REL0zWCB6pk7_0SHdSxye!x7O20aEp=2u4w8v{fas=(P7ULcq zuLx)5rn1Q)6bqWWW`57{igjyh;Ti-69@>QM4F}f7oi8wbu2Rw{9u5%*Y= z%JU|>QZOPY)X{~}skgy4OvBTH8I1H|I%N09ZOz;i2yg&Z5@-XupIv~(h%6Sv;@#Fw zVpTw5eD?S$t)1)Ec;>PhCfk3SU`QW?#CaB;I*FkS>HvD`JPn@`e=D2lF=q zlM8urqI>c@F`!zC(N5p!P)Y8#o&*4t(JyH)Q@v*#FCK5Y5s}hPRxyzuUOSUj3`dRG z*p#V~Yo=YCuho8i|H3e*Nwa`c#>iVpX>`Y*J{i^}fpVgCoYPYXzM!+-tn`;zI{J$M-uqk1?d|c*FlK&StJ8GY>Lj?+^UE_fOU9dFuLB zYefbZ{LWlFC$wGU>TGRMp~d-HPXv8+;P&;R?VFySod2&+C>eG-`M%N>Cl+4&@yCHU zW_|rV=jqxlUF_&es%3&TkHS809mAJXK1d(M0< zwLt0Hrk9vAq5+DtFM>XOWH-PiAD)O%#5KrY|3;e`&bn)sPYcy2hKD^~@7yUaiI|pK>;I>f(*S+KDlatM*oE6l%Kl6o~&{)wXtxCvdr} zJr2|s@8)$NqE@=U;1`-!q}1$5Ou2vol_^!BVn5LC66qUe)%k z15ZMY{2=n|n0AzJ@|dxne7}s^aFpE<8YvA(8z_)Pu-;53q^g=&>^_8j7zG}RxRYyXR;_|v_X!P0_-FQ)4iX9FVY z*_Q(!yt7FYPA-!_vy?@r9U5LROz~>4@xrWk-_X*U&-=Kc#O^UBXB&DG!irY%jPCEM z+#l3Lm_~q~;|PL9!I`b7#bz^+gr}eocpTzJ3HG$the~M1`$T%I6NHw-AF@< ziBb~>Gcziji$Lw&ONiZ!dmkxps0Ly7!(Qq7LmX>1!LlZa|9L?HgGz@3}yd+COEjQ@ZKWnNw?LX5BCND>&_Ig}v!hZl?UY33`16t9lb9$3u!5c# zP6xLR+&$7nxU8V2u;C}~JAM~5Ln@Lp?G0e;0AfOVEq*L!g-@v~$$g0mMmBpor!fc( ztk6RBx=!?=h5B$kYC9AD=lJ5`lMARS6oW4hKGT3O%x_1V9vK43N)aN^+dlA4CE_nl zqmH$Q(Ce<&>jB7#`^)kiFBUbd6fzu_1qPa76Ux<%66)FIk&dp7)*MCJZ$@ zhi_z9Ds*HWAc6_U15>r)j|+-;o0$Dc3mJR7>qI81+0o4CTC9vv*kA&=Gt|5hty`5?U^rVcz<5JglhM^G!NDZL9nSsa{rk38eN&&C0B z;Zvaw1!Q$s)4Sk=+?JiIJl`?bOKQ-iFQu2EbG%t=dQ;+*Id(8(#M>4E6?>-z6jdBx zs9JlW6<7&%XX;}kD7(c`!A&u|157ZV9_l43qbgCLdT}6QFMQGT4_KTW^J&{yHj`%o z3k^F>egb-aI7%b zyKS*?COEP&$ecUSj}s#GV&bk~xQPLteh5x1KnwKadERZwoc@7<;5)4k6BcVBISmsc zPz!>3E8BTsRj5xdPhQH%A?F*hTLu?kj)P_P^Vy<0ck;DFa-(!T^KFB#3(7QE9O$2rwQX%<#H!6Z%R38Jkkh;gSAEi-Vh3Jo zibK_8{BA6w=O7o{5l;Wb)6G0;yQ^EBB%gVI20Q%QC24m3PS{}se1cTNUV#PzI zC=al^ab@n*o0P3_Zn+9OfqrsILwlo6$;ACZcxzylfdXVWgvg(^ws|Wox*pC8Zu0Rx zk()RwY^=nD69bGp+wV&M?L)9OfN>}VBr^PscVz=*>>jen$lxvvdX8wQeZbP_Q>4iK|m7wi>e*tt-w9L>ha5l&x^Or=cRCR{ox zB|dGnU6uP!f85T6nRhs~+cc1d1Lo1&7bJ?KGx2CRRY3IoP_HN95-X?z_t%o*qro{^ zm=^6U;~#U+`Px+Ocjb24j5k3Bf_cUg>J*O((tOcOKnLGL_AL%rhXz58e+Wg)zLMyo zBhUI>A%r^;=_DypVrb;XUyAI*WtQanVb>}O1kI6bVhG`6U57W)5ny{DSV`!pp|=E? zTd>+W9K2^(Lu@3x=Qzxl=dmw)NcZ&*J!qcO-+<_l_VwWbJ}|`C`s!Nq0^48My~}!L zj?3Mpzu&5v@djC;|9Ug(`1&9(*baX6rE2l4Bt86#n_(x%tk2J!wEwL+IdG z<(P1wJT*UZ`gtr*MCIx5bZ8p-gNA3E(!HA019*oE{XtbzpUk)q6PEk%XYmxx@SDn| zx7bB|QCszNe(2C}>bqUM+LWwWTV}s;|E7`8jDnxAh%n50X#FADFYaS@oFjdR1rnxmR#q;!P8M!6pYNinhfjCaK#ysk6N5`%TQ9s%hgdzphT0d9B^R=y=f7I_J>S z6$AbbjxZuVU+l7=HarBZ!mA_eT2iue)tX|yhkB_lTvoaqL&c)7jeZ}yxsPyF6Ed2Vvwv+?hZTk5OX219f8@=sask{-jmVC=wd zqBU>cw5a8Bqj84fMSNPJLguL0*YN&Q-?YQImITsCdjQ;kS5~P%ILwVj(;C$t?4qd= zGubIc`_$M|{nW**1+{7%Rjny)ebC&`EV*3~R1w5;{KN_ccp`%@b&zdie_)SHc!*2~ zkG(s>8QL_ygyEWZ$=mmoTHR$^$?}E|*CVen1NEnZAUinEi*?iF+~)nC!#?FUNgwVQ4d*4yTk_g3Q={U$Ar>CDcK<1G2R$h1HQtho8~f%8N}d_k){DTZN$Nd}^mK3Lstq z9RjZB`~G;Gk@Q3@3`h~0YApG2#xi%1umNwAWP0LPUq<#PF_|4#bJ5wwp?}6+O{r2m zbnafvczeFL3F(lqmu^^v*JfKOIH8OvAc#nA_YN4B1>f}5xJK%INab?xyXty7`^$PB zMv>NZ-8XQ}g8TKotOMMO z$TcUI*xQ$JAZRTUwru9i+Ypssszn$9mQHXlAf*{9*)JR@RuouOLx;5g+~q>}qfsz6 zzyltMHTcWd_6G%5f$HzvVuO&PYd%(9 zNSXlD8%|fJ2H^=qD`jT9l=^m_5oHeq!Wgegw2npD4#6Wpl8z*-Ja2IW%ADC~)0Qj? zI_=wK^pYaj`jB@ewIdHGJt`Sm8zRyT!g>x?aS6`Y+mG&V*#;jHX-#e<08l8*=oU73 za?hK=oiMBWk)~fOI02Zy$XIHz8`Vv)2`t0yW%e!goln#G@_V*yQT5z1PU`!VX64RYjQwb4yC|6;i~Zzqu+C4QobyLtur+D@~Ko7>(PZZ&5h<|ID*n` z8|N9G3Ch#yyj~kT$TV67q0V1q>8{59XSMLEVph?j5Y4c^z0XNKG5y>&d8X?YZ* z6z5!vm{aHv=n-qq?90#+tW8)_J*n%FtSGw?`C&(z!q@{`-er-)NsTu$+`R;MJ9US@ zZtO$h%0mR&efHUET1qA`q;KyRgt``9$<+Eay#s4hVpeNJb#Z8c0}AdjA-DKQQ&!>2 zC~aHnvnXrhu#3Y1tnst95E{L_7b-e8IegeH5705)3YSMHN&YnDV%d zRSb3J!1QbR*u6e}(@d&#wXA1o+AXb*dAx+Ij3P!hp-Bt)W+c_HL8cHJDDGR1{x%Vs z+-CfvxQ#g_kq?Pxh0~E3?#fT3dI2hJ#vt6Y_*PlxUl3e+&KAW_cd%dENprX(2iu!E#O!NvRp3K9Y80{a5c9;02F(A*`U1JrD7z9 zi6LSQh~JuZ|7cXdI}w;V+9PY^!9?Md+$Qa>Tf#lV`mU^?N>P-g__P+n#?hMMF7zYW zapaK!Tyx$aWI0kP7ZKkRtolyQ_a(S+^%m0SpWZ?@0osTOfz0qqfi_pxjRhpgC;-kP zN_f?RQMj0c+*n#_YOs~+@vwFW`r5VJnomk~wjSaxbb`&NU^%H<;H#KWFNeR{GTuUn zQy8S8uoQ0X!XZN7nvRdk>ME7Zt7q06OPCCCLg(4siKA~Y6nk$>3V6u#{16~bp1evD zwHAX322`d>!io)!dz%{ce_VjJM;J)_$RGp24BiAV2=TR%hN026mzpHr!*@IPFVPd* zjjkiK1-wv)b}clkXhOM-zjn5g)2~zqR9YZyYk&f2+fxoZi95YORFrcrWqkB@K8$Y& z|NPlL{VgE=03(ATJW1!FTKZm3sxw89PkKJwV_fwEssvuZ$GWc$_-cW{%OCak8%74C$&4 zT4F9q0*H>v+JO=_gOS3wEuUm8s1lE9H||A*X>URHq813rWfMD^6V2iOMW?1tOOI2p zjNqrPZL;zwMc#5-45pF_e*j%g56|%euUDyR7HdIjgDnst6%rklw+3tId!=llBDBv%yq=dQUIbHQ4Nt7gtrz90|#0N zUM{e{*A6<=l>ke#AP~_oI$8=MTTce}H7E5V7E`JWQ|rnSoWzgNjnL*pEJiw__4{p8 zn%8blg^>>{sF2JzsCoB7Mw$SI#%=HbXO3iM<1OoGj%|wVA6TZh*!J@6o@j!Lp$l6} zcTM~)A*Tq-7hA!0PH>%rPq$K7P;AWAl0FAa@S|2D^47*JMx$~(Nz0RV_o z>N(NQo|qT<#rMVqrc{W0@#4{B5dI_@q*AzCA7MPn%*7HC$se7{2WiJ(C}KV6JbMx! zS9%p~A!rZ;4FKU1zPjjC7FLp_oAOc-q61m&SXy_JTbLMdMCTYLYe_Z=Clnt%1@XsU zx-sKZjYTI@tl{&qp9wFbKdx6@69fbm#>{Z0AD8erjn0#G9QRm!E+!~@_H9* zCyT<;F>hSvl$E`pJ4LY0tBv5xAtkljBCPtrUy7gS`OZkjWRELeILD%ACrDv zJ|Zo8T3hZuiDMMHEY&xaCCOG?@x| zKCNMqiTgabdtOhj54@X!pAjQ%!KJ__fU*h9=|kyicr}v2*c7h&Bbugj7o~v2eUv_vLKq z-)(}!g2-I*fd3eTpqwGXw85}g2b#p~c=XUcoON@Z8Qc6RcR1upu8xD_e}dL>&S0bO z&o#kL2QA65g+oYmtmt1-I#1d9CIq2B#Jy7`js{^ACx+R0`*qb4+m=%#TC1Q+>1ndQ zOq~$Y@PZ)HRPN*f`GC4LiOmbu12)GtbvMB&3V~dCg*8;>IfTiZNpdF8=`R_HdZuq;0C6LpO4Bnc|LwA z$6oW}PPv4v1IUFTqK=1zT%H3aspw0rS;&5;1%PjzKXlG;&3Q3WaRMd@gi(Nt`w;CU z9Xk}qjeSKeBLOkSCQrCd96c8eDsuzU!p~0-qa9@|IG{QN8sIofd;-KIj+t@M)C(J= z7b?XYZ-$LBoWd`dWel{LI%rTj5)+iiHwGQCHMPMPV*wDPDsdVNys#oM=6~qDNB^wk z(3l|Gn{ibjs>p|mlVYaXC1^hHvqPBz36`jCEk6g zS5`@w;Vba2OHW)1cMOOs0iKh>~Hxis?E0^mj2 zm%s3$Pbxc=01c>jO7naWV+RXPcokgR|MA*@X5F0!qdQDwnA^zJ4HPg`sfI()E0b9fM#f)U!tpUTfAY##j{bB@Kgrpk{EiJZ;&y_7)DXNLl=6CsLXsi`OUaNkZMaI z?oYU+nkcf84a)B^rYw#4hEauhc#d8LBQ{6{2A-uhdjIoqC#@l#6{KXNBcj4n-wA~* zL?sh9?f^`xlc-ex(_2gkmBxYitWnsG_y$WGD7>L}vLZc&nO!GxY_YV!XDITf;t?(t zm??{zw`gqNu&K}nu-mBTqtfL3Q%^k~Jq?V~SEXVCD;l}$K<(qeQ+KH$cB}Riqba=4 zQsqhIBl!gjQdDDq7i_Vp6+Xi`u*0=qr9{pdT8cX0FBmde`X!_n84C&y*Dj-0d@ zYMB`vi5?osFV%0D%6}@Ml&597L}WfaS(;Irt~IRU%7UMNON^;jZvDxa`PwW4mM+Us zaw%4LO7S*wqCinxKK^L*2+@Wr*%}1-UIqpdSY{!RTMD2$a!hvWs*$AfaT~!YJT+t@s7dcFJpR> zbAB87b^d9c-0q|mKlR__K89)fDkGd|8qTdd7+3GoOiSu1c1{n{!iy2Ol ze%ff85h}^{vGFoGrrC$^JWr{uq&ZT4FZIJnVQiD}grV$P%Q@rWUHrun$JCa7@k9lD zRG?6QCv?@)md6tS@f834ZuwQqS>06WF3-l4Bw=kuOUCc(x+i~a#@I2?Cb(Ww+8fJz z{{rkiS^Lz)jKYx5=~J;(({K2sA=>T2y;|!sy*{MU!Y)Fsp`j;G-dZp%ed^H_FCSr_ zENJk55os0vQ>S8xFB=|(}d!+!OACd6UPCpgKKsWg}KXH4N%fTkaT z-FV=z#4pTs$9JA2($WUZM<@IyP(1*fQK{r*d}Q8=gHdbTigS&jF)@K&5&mqJ|JsbY zs@&t_i~|YkSk$>5vgz_MaQJ9-Hm@b-v_H|kdt-DY2A{a=p^%wwoMd#u5fv5`z}J;3 zf29`XBPI8v>l%E~qQ?SY((}B-5W0LHV4P3toN$qe9{`-I$={_qo4Aj0V80k4>mFSG z*P~F!&}pU)Jvn|8Vxh3{c~vTKMrzn4)AdTzH)pj1+i9U!+jFqt^ccxgB2xnc0|-I5 zSm0mx0_MM_5{k!`7Bw4~YEpGpC$wYL^2yM(aF75{1yMfZ$WrBB$-Tb%I%J9j-Ih2q z|4tTd-vp7|o$r~JvznioxM`EPIWYJL3Tx808(k~o21sCN4(-W$tY>xs

+
+ + + +
+

ms;rdW31h=Ahm94+BA4LA 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