From 31c1d17369b10dd984325e9f34cea4443f79f727 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Mion?= Date: Mon, 11 May 2026 13:47:48 +0100 Subject: [PATCH 1/2] Disambiguate composer attachment remove buttons for TalkBack The (x) remove button on each queued attachment in the Compose composer announced as "Remove attachment" for every item, so TalkBack users could not distinguish between multiple remove buttons. Replace the single contentDescription with per-type, name-aware labels: - Photos / videos: "Remove photo IMG_0023" / "Remove video clip.mp4" (fallback "Remove photo" / "Remove video" when the attachment has no title or name) - Other files: "Remove file report.pdf" (fallback "Remove file") - Voice recordings: "Remove voice message" Adds matching translations for the 7 supported locales. The previously generic stream_compose_remove_attachment resource has no remaining callers and is dropped from all locales, mirroring the cleanup done in PR #6404 for stream_compose_attachments. --- ...MessageComposerAttachmentAudioRecordItem.kt | 2 +- .../MessageComposerAttachmentFileItem.kt | 12 +++++++++++- .../MessageComposerAttachmentMediaItem.kt | 18 +++++++++++++++++- .../src/main/res/values-es/strings.xml | 8 +++++++- .../src/main/res/values-fr/strings.xml | 8 +++++++- .../src/main/res/values-hi/strings.xml | 8 +++++++- .../src/main/res/values-in/strings.xml | 8 +++++++- .../src/main/res/values-it/strings.xml | 8 +++++++- .../src/main/res/values-ja/strings.xml | 8 +++++++- .../src/main/res/values-ko/strings.xml | 8 +++++++- .../src/main/res/values/strings.xml | 8 +++++++- 11 files changed, 85 insertions(+), 11 deletions(-) diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/composer/internal/attachments/MessageComposerAttachmentAudioRecordItem.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/composer/internal/attachments/MessageComposerAttachmentAudioRecordItem.kt index 969fc3c77b0..d7de3a92a5c 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/composer/internal/attachments/MessageComposerAttachmentAudioRecordItem.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/composer/internal/attachments/MessageComposerAttachmentAudioRecordItem.kt @@ -87,7 +87,7 @@ internal fun MessageComposerAttachmentAudioRecordItem( .align(Alignment.TopEnd) .testTag("Stream_MessageComposerAttachmentCancelIcon"), onClick = { onAttachmentRemoved(attachment) }, - contentDescription = stringResource(R.string.stream_compose_remove_attachment), + contentDescription = stringResource(R.string.stream_compose_remove_attachment_voice_message), ) } } diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/composer/internal/attachments/MessageComposerAttachmentFileItem.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/composer/internal/attachments/MessageComposerAttachmentFileItem.kt index 183f9fa109b..a8b8d3846be 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/composer/internal/attachments/MessageComposerAttachmentFileItem.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/composer/internal/attachments/MessageComposerAttachmentFileItem.kt @@ -108,11 +108,21 @@ internal fun MessageComposerAttachmentFileItem( .align(Alignment.TopEnd) .testTag("Stream_MessageComposerAttachmentCancelIcon"), onClick = { onAttachmentRemoved(attachment) }, - contentDescription = stringResource(R.string.stream_compose_remove_attachment), + contentDescription = fileAttachmentRemoveDescription(attachment), ) } } +@Composable +private fun fileAttachmentRemoveDescription(attachment: Attachment): String { + val displayName = attachment.title ?: attachment.name + return if (displayName.isNullOrBlank()) { + stringResource(R.string.stream_compose_remove_attachment_file) + } else { + stringResource(R.string.stream_compose_remove_attachment_file_named, displayName) + } +} + private val FileItemShape = RoundedCornerShape(StreamTokens.radiusLg) @Preview diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/composer/internal/attachments/MessageComposerAttachmentMediaItem.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/composer/internal/attachments/MessageComposerAttachmentMediaItem.kt index 01db35f5b06..16c8dfb6927 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/composer/internal/attachments/MessageComposerAttachmentMediaItem.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/composer/internal/attachments/MessageComposerAttachmentMediaItem.kt @@ -88,11 +88,27 @@ internal fun MessageComposerAttachmentMediaItem( .align(Alignment.TopEnd) .testTag("Stream_MessageComposerAttachmentCancelIcon"), onClick = { onAttachmentRemoved(attachment) }, - contentDescription = stringResource(R.string.stream_compose_remove_attachment), + contentDescription = mediaAttachmentRemoveDescription(attachment), ) } } +@Composable +private fun mediaAttachmentRemoveDescription(attachment: Attachment): String { + val displayName = attachment.title ?: attachment.name + val isVideo = attachment.type == AttachmentType.VIDEO + return when { + isVideo && !displayName.isNullOrBlank() -> + stringResource(R.string.stream_compose_remove_attachment_video_named, displayName) + isVideo -> + stringResource(R.string.stream_compose_remove_attachment_video) + !displayName.isNullOrBlank() -> + stringResource(R.string.stream_compose_remove_attachment_photo_named, displayName) + else -> + stringResource(R.string.stream_compose_remove_attachment_photo) + } +} + private val MediaItemImageShape = RoundedCornerShape(StreamTokens.radiusLg) @Preview diff --git a/stream-chat-android-compose/src/main/res/values-es/strings.xml b/stream-chat-android-compose/src/main/res/values-es/strings.xml index 85b4c11db75..202dcf8b5e5 100644 --- a/stream-chat-android-compose/src/main/res/values-es/strings.xml +++ b/stream-chat-android-compose/src/main/res/values-es/strings.xml @@ -205,7 +205,13 @@ "Tú" "Archivos recientes" "+%1$d" - "Eliminar archivo adjunto" + "Eliminar foto" + "Eliminar foto %1$s" + "Eliminar vídeo" + "Eliminar vídeo %1$s" + "Eliminar archivo" + "Eliminar archivo %1$s" + "Eliminar mensaje de voz" "Respondió en un hilo" "Responder" "Reenviar" diff --git a/stream-chat-android-compose/src/main/res/values-fr/strings.xml b/stream-chat-android-compose/src/main/res/values-fr/strings.xml index e10943cb0c6..76a4240e600 100644 --- a/stream-chat-android-compose/src/main/res/values-fr/strings.xml +++ b/stream-chat-android-compose/src/main/res/values-fr/strings.xml @@ -205,7 +205,13 @@ "Vous" "Fichiers récents" "+%1$d" - "Supprimer la pièce jointe" + "Supprimer la photo" + "Supprimer la photo %1$s" + "Supprimer la vidéo" + "Supprimer la vidéo %1$s" + "Supprimer le fichier" + "Supprimer le fichier %1$s" + "Supprimer le message vocal" "A répondu dans un fil" "Répondre" "Renvoyer" diff --git a/stream-chat-android-compose/src/main/res/values-hi/strings.xml b/stream-chat-android-compose/src/main/res/values-hi/strings.xml index 63e314f7d3b..2c511cd628b 100644 --- a/stream-chat-android-compose/src/main/res/values-hi/strings.xml +++ b/stream-chat-android-compose/src/main/res/values-hi/strings.xml @@ -261,7 +261,13 @@ "आप" "हाल ही की फाइलें" "+%1$d" - "अटैचमेंट हटाएँ" + "फ़ोटो हटाएँ" + "फ़ोटो %1$s हटाएँ" + "वीडियो हटाएँ" + "वीडियो %1$s हटाएँ" + "फ़ाइल हटाएँ" + "फ़ाइल %1$s हटाएँ" + "वॉइस मैसेज हटाएँ" "एक थ्रेड को जवाब दिया" "जवाब दें" "पुनः भेजें" diff --git a/stream-chat-android-compose/src/main/res/values-in/strings.xml b/stream-chat-android-compose/src/main/res/values-in/strings.xml index 98b9626b7c4..d465a0a68d6 100644 --- a/stream-chat-android-compose/src/main/res/values-in/strings.xml +++ b/stream-chat-android-compose/src/main/res/values-in/strings.xml @@ -205,7 +205,13 @@ "Anda" "File Terbaru" "+%1$d" - "Hapus lampiran" + "Hapus foto" + "Hapus foto %1$s" + "Hapus video" + "Hapus video %1$s" + "Hapus file" + "Hapus file %1$s" + "Hapus pesan suara" "Membalas di utas" "Balas" "Kirim ulang" diff --git a/stream-chat-android-compose/src/main/res/values-it/strings.xml b/stream-chat-android-compose/src/main/res/values-it/strings.xml index 545544454a7..f69c0f98282 100644 --- a/stream-chat-android-compose/src/main/res/values-it/strings.xml +++ b/stream-chat-android-compose/src/main/res/values-it/strings.xml @@ -261,7 +261,13 @@ "Tu" "File recenti" "+%1$d" - "Rimuovi allegato" + "Rimuovi foto" + "Rimuovi foto %1$s" + "Rimuovi video" + "Rimuovi video %1$s" + "Rimuovi file" + "Rimuovi file %1$s" + "Rimuovi messaggio vocale" "Ha risposto in un thread" "Rispondi" "Reinvia" diff --git a/stream-chat-android-compose/src/main/res/values-ja/strings.xml b/stream-chat-android-compose/src/main/res/values-ja/strings.xml index 00175bcbf5b..d478f091e40 100644 --- a/stream-chat-android-compose/src/main/res/values-ja/strings.xml +++ b/stream-chat-android-compose/src/main/res/values-ja/strings.xml @@ -237,7 +237,13 @@ "あなた" "最近のファイル" "+%1$d" - "添付ファイルを削除" + "写真を削除" + "写真 %1$s を削除" + "動画を削除" + "動画 %1$s を削除" + "ファイルを削除" + "ファイル %1$s を削除" + "音声メッセージを削除" "スレッドに返信しました" "返信" "再送信" diff --git a/stream-chat-android-compose/src/main/res/values-ko/strings.xml b/stream-chat-android-compose/src/main/res/values-ko/strings.xml index 7f77b3707cd..b5b4caa2a14 100644 --- a/stream-chat-android-compose/src/main/res/values-ko/strings.xml +++ b/stream-chat-android-compose/src/main/res/values-ko/strings.xml @@ -237,7 +237,13 @@ "나" "최근 파일" "+%1$d" - "첨부파일 삭제" + "사진 삭제" + "사진 %1$s 삭제" + "동영상 삭제" + "동영상 %1$s 삭제" + "파일 삭제" + "파일 %1$s 삭제" + "음성 메시지 삭제" "스레드에 답장했습니다" "답장" "재전송" diff --git a/stream-chat-android-compose/src/main/res/values/strings.xml b/stream-chat-android-compose/src/main/res/values/strings.xml index f97baf9013b..4faa3c59bf2 100644 --- a/stream-chat-android-compose/src/main/res/values/strings.xml +++ b/stream-chat-android-compose/src/main/res/values/strings.xml @@ -252,7 +252,13 @@ %d unread +%1$d - Remove attachment + Remove photo + Remove photo %1$s + Remove video + Remove video %1$s + Remove file + Remove file %1$s + Remove voice message GIPHY Pinned Pinned by %1$s From 28a56404f045fd8fe0ebbb7fef34b4f90a37a70d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Mion?= Date: Mon, 11 May 2026 14:44:59 +0100 Subject: [PATCH 2/2] Cover unnamed-fallback branches of attachment remove descriptions Add three Paparazzi snapshot tests rendering each composer attachment item (image, video, file) with a copy of the existing preview data that clears the title and name, exercising the previously uncovered fallback arms of fileAttachmentRemoveDescription and mediaAttachmentRemoveDescription. Extract a shared MessageComposerAttachmentItem helper to dedupe the preview-handler wiring across the four media-item previews. --- .../api/stream-chat-android-compose.api | 5 +- .../MessageComposerAttachmentFileItem.kt | 15 ++++++ .../MessageComposerAttachmentMediaItem.kt | 47 +++++++++++++++--- .../MessageComposerAttachmentsTest.kt | 21 ++++++++ ..._attachment_item_without_title_or_name.png | Bin 0 -> 15101 bytes ..._attachment_item_without_title_or_name.png | Bin 0 -> 3795 bytes ..._attachment_item_without_title_or_name.png | Bin 0 -> 5489 bytes 7 files changed, 78 insertions(+), 10 deletions(-) create mode 100644 stream-chat-android-compose/src/test/snapshots/images/io.getstream.chat.android.compose.ui.messages.composer.internal.attachments_MessageComposerAttachmentsTest_file_attachment_item_without_title_or_name.png create mode 100644 stream-chat-android-compose/src/test/snapshots/images/io.getstream.chat.android.compose.ui.messages.composer.internal.attachments_MessageComposerAttachmentsTest_image_attachment_item_without_title_or_name.png create mode 100644 stream-chat-android-compose/src/test/snapshots/images/io.getstream.chat.android.compose.ui.messages.composer.internal.attachments_MessageComposerAttachmentsTest_video_attachment_item_without_title_or_name.png diff --git a/stream-chat-android-compose/api/stream-chat-android-compose.api b/stream-chat-android-compose/api/stream-chat-android-compose.api index 5fa3cf32382..439d63760c3 100644 --- a/stream-chat-android-compose/api/stream-chat-android-compose.api +++ b/stream-chat-android-compose/api/stream-chat-android-compose.api @@ -2060,6 +2060,7 @@ public final class io/getstream/chat/android/compose/ui/messages/composer/intern public final class io/getstream/chat/android/compose/ui/messages/composer/internal/attachments/ComposableSingletons$MessageComposerAttachmentFileItemKt { public static final field INSTANCE Lio/getstream/chat/android/compose/ui/messages/composer/internal/attachments/ComposableSingletons$MessageComposerAttachmentFileItemKt; public fun ()V + public final fun getLambda$-1126442206$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; public final fun getLambda$1955682816$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; } @@ -2067,9 +2068,9 @@ public final class io/getstream/chat/android/compose/ui/messages/composer/intern public static final field INSTANCE Lio/getstream/chat/android/compose/ui/messages/composer/internal/attachments/ComposableSingletons$MessageComposerAttachmentMediaItemKt; public fun ()V public final fun getLambda$-932284221$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; - public final fun getLambda$116152749$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; - public final fun getLambda$1523175629$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; + public final fun getLambda$369677867$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; public final fun getLambda$384447459$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; + public final fun getLambda$485971275$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; } public final class io/getstream/chat/android/compose/ui/messages/composer/internal/attachments/ComposableSingletons$MessageComposerAttachmentsKt { diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/composer/internal/attachments/MessageComposerAttachmentFileItem.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/composer/internal/attachments/MessageComposerAttachmentFileItem.kt index a8b8d3846be..a91ae909551 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/composer/internal/attachments/MessageComposerAttachmentFileItem.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/composer/internal/attachments/MessageComposerAttachmentFileItem.kt @@ -139,3 +139,18 @@ internal fun MessageComposerAttachmentFileItem() { attachment = PreviewAttachmentData.attachmentFile1, ) } + +@Preview +@Composable +private fun MessageComposerAttachmentFileItemUnnamedPreview() { + ChatTheme { + MessageComposerAttachmentFileItemUnnamed() + } +} + +@Composable +internal fun MessageComposerAttachmentFileItemUnnamed() { + MessageComposerAttachmentFileItem( + attachment = PreviewAttachmentData.attachmentFile1.copy(name = null), + ) +} diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/composer/internal/attachments/MessageComposerAttachmentMediaItem.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/composer/internal/attachments/MessageComposerAttachmentMediaItem.kt index 16c8dfb6927..c57ea6c2709 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/composer/internal/attachments/MessageComposerAttachmentMediaItem.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/composer/internal/attachments/MessageComposerAttachmentMediaItem.kt @@ -100,10 +100,13 @@ private fun mediaAttachmentRemoveDescription(attachment: Attachment): String { return when { isVideo && !displayName.isNullOrBlank() -> stringResource(R.string.stream_compose_remove_attachment_video_named, displayName) + isVideo -> stringResource(R.string.stream_compose_remove_attachment_video) + !displayName.isNullOrBlank() -> stringResource(R.string.stream_compose_remove_attachment_photo_named, displayName) + else -> stringResource(R.string.stream_compose_remove_attachment_photo) } @@ -121,16 +124,24 @@ private fun MessageComposerAttachmentImageItemPreview() { @Composable internal fun MessageComposerAttachmentImageItem() { - val previewHandler = AsyncImagePreviewHandler { - ColorImage(color = Color.Green.toArgb(), width = 200, height = 150) - } - CompositionLocalProvider(LocalAsyncImagePreviewHandler provides previewHandler) { - MessageComposerAttachmentMediaItem( - attachment = PreviewAttachmentData.attachmentImage1, - ) + MessageComposerAttachmentItem(attachment = PreviewAttachmentData.attachmentImage1) +} + +@Preview +@Composable +private fun MessageComposerAttachmentImageItemUnnamedPreview() { + ChatTheme { + MessageComposerAttachmentImageItemUnnamed() } } +@Composable +internal fun MessageComposerAttachmentImageItemUnnamed() { + MessageComposerAttachmentItem( + attachment = PreviewAttachmentData.attachmentImage1.copy(name = null), + ) +} + @Preview @Composable private fun MessageComposerAttachmentVideoItemPreview() { @@ -141,12 +152,32 @@ private fun MessageComposerAttachmentVideoItemPreview() { @Composable internal fun MessageComposerAttachmentVideoItem() { + MessageComposerAttachmentItem(attachment = PreviewAttachmentData.attachmentVideo1) +} + +@Preview +@Composable +private fun MessageComposerAttachmentVideoItemUnnamedPreview() { + ChatTheme { + MessageComposerAttachmentVideoItemUnnamed() + } +} + +@Composable +internal fun MessageComposerAttachmentVideoItemUnnamed() { + MessageComposerAttachmentItem( + attachment = PreviewAttachmentData.attachmentVideo1.copy(name = null), + ) +} + +@Composable +private fun MessageComposerAttachmentItem(attachment: Attachment) { val previewHandler = AsyncImagePreviewHandler { ColorImage(color = Color.Green.toArgb(), width = 200, height = 150) } CompositionLocalProvider(LocalAsyncImagePreviewHandler provides previewHandler) { MessageComposerAttachmentMediaItem( - attachment = PreviewAttachmentData.attachmentVideo1, + attachment = attachment, ) } } diff --git a/stream-chat-android-compose/src/test/kotlin/io/getstream/chat/android/compose/ui/messages/composer/internal/attachments/MessageComposerAttachmentsTest.kt b/stream-chat-android-compose/src/test/kotlin/io/getstream/chat/android/compose/ui/messages/composer/internal/attachments/MessageComposerAttachmentsTest.kt index 669d45a63ce..66de36aaf84 100644 --- a/stream-chat-android-compose/src/test/kotlin/io/getstream/chat/android/compose/ui/messages/composer/internal/attachments/MessageComposerAttachmentsTest.kt +++ b/stream-chat-android-compose/src/test/kotlin/io/getstream/chat/android/compose/ui/messages/composer/internal/attachments/MessageComposerAttachmentsTest.kt @@ -66,4 +66,25 @@ internal class MessageComposerAttachmentsTest : PaparazziComposeTest { MessageComposerAttachmentFileItem() } } + + @Test + fun `image attachment item without title or name`() { + snapshotWithDarkModeRow { + MessageComposerAttachmentImageItemUnnamed() + } + } + + @Test + fun `video attachment item without title or name`() { + snapshotWithDarkModeRow { + MessageComposerAttachmentVideoItemUnnamed() + } + } + + @Test + fun `file attachment item without title or name`() { + snapshotWithDarkModeRow { + MessageComposerAttachmentFileItemUnnamed() + } + } } diff --git a/stream-chat-android-compose/src/test/snapshots/images/io.getstream.chat.android.compose.ui.messages.composer.internal.attachments_MessageComposerAttachmentsTest_file_attachment_item_without_title_or_name.png b/stream-chat-android-compose/src/test/snapshots/images/io.getstream.chat.android.compose.ui.messages.composer.internal.attachments_MessageComposerAttachmentsTest_file_attachment_item_without_title_or_name.png new file mode 100644 index 0000000000000000000000000000000000000000..675f79136d9c542af1635c2811db828f62347bd1 GIT binary patch literal 15101 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 X-H$27vyK}Uv9k6%aW{1=}W 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 literal 0 HcmV?d00001 diff --git a/stream-chat-android-compose/src/test/snapshots/images/io.getstream.chat.android.compose.ui.messages.composer.internal.attachments_MessageComposerAttachmentsTest_image_attachment_item_without_title_or_name.png b/stream-chat-android-compose/src/test/snapshots/images/io.getstream.chat.android.compose.ui.messages.composer.internal.attachments_MessageComposerAttachmentsTest_image_attachment_item_without_title_or_name.png new file mode 100644 index 0000000000000000000000000000000000000000..d4d0438d5681aeca6cb1ff676350a790611e1e8e GIT binary patch literal 3795 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 BGP(c& literal 0 HcmV?d00001 diff --git a/stream-chat-android-compose/src/test/snapshots/images/io.getstream.chat.android.compose.ui.messages.composer.internal.attachments_MessageComposerAttachmentsTest_video_attachment_item_without_title_or_name.png b/stream-chat-android-compose/src/test/snapshots/images/io.getstream.chat.android.compose.ui.messages.composer.internal.attachments_MessageComposerAttachmentsTest_video_attachment_item_without_title_or_name.png new file mode 100644 index 0000000000000000000000000000000000000000..297243118798526d3841673791631713eef445c2 GIT binary patch literal 5489 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%0D2+IW!Z@8z%ljXYNkez61_?Q#gsO^ z0}k9@hs}Q6sA|0?@D^XCB9)zL8yI1gSRtbcdTXp(dGHHQ;4OQKB+|!RS8Tr7D&(C` z4SDCPdCflR4Ip-}YSVRPnmw8=-mu18bW_4-BU>K(9T$8=^PqS++jiUX)h^G(j>9o) zRz*?eFS7u$4T}i|rlmL+*CE8-IG?xu9wq+GYms=D?wmuaMO(#VK32`PNbCG0N$?da zi)!t(QQ0U&47shUq1#q0^cfa1Zw$C&h)y_ Y%;B@Aa(CVbm;iy`R_9>EQ-2}<3$rXg)Bpeg literal 0 HcmV?d00001