From 13ddd067effd43f158acf1a87a3a8d968f7514b5 Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Fri, 30 May 2025 14:09:30 -0400 Subject: [PATCH] Update to latest backup protos; Bump to libsignal v0.73.1 --- .../backupTests/account_data_00.binproto | Bin 258 -> 257 bytes .../backupTests/account_data_01.binproto | Bin 487 -> 543 bytes .../backupTests/account_data_02.binproto | Bin 585 -> 515 bytes .../backupTests/account_data_03.binproto | Bin 526 -> 547 bytes .../backupTests/account_data_04.binproto | Bin 498 -> 450 bytes .../backupTests/account_data_05.binproto | Bin 443 -> 566 bytes .../backupTests/account_data_06.binproto | Bin 536 -> 432 bytes .../backupTests/account_data_07.binproto | Bin 396 -> 449 bytes .../backupTests/account_data_08.binproto | Bin 385 -> 432 bytes .../backupTests/account_data_09.binproto | Bin 292 -> 332 bytes .../backupTests/account_data_10.binproto | Bin 417 -> 463 bytes .../backupTests/account_data_11.binproto | Bin 402 -> 443 bytes .../backupTests/account_data_12.binproto | Bin 334 -> 334 bytes .../backupTests/account_data_13.binproto | Bin 411 -> 468 bytes .../backupTests/account_data_14.binproto | Bin 418 -> 460 bytes .../backupTests/account_data_15.binproto | Bin 365 -> 402 bytes .../backupTests/account_data_16.binproto | Bin 361 -> 412 bytes .../backupTests/account_data_17.binproto | Bin 402 -> 447 bytes .../backupTests/account_data_18.binproto | Bin 342 -> 336 bytes .../backupTests/account_data_19.binproto | Bin 387 -> 440 bytes .../backupTests/account_data_20.binproto | Bin 366 -> 413 bytes .../backupTests/account_data_21.binproto | Bin 366 -> 407 bytes .../backupTests/account_data_22.binproto | Bin 420 -> 466 bytes .../backupTests/account_data_23.binproto | Bin 419 -> 460 bytes .../backupTests/account_data_24.binproto | Bin 325 -> 325 bytes .../backupTests/account_data_25.binproto | Bin 392 -> 449 bytes .../backupTests/account_data_26.binproto | Bin 426 -> 468 bytes .../backupTests/account_data_27.binproto | Bin 302 -> 338 bytes .../assets/backupTests/chat_00.binproto | Bin 622 -> 621 bytes .../assets/backupTests/chat_01.binproto | Bin 697 -> 583 bytes .../assets/backupTests/chat_02.binproto | Bin 687 -> 671 bytes .../assets/backupTests/chat_03.binproto | Bin 670 -> 569 bytes .../assets/backupTests/chat_04.binproto | Bin 588 -> 667 bytes .../assets/backupTests/chat_05.binproto | Bin 684 -> 583 bytes .../assets/backupTests/chat_06.binproto | Bin 530 -> 530 bytes .../assets/backupTests/chat_07.binproto | Bin 538 -> 538 bytes .../assets/backupTests/chat_08.binproto | Bin 544 -> 544 bytes .../assets/backupTests/chat_09.binproto | Bin 524 -> 524 bytes .../assets/backupTests/chat_10.binproto | Bin 544 -> 544 bytes .../assets/backupTests/chat_11.binproto | Bin 538 -> 538 bytes .../assets/backupTests/chat_12.binproto | Bin 530 -> 530 bytes .../assets/backupTests/chat_13.binproto | Bin 538 -> 538 bytes .../assets/backupTests/chat_14.binproto | Bin 544 -> 544 bytes .../assets/backupTests/chat_15.binproto | Bin 524 -> 524 bytes .../assets/backupTests/chat_16.binproto | Bin 544 -> 544 bytes .../assets/backupTests/chat_17.binproto | Bin 538 -> 538 bytes .../assets/backupTests/chat_18.binproto | Bin 530 -> 530 bytes .../assets/backupTests/chat_19.binproto | Bin 538 -> 538 bytes .../assets/backupTests/chat_20.binproto | Bin 544 -> 544 bytes .../assets/backupTests/chat_21.binproto | Bin 524 -> 524 bytes .../assets/backupTests/chat_22.binproto | Bin 544 -> 544 bytes .../assets/backupTests/chat_23.binproto | Bin 538 -> 538 bytes .../assets/backupTests/chat_24.binproto | Bin 530 -> 530 bytes .../assets/backupTests/chat_25.binproto | Bin 538 -> 538 bytes .../assets/backupTests/chat_26.binproto | Bin 544 -> 544 bytes .../chat_item_contact_message_01.binproto | Bin 751 -> 770 bytes .../chat_item_contact_message_02.binproto | Bin 1051 -> 956 bytes .../chat_item_contact_message_03.binproto | Bin 721 -> 726 bytes .../chat_item_contact_message_04.binproto | Bin 782 -> 706 bytes .../chat_item_contact_message_05.binproto | Bin 982 -> 1021 bytes .../chat_item_contact_message_06.binproto | Bin 718 -> 655 bytes .../chat_item_contact_message_07.binproto | Bin 743 -> 588 bytes .../chat_item_contact_message_08.binproto | Bin 904 -> 762 bytes .../chat_item_contact_message_09.binproto | Bin 588 -> 965 bytes .../chat_item_contact_message_10.binproto | Bin 750 -> 724 bytes .../chat_item_contact_message_11.binproto | Bin 1051 -> 699 bytes .../chat_item_contact_message_12.binproto | Bin 719 -> 1026 bytes .../chat_item_contact_message_13.binproto | Bin 784 -> 657 bytes .../chat_item_contact_message_14.binproto | Bin 982 -> 581 bytes .../chat_item_direct_story_reply_00.binproto | Bin 599 -> 599 bytes .../chat_item_direct_story_reply_01.binproto | Bin 716 -> 740 bytes .../chat_item_direct_story_reply_02.binproto | Bin 771 -> 674 bytes .../chat_item_direct_story_reply_03.binproto | Bin 748 -> 761 bytes .../chat_item_direct_story_reply_04.binproto | Bin 735 -> 657 bytes .../chat_item_direct_story_reply_05.binproto | Bin 758 -> 665 bytes .../chat_item_direct_story_reply_06.binproto | Bin 695 -> 550 bytes .../chat_item_direct_story_reply_07.binproto | Bin 701 -> 571 bytes .../chat_item_direct_story_reply_08.binproto | Bin 678 -> 581 bytes .../chat_item_direct_story_reply_09.binproto | Bin 552 -> 556 bytes .../chat_item_direct_story_reply_10.binproto | Bin 569 -> 576 bytes .../chat_item_direct_story_reply_11.binproto | Bin 581 -> 625 bytes .../chat_item_direct_story_reply_12.binproto | Bin 554 -> 720 bytes .../chat_item_direct_story_reply_13.binproto | Bin 578 -> 663 bytes .../chat_item_direct_story_reply_14.binproto | Bin 627 -> 792 bytes ..._direct_story_reply_with_edits_00.binproto | Bin 695 -> 669 bytes ..._direct_story_reply_with_edits_01.binproto | Bin 1041 -> 971 bytes ..._direct_story_reply_with_edits_02.binproto | Bin 892 -> 776 bytes ..._direct_story_reply_with_edits_03.binproto | Bin 1046 -> 973 bytes ..._direct_story_reply_with_edits_04.binproto | Bin 861 -> 757 bytes ..._direct_story_reply_with_edits_05.binproto | Bin 1082 -> 899 bytes ..._direct_story_reply_with_edits_06.binproto | Bin 790 -> 646 bytes ..._direct_story_reply_with_edits_07.binproto | Bin 1029 -> 801 bytes ..._direct_story_reply_with_edits_08.binproto | Bin 801 -> 684 bytes ..._direct_story_reply_with_edits_09.binproto | Bin 872 -> 786 bytes ..._direct_story_reply_with_edits_10.binproto | Bin 691 -> 672 bytes ...tem_standard_message_long_text_00.binproto | Bin 687 -> 711 bytes ...tem_standard_message_long_text_01.binproto | Bin 735 -> 636 bytes ...tem_standard_message_long_text_02.binproto | Bin 747 -> 760 bytes ...tem_standard_message_long_text_03.binproto | Bin 684 -> 605 bytes ...tem_standard_message_long_text_04.binproto | Bin 693 -> 729 bytes ...tem_standard_message_long_text_05.binproto | Bin 722 -> 660 bytes ...tem_standard_message_long_text_06.binproto | Bin 665 -> 716 bytes ...tem_standard_message_long_text_07.binproto | Bin 639 -> 628 bytes ...tem_standard_message_long_text_08.binproto | Bin 726 -> 750 bytes ...tem_standard_message_long_text_09.binproto | Bin 713 -> 614 bytes ...tem_standard_message_long_text_10.binproto | Bin 726 -> 739 bytes ...tem_standard_message_long_text_11.binproto | Bin 726 -> 649 bytes ...tem_standard_message_long_text_12.binproto | Bin 669 -> 706 bytes ...tem_standard_message_long_text_13.binproto | Bin 701 -> 637 bytes ...tem_standard_message_long_text_14.binproto | Bin 712 -> 762 bytes ...chat_item_standard_message_sms_01.binproto | Bin 659 -> 659 bytes ...chat_item_standard_message_sms_02.binproto | Bin 1070 -> 1049 bytes ...chat_item_standard_message_sms_04.binproto | Bin 654 -> 654 bytes ...chat_item_standard_message_sms_05.binproto | Bin 1076 -> 1055 bytes ...chat_item_standard_message_sms_07.binproto | Bin 660 -> 660 bytes ...chat_item_standard_message_sms_08.binproto | Bin 1070 -> 1049 bytes ...chat_item_standard_message_sms_10.binproto | Bin 654 -> 654 bytes ...chat_item_standard_message_sms_11.binproto | Bin 1074 -> 1053 bytes ...chat_item_standard_message_sms_13.binproto | Bin 660 -> 660 bytes ...chat_item_standard_message_sms_14.binproto | Bin 1072 -> 1051 bytes ...rd_message_special_attachments_00.binproto | Bin 649 -> 666 bytes ...rd_message_special_attachments_01.binproto | Bin 662 -> 684 bytes ...rd_message_special_attachments_02.binproto | Bin 676 -> 697 bytes ...rd_message_special_attachments_03.binproto | Bin 646 -> 663 bytes ...rd_message_special_attachments_04.binproto | Bin 661 -> 683 bytes ...rd_message_special_attachments_05.binproto | Bin 678 -> 699 bytes ...rd_message_special_attachments_06.binproto | Bin 643 -> 661 bytes ...rd_message_special_attachments_07.binproto | Bin 663 -> 685 bytes ...rd_message_special_attachments_08.binproto | Bin 676 -> 697 bytes ...rd_message_special_attachments_09.binproto | Bin 646 -> 663 bytes ...rd_message_special_attachments_10.binproto | Bin 661 -> 683 bytes ...rd_message_special_attachments_11.binproto | Bin 676 -> 697 bytes ...rd_message_special_attachments_12.binproto | Bin 643 -> 661 bytes ...rd_message_special_attachments_13.binproto | Bin 663 -> 685 bytes ...rd_message_special_attachments_14.binproto | Bin 678 -> 699 bytes ...d_message_standard_attachments_00.binproto | Bin 648 -> 663 bytes ...d_message_standard_attachments_01.binproto | Bin 1126 -> 915 bytes ...d_message_standard_attachments_02.binproto | Bin 1182 -> 1234 bytes ...d_message_standard_attachments_03.binproto | Bin 798 -> 645 bytes ...d_message_standard_attachments_04.binproto | Bin 1001 -> 921 bytes ...d_message_standard_attachments_05.binproto | Bin 1271 -> 1171 bytes ...d_message_standard_attachments_06.binproto | Bin 758 -> 696 bytes ...d_message_standard_attachments_07.binproto | Bin 1040 -> 929 bytes ...d_message_standard_attachments_08.binproto | Bin 1245 -> 1197 bytes ...d_message_standard_attachments_09.binproto | Bin 729 -> 630 bytes ...d_message_standard_attachments_10.binproto | Bin 1012 -> 958 bytes ...d_message_standard_attachments_11.binproto | Bin 1308 -> 1182 bytes ...d_message_standard_attachments_12.binproto | Bin 658 -> 658 bytes ...d_message_standard_attachments_13.binproto | Bin 957 -> 916 bytes ...d_message_standard_attachments_14.binproto | Bin 1354 -> 1236 bytes ...dard_message_with_link_preview_01.binproto | Bin 823 -> 827 bytes ...dard_message_with_link_preview_02.binproto | Bin 914 -> 779 bytes ...dard_message_with_link_preview_03.binproto | Bin 811 -> 834 bytes ...dard_message_with_link_preview_04.binproto | Bin 807 -> 730 bytes ...dard_message_with_link_preview_05.binproto | Bin 853 -> 886 bytes ...dard_message_with_link_preview_06.binproto | Bin 807 -> 709 bytes ...dard_message_with_link_preview_07.binproto | Bin 786 -> 673 bytes ...dard_message_with_link_preview_08.binproto | Bin 755 -> 853 bytes ...dard_message_with_link_preview_09.binproto | Bin 633 -> 716 bytes ...dard_message_with_link_preview_10.binproto | Bin 822 -> 870 bytes ...dard_message_with_link_preview_11.binproto | Bin 914 -> 757 bytes ...dard_message_with_link_preview_12.binproto | Bin 809 -> 819 bytes ...dard_message_with_link_preview_13.binproto | Bin 809 -> 749 bytes ...dard_message_with_link_preview_14.binproto | Bin 853 -> 701 bytes ...em_standard_message_with_quote_00.binproto | Bin 665 -> 659 bytes ...em_standard_message_with_quote_01.binproto | Bin 955 -> 911 bytes ...em_standard_message_with_quote_02.binproto | Bin 1381 -> 1150 bytes ...em_standard_message_with_quote_03.binproto | Bin 885 -> 824 bytes ...em_standard_message_with_quote_04.binproto | Bin 711 -> 746 bytes ...em_standard_message_with_quote_05.binproto | Bin 991 -> 927 bytes ...em_standard_message_with_quote_06.binproto | Bin 667 -> 661 bytes ...em_standard_message_with_quote_07.binproto | Bin 839 -> 894 bytes ...em_standard_message_with_quote_08.binproto | Bin 932 -> 876 bytes ...em_standard_message_with_quote_09.binproto | Bin 991 -> 894 bytes ...em_standard_message_with_quote_10.binproto | Bin 948 -> 898 bytes ...em_standard_message_with_quote_11.binproto | Bin 926 -> 864 bytes ...em_standard_message_with_quote_12.binproto | Bin 914 -> 964 bytes ...em_standard_message_with_quote_13.binproto | Bin 892 -> 646 bytes ...em_standard_message_with_quote_14.binproto | Bin 826 -> 639 bytes .../chat_item_sticker_message_00.binproto | Bin 707 -> 723 bytes .../chat_item_sticker_message_01.binproto | Bin 746 -> 665 bytes .../chat_item_sticker_message_02.binproto | Bin 775 -> 765 bytes .../chat_item_sticker_message_03.binproto | Bin 714 -> 634 bytes .../chat_item_sticker_message_04.binproto | Bin 712 -> 744 bytes .../chat_item_sticker_message_05.binproto | Bin 746 -> 679 bytes .../chat_item_sticker_message_06.binproto | Bin 692 -> 734 bytes .../chat_item_sticker_message_07.binproto | Bin 657 -> 651 bytes .../chat_item_sticker_message_08.binproto | Bin 737 -> 753 bytes .../chat_item_sticker_message_09.binproto | Bin 735 -> 654 bytes .../chat_item_sticker_message_10.binproto | Bin 763 -> 753 bytes .../chat_item_sticker_message_11.binproto | Bin 739 -> 661 bytes .../chat_item_sticker_message_12.binproto | Bin 686 -> 718 bytes .../chat_item_sticker_message_13.binproto | Bin 738 -> 670 bytes .../chat_item_sticker_message_14.binproto | Bin 732 -> 774 bytes .../chat_item_view_once_01.binproto | Bin 645 -> 667 bytes .../chat_item_view_once_02.binproto | Bin 721 -> 610 bytes .../chat_item_view_once_03.binproto | Bin 697 -> 709 bytes .../chat_item_view_once_04.binproto | Bin 719 -> 617 bytes .../chat_item_view_once_05.binproto | Bin 638 -> 695 bytes .../chat_item_view_once_06.binproto | Bin 700 -> 617 bytes .../chat_item_view_once_07.binproto | Bin 629 -> 546 bytes .../chat_item_view_once_08.binproto | Bin 608 -> 659 bytes .../chat_item_view_once_09.binproto | Bin 546 -> 619 bytes .../chat_item_view_once_10.binproto | Bin 643 -> 707 bytes .../chat_item_view_once_11.binproto | Bin 721 -> 610 bytes .../chat_item_view_once_12.binproto | Bin 695 -> 700 bytes .../chat_item_view_once_13.binproto | Bin 721 -> 619 bytes .../chat_item_view_once_14.binproto | Bin 638 -> 539 bytes .../recipient_contacts_00.binproto | Bin 455 -> 458 bytes .../recipient_contacts_01.binproto | Bin 588 -> 588 bytes .../recipient_contacts_02.binproto | Bin 581 -> 581 bytes .../recipient_contacts_03.binproto | Bin 564 -> 564 bytes .../recipient_contacts_04.binproto | Bin 464 -> 464 bytes .../recipient_contacts_05.binproto | Bin 558 -> 558 bytes .../recipient_contacts_06.binproto | Bin 578 -> 578 bytes .../recipient_contacts_07.binproto | Bin 565 -> 565 bytes .../recipient_contacts_08.binproto | Bin 483 -> 483 bytes .../recipient_contacts_09.binproto | Bin 564 -> 564 bytes .../recipient_contacts_10.binproto | Bin 565 -> 565 bytes .../recipient_contacts_11.binproto | Bin 555 -> 555 bytes .../backupTests/recipient_groups_00.binproto | Bin 1336 -> 1338 bytes .../backupTests/recipient_groups_01.binproto | Bin 1523 -> 1523 bytes .../backupTests/recipient_groups_02.binproto | Bin 1477 -> 1477 bytes .../backupTests/recipient_groups_03.binproto | Bin 1471 -> 1471 bytes .../backupTests/recipient_groups_04.binproto | Bin 1340 -> 1340 bytes .../backupTests/recipient_groups_05.binproto | Bin 1521 -> 1521 bytes .../backupTests/recipient_groups_06.binproto | Bin 1477 -> 1477 bytes .../backupTests/recipient_groups_07.binproto | Bin 1473 -> 1473 bytes .../backupTests/recipient_groups_08.binproto | Bin 1338 -> 1338 bytes .../backupTests/recipient_groups_09.binproto | Bin 1521 -> 1521 bytes .../backupTests/recipient_groups_10.binproto | Bin 1479 -> 1479 bytes .../backupTests/recipient_groups_11.binproto | Bin 1471 -> 1471 bytes .../backupTests/recipient_self_00.binproto | Bin 361 -> 363 bytes .../backupTests/recipient_self_01.binproto | Bin 363 -> 363 bytes .../backupTests/recipient_self_02.binproto | Bin 363 -> 363 bytes .../backupTests/recipient_self_03.binproto | Bin 363 -> 363 bytes .../backupTests/recipient_self_04.binproto | Bin 363 -> 363 bytes .../backupTests/recipient_self_05.binproto | Bin 363 -> 363 bytes .../backupTests/recipient_self_06.binproto | Bin 363 -> 363 bytes .../backupTests/recipient_self_07.binproto | Bin 363 -> 363 bytes .../backupTests/recipient_self_08.binproto | Bin 363 -> 363 bytes .../backupTests/recipient_self_09.binproto | Bin 363 -> 363 bytes .../backupTests/recipient_self_10.binproto | Bin 363 -> 363 bytes .../backupTests/recipient_self_11.binproto | Bin 363 -> 363 bytes .../attachments/ArchivedAttachment.kt | 15 +- .../attachments/DatabaseAttachment.kt | 12 +- .../securesms/backup/v2/BackupRepository.kt | 8 +- .../v2/DatabaseAttachmentArchiveUtil.kt | 26 +++- .../processor/AccountDataArchiveProcessor.kt | 47 +++++- .../v2/util/ArchiveConverterExtensions.kt | 134 ++++++++++++------ .../securesms/database/AttachmentTable.kt | 17 +-- .../database/BackupMediaSnapshotTable.kt | 7 +- .../helpers/SignalDatabaseMigrations.kt | 6 +- ...V276_AttachmentCdnDefaultValueMigration.kt | 108 ++++++++++++++ .../jobs/ArchiveThumbnailUploadJob.kt | 2 - .../securesms/jobs/RestoreAttachmentJob.kt | 2 +- .../jobs/RestoreAttachmentThumbnailJob.kt | 4 +- .../securesms/util/RemoteConfig.kt | 7 + app/src/main/protowire/Backup.proto | 45 ++++++ gradle/libs.versions.toml | 2 +- gradle/verification-metadata.xml | 20 +-- 261 files changed, 368 insertions(+), 94 deletions(-) create mode 100644 app/src/main/java/org/thoughtcrime/securesms/database/helpers/migration/V276_AttachmentCdnDefaultValueMigration.kt diff --git a/app/src/androidTest/assets/backupTests/account_data_00.binproto b/app/src/androidTest/assets/backupTests/account_data_00.binproto index 0c68243ee18a6c9272926a2c600e771cce7aee96..930fef9be2bd65994082d6e2ba79bf10afa6f0a5 100644 GIT binary patch delta 137 zcmZo-YGj(=SKq?O)yT-Du&Xv;-nz7ykS{0x`DC(f-XnW$ZNufjqN{?}H0O$ES4Me- zb1(`pN-!!gYA_lwTHJoq%k04zz!<@pz?i{Uz*xc9z{uFa$T*9Uor6&{cHM;kAQqEo lz~7BPmNW;mlsLzGMj?)QhTs3kY0UgD#lZju4HM6q005AaE585$ delta 137 zcmZo%z2!Pwwx1#VF4O1Y{i;0U`%OVQyq;V`VA_Qg32qa&&Vt8h>bXbZ~PzFE4XxXKrC^ zE^l&YFGFTlWJp&^Iw=Yu48K`|p#eCd-sI5&Z~%w_0+In?H~|t{A_{43VP|D8YH(#|YD)?bEW)&mP_F({vzJcU z9&1ji5)kKm%zrOae+vTd=wL9cEHP6U;HRw$LLg-~H)3OBGG;Y1H)b$mFfwIkWjHo4 zGcaLeGGj9_H8UCj8UUIB2M7Tbl;NKLngIt00u`mRcmJ9J8wdj$7YNS+5(s+GuKxux zSpOOb00000004kLQZfo4d#7SISV=w`uqKRMsAuT3R3CLiS=2LnJjC#aSMn=onGz02 UOiyoXOgPJikG3g-d}AjSLe|KEC)irX@0iLSi0p=P1v-@WPq8ca`2-4-b& zX%Y!)Z)JHdHZUK`| zp#eC@vh#g#0Ehtsk^y2k0TNsy3TbU&XJs#HaAju-P6{A3V=!YiW;bFvH#IUhIXE?9 zH!(G1WHe?tIc7I9W;8N55C9qwJJ&8zPzUi^AqGn~OniSCA`n~*UwfBQd4;zX%}8UUIB2M7Tb;|IR~ngIt00u`>R!vC598wdj$7YMll5(t%zOaBhIoc|gK P00000004kLlj;FA+#ZM1 diff --git a/app/src/androidTest/assets/backupTests/account_data_02.binproto b/app/src/androidTest/assets/backupTests/account_data_02.binproto index d0427056473b7455f869d38093f06a5d5fd60159..abf8888fb942077889ff8d297b74d7dcfa3ac831 100644 GIT binary patch delta 397 zcmV;80doGy1cL;SPJf023WEa*Ai8}}o~~wGRP@OHOlbzQydBo9fYVWO)e+Vyofm6) zS`rF#VPbM=ZecDkHX1exAQTS%a6D%xsMX-}w314sc-0ayWG0cZhm0eAs`0Re~s0g?eR5-lPLX>DO=WiN1U zXIdOgW=v={R)23{IZjDeKX*<>EpKm3Ejw31SU7KaY5*DlAOV^I2M7Tbl>CbSngIt0 z0u}EmsQ;P)8wdj$7YL;R5(o%qdH)XT^ZyzM00000004kLpaB6=E(##cFOd!PW`ai$ rV{GWJ8%dHx{Cg!EWyaI_-k)T}`|$q~3Q$c}S#MQEaROL)lM@0q{t1n| delta 449 zcmV;y0Y3hN1jz)DPJhe;3dsWsAjSLe|KEC)irX@0iLSi0p=P1v-@WPq8ca`2-4-b& zX%Y!@Xk~0{c`h(98a4_bSeyL)R}Kmgwjj}3oxNNtw~9MWhw?pWp`8QIc!Ugz315IHU5p?gWz{0TzFt0TP=5A_-}2VP|D8aBgQR5Lx?W z8kIFA-Ce1wc`x!mF))A-S{zJfOlUS%Z(%u3NmoC2PDU+nZ%i#aS3y`fZ+Qw^3Ls@O zHa9S4H#cQsW;JCuGBGhUIc7CEIb>mCG-f$tIAIV18W6Pq`z2U;l|ChUxkpE}YULsj z<7ZV5ckA`%ArzlkovTlriYShY=jI182}N{jVOVr#S7JB-AOV^I2M7Tbl-L;mngIt0 r0u|))EdQDT8wdj$7YMil5(uPSq5t%qcK;d(00000004kLlg$A(xfG|0 diff --git a/app/src/androidTest/assets/backupTests/account_data_03.binproto b/app/src/androidTest/assets/backupTests/account_data_03.binproto index 34bd2764d1f4834ec75796e8b79c5bce146397cc..b313f137499b787a5dc57c74da4c6552264ce044 100644 GIT binary patch delta 375 zcmV--0f_#N1fv9yPJgBY3ZnxGAi8}}o~~wGRP@OHOlbzQydBo9fYVWO)e+Vyofm6) zS`rCzd0}oYI506X8a4_b(%q;kPyVAK{VJy`3Im8^>##rVgogAPYi?z133nE65)c^Y z2hV)8L}6L`Wg3+=CEXYUA_q!gb8TsEWhw+yZf|!wDGDI!jyj+Jcczi|@BS_IIYFN| z(Ha1^qRCTKRW2~dnpZ>)5(7spFF*IT{I5IOfWH&W8W->Q0HD)w8G#UUP0-6B_2muvcu8{wl0S5>I6;S=L|C#|C z2m=}y2=4(B2%a(b|6VAW{~8DYEdT%j004kLQX~o>8kXk=zyevvCQh|MefuEU-a9Nb VE+=u@#-Be{&zK+97yy&V0Y(kgiUj}w delta 354 zcmV-o0iFJ%1dardPJfXD3XTH`AjSLe|KEC)irX@0iLSi0p=P1v-@WPq8ca`2-4-b& zX%Yx(Z)ABcGc_<8HVPmvm`!Ca*9n%FO7*9tS!D_(knhoqB%a&E`U+Wt$>{?U5cr?5 z>ZgWQl@z$DxwWOg(-;FH159OMDhWtsa&BR6WMz6fDGDIS{EE zDukOh13gvlBCUXl*s~rB5(7s5Q=iXyG^+{;4~`WHQl~{y2mk;80001hKa<@7Mw=~! AR{#J2 diff --git a/app/src/androidTest/assets/backupTests/account_data_04.binproto b/app/src/androidTest/assets/backupTests/account_data_04.binproto index 233f7c2c9d5009ebdd7df343ce5bef22a4293b30..3cb0dde1015e9904f4dcfb38175eb1ba45400d68 100644 GIT binary patch delta 340 zcmV-a0jvJ<1HuE4PJhJ$3c>;kAi8}}o~~wGRP@OHOlbzQydBo9fYVWO)e+Vyofm6) zS`rFnZDn$KE;u(dG8#4tATRPiG0GrFKKGznmKD^kz4n+~l(u6tBBB2rmonHzZW0i= zi!1H^x=Bd?Uf{Ebcw*TY1Tq?EbaZfYIxjDCX=iR>Y%XtdXMZn4W>#cKS4v8c0SEyQ z0T=-w0Vn}50XU)F z986?MPgp-rMLAhCRDN($P*Q3|F<3cfHEMEnHfjJG03ZXJ0S5>H6_nwg|C#{@2m%$Q zvv>cR0UHPd8c7!j&jJz%deE-_1u|Iw8VCRY00000fIpxC0a7dqAV=Fo))H`_+&=KK mws+Lv?yoa(0*VCfa&e?7;C8svKNy6i=+xGa+vpFI#Q`lI#C^g5 delta 363 zcmV-x0hIp21M&lqPJi_R3i1L9AjSLe|KEC)irX@0iLSi0p=P1v-@WPq8ca`2-4-b& zX%Y!)Z)JHdHZU{Y2a2nU_OZcbtBZSJQM%71S5)e-l zpMaGOj;ZmDz7UY(QhFE!G8$-fbZ~PzFE4XxXKrC^E^l&YFIH}4OjdexSW4~z2mufQ z7y%#wC;>15ILET{eMkXN0ayWG0cZhm0eAs`0Re~s0g?fe0TPY@A_-}2VP|D8aBgQR z5Lx?W8kIFA-Ce1wc`x!mF))A-lMVqMe+o_tAU0%UF=a4gWHC5mFl1&kHDoemWMMcm zVKioDWnnWiG7tb75DEi`W9zU#?SzK(8EbB3Y$6bC!Qjmpu-`S(-KZ*0{-Yu&@Q#Mv z10VyM0S5>H72^lK|C#{@2m%$Zs>1)80UHPd8W#w;0TKw6jZ6OyxSanQ2mk;81poj5 JfIpL!0WE_tg(v_3 diff --git a/app/src/androidTest/assets/backupTests/account_data_05.binproto b/app/src/androidTest/assets/backupTests/account_data_05.binproto index 0528e2225e816e9544fd992cd4681be2fa0397f9..a9ba3887e2ca17c5ab0e685008ed8962fa50e0a7 100644 GIT binary patch delta 413 zcmV;O0b>5U1GWT^PJg)r3bq3ZAi8}}o~~wGRP@OHOlbzQydBo9fYVWO)e+Vyofm6) zS`rF#VPbM=ZecDkHX1exAR?_x`o`f1S^IF?pAw3&8EtFf#;5I4i6SjX2)(M@`4SMv zGr~j+I_54)TA;i3d#aEa1tJGSVQyq;V`VA_Qg32qa&&Vt8(U~}bZ~PzFE4XxXKrC^ zE^l&YFLYs0NOwVYZ#pRoAPmJCky0zK+g_r0{iey*OLd;|r(Ht~#Vk18@L{0RoZ%e>edWd6OssDt~HA3J`xcE*qEf*y>;^=E#fxyJ!*+ zLrcnXG-_Y@d@+KOy>4^=82qKDKtdoiGc;mjVK*`}G&W&1W@b4zV>2;0GC4A0WHx0t zGiGKQ03ZaK0S5>H6_osn|C#{@2m%%FDX9ON0UHPd8W#wq0TKuZXLhu2^2mk;8 z05SjofIm_!3Lx_D^zQ=_p3l*V$@5w`Y)Yn&)EMSh{fw&%fWM3LE1ekQ)0gtL|IDse HlZXK`$uXti delta 289 zcmV++0p9+$1iJ%}PJg}v3cCUdAjSLe|KEC)irX@0iLSi0p=P1v-@WPq8ca`2-4-b& zX%Y!@Xk~0{c`h(98a4_b3x1QEMzxe-JbN$t&t^)1SzaoqC9&s#rf41z6Aw$r5)cnf z5zrtWclo*;uE>bbYx)=kA_Y)kbaQzs22yEuWpZ;eAZT=Sa9eXaFE4XxXKrC^E^l&Y zFKli~L_qw=}#1aJU|0RoZ%GB^PeER!e!DmEGbAOxBL2M7Tbl-L;mngIt00u|)) nEdQDT8wdj$7YMil5(uPSq5t%qcK;d(00000004kLlLG=X7Ice0SEyQ0T=-w0Vn}50XW<2jRQylPytv0U;$_WZ~=G$ zfB^xB0RfT$F%m5z32AL%XJs#NZfBE00Uj-C02%-w1)2c|2muvcu8{wl0S5>I6;S=L b|C#|C2m=}y2=4(B2%a(b|6VAWlh^@3@;qUu delta 390 zcmV;10eSwg1DFJmPJf#N3YY^5AjSLe|KEC)irX@0iLSi0p=P1v-@WPq8ca`2-4-b& zX%Yx(Z)ABcGc_<8HVPmir-czwgOU5ivTe3T=-diZ9FxNP*rFc?B{bFdXS%Ku5PPR$ zH&{tN8?YvfU8ra1v={~=2SaROa%p2_Dh5bpcWHEVIwuMs3^_s|t2t~-j=k^Hn?$t8 z(VR!ifOteFpR}auC&lw?KoSE*RZ>dt0SEyQ0T=-w0Vn}50XVLxv$_G30Ra|&lK~Qr z0U`-$ZDD6+FK}*WDiB%wWg3+=CEZ=As(CN+KQSAO)HM2M7TbJqmXJ kngIt00u|5b*Z-OU8wdj$7YK;~5(rtj82>>i`IB$~KxZ|KA^-pY diff --git a/app/src/androidTest/assets/backupTests/account_data_07.binproto b/app/src/androidTest/assets/backupTests/account_data_07.binproto index b254bbe1145d0b2725589747b133d6d2990c3ae2..dbf948079c90cfe816d1e556ae3fc06adbbd44bf 100644 GIT binary patch delta 330 zcmV-Q0k!^&1Hl83PJhG#3c&&jAi8}}o~~wGRP@OHOlbzQydBo9fYVWO)e+Vyofm6) zS`rFnZDn$KE;u(dG8#4tAXg3w5Vj!ETAjUIDz}O|cA8Y7IcaLJ8g=%Ni#Y%Xtd zXD>r$R%A$5N;)YDAnJ~v|97U5_wW8K^*KSGIMEsax1z~YR8=l8$eLF~4iW=LLQoh1 zN=7)L-sI5&Z~%w_0+Im+H~|O&AO@NN2M7Tbl;NKLngIt00u`mRcmJ9J8wdj$7YNS+ z5(s+GuKxuxSU>+72mk;80001hKTAG!{-nnki)`e*cpWNU3ic!kP-{-EFrfQ}T zXI6e{rJk9Ap@Ebcm%)O>ZkCw>@epzaLqFO+LU5VKzHBpPxBef_mF)t;x%1A1sq@=!}*h*i&I5RyjF-I@I zC|y4<)hDc~IKoPkOW|wJDbd*PGvovudOyW-PJgok3a|nSAi8}}o~~wGRP@OHOlbzQydBo9fYVWO)e+Vyofm6) zS`rF#VPbM=ZecDkHX1exATHMlmX}KPr=(eB3MG*5(TpUX+r;_`S%b;x1N_*OG7=D{ zhE|mnxT?9erN7e~zYc~N2r?UJbaZfYIxjDCX=iR>Y%XtdXB{teVNghSL3VFSVh8~c z0T=-w0Vn}50XXEsuJi+u?jm0NivOAc2M7Wc?#YEtwZwBXO=jJsvQPAjkR_&`c#ASA9!Lc5)cyQ z*D%AvCfp((kL)!frQ{e0G9YMlbZ~PzFE4XxXKrC^E^l&YFClDhN<>3QQ$b5;d2B&S zUkCvZ0T=-w0Vn}50XU=bx$Xp!>LM%H82_392M7Wc4ngJUK0~!|yxB?Ogq+Ox^ V^qqG98VCRY00000fIpLJ0Y;Z!QrQ3i diff --git a/app/src/androidTest/assets/backupTests/account_data_09.binproto b/app/src/androidTest/assets/backupTests/account_data_09.binproto index b970c08663e6296dc2ea0b9c4f80cbeed4ef3640..44f05adaa89030818228babfe04c414e26423eb6 100644 GIT binary patch delta 220 zcmZ3&bcShyU;TMTt}~2W3cG3p=B-PM3Hfs3pHC*+<~_34);3%YEV?RqO>?ezc4d?j zyK`b*N@jAZ7JE>BQfg62v6Uv50?$#Yi9y=yZ^tdF_`B@nHSf}SpO(iu^BmO)cpxg1 zYVcQxIW*Wsg3-&>;`WPmx3}Db;AEd&iAT{kd`vIoN<7$3e9czCp+`MP4W1^>C Uc>CCV`>^vf3P74O1Y{i;0U`uNc42NR1W0*gWilFQbaZfYI#Dk#b7^O8VQemMa%V3? zW>#cKS4ui33Lp+PZsxR@E!-O$64UL;m-J9uEeu9RGelgm`KF3wNJkO_MO9KtVh8~c z0T=-w0Vn}50XU)Fl;NKLngIt00u`mRcmJ9J8wdj$7YNS+5(s+GuKxux zSpOOb00000004kLpaB6=ED9h;+eFq9aG=~i@Upgd)Zp%~GjRfn1nqKhq$%KbxYIuv Qgr(@z){ooh50h>IGw9=bF8}}l delta 272 zcmV+r0q_3L1EB+uPJg5V3ZViDAjSLe|KEC)irX@0iLSi0p=P1v-@WPq8ca`2-4-b& zX%Y!)Z)JHdHZUWhw?pWp`*Z0U<2o2fqKB0S5>I6|Snn|C#|C2m=}y2)O|g2$hXX W{|>mE{~8DY000000DwP}oB=cBzG>nB diff --git a/app/src/androidTest/assets/backupTests/account_data_11.binproto b/app/src/androidTest/assets/backupTests/account_data_11.binproto index d37c1f5737e4d3df53dfa9df14c059917709d1de..b804ffce36581073bce4ad93b536c822d31888ff 100644 GIT binary patch delta 325 zcmV-L0lNN@1G@u|PJg}v3cCUdAi8}}o~~wGRP@OHOlbzQydBo9fYVWO)e+Vyofm6) zS`rF#VPbM=ZecDkHX1exAQTS%a6D%xsMX-}w3Y%Xtd zXD@VNP)K({c5gZ<3Lxr^pZ|BJk@xTZE%iA;pE%JP0JoyaQ&d$hFvyx$L=F-IM?z2- z0ZK+V18@L{0RoZ%1~>r-1t1EV0S5>H6_osn|C#{@2m%%FDX9ON0UHPd8W#wq z0TKuZXLN@lP8VCRY00000fIm_!3Lx_D^zQ=_p3l*V$@5w`Y)Yn&)EMSh{fw&% XfWM3LE1ekQ)0gtL|IDselU)Hd-dcnE delta 284 zcmV+%0ptF=1Cj%fPJfjG3X%c}AjSLe|KEC)irX@0iLSi0p=P1v-@WPq8ca`2-4-b& zX%Y!@Xk~0{c`h(98a4_bSeyL)R}Kmgwjj}3oxNNtw~9MY%Xtd zXD@7SN<>3QQ$b5;d2B&CDGDIV_n00KK_71FYBYo@gqt=4Jyq@^t$>NxvmOf) z14lwo7y(K~IHU5p?gVfEhyenU0R}h$2n8StngIt00Tq4ngJUK i0~!|yxB?Ogq!C@A|MZ=9{~8DY000000DwP}h5>90T2Ng0U!Y=0WbkL+w6@4NC8j*SOH)GXpz(yAziMJ|C#{@2m%#Q d{jvX=0UHPd8W#xf0TKwFG57yoD4CND0YR4mL7xBs delta 175 zcmV;g08szV0?q=ERe#0%@c-X>l#1IjXNj)7wV`IAbXbZ~PzFE4XxXKrC^ zE^l&YFGFTlWJp&^Iw=Yu48K`|MmV9~I6{WLx|C#|C2m=}y z2+sl%2zt=2|3U>aSpOOb00000004kLQZfo4d#7SISV=w`uqKRMsAuT3RCPmH)H8ZK f#PEk#@+)VV5)MdAPj72YT2O6jcX3oolT`smAB2AM delta 276 zcmV+v0qg$M1DgYoPJf;P3Y!87AjSLe|KEC)irX@0iLSi0p=P1v-@WPq8ca`2-4-b& zX%Y!)Z)JHdHZU{Y2a2nU_OZcbtBZSJQM%71S5)e-l zpMaGOj;ZmDz7UY(QhFE!A_Y)kbaQzs22yEuWpZ;e8fbKMaDQ_;FE4XxXKrC^E^l&Y zFK%T_R(f+-Iw=YuCQh|MefuEU-a9NbE+=u@#-Be{&zK+9O3Y9|)=sE45(8CJL>K`| zML5T@^L=mthyenU0R}h$2nQexngIt00Tts1zWbbYx)=kA_qfkVRC6>Whw?pWp`8QIc!Ugz3)5(7s<>{0FycaGrhcRApigX delta 248 zcmbQl{FZ5gU;PJ0uD6U_3P*o`_#*w>AThm2~;mn zGLP`Ilir}#6T2e)#TE%RC1#)0L@iE_)S|q^yp+@`D@`tiuRXb^L}S0tkP~o}&wG_+ z(xTNe+l<*Z^qtb$hRz$C<+z2I-JJp?7`@yq)~(pQi?M*AgOOw%7{~a}c{+Hrl0D}hm$?=TF0P0#>pa1{> diff --git a/app/src/androidTest/assets/backupTests/account_data_16.binproto b/app/src/androidTest/assets/backupTests/account_data_16.binproto index 8fa5a17e03c6c8c98e1cc8bd659f39965c7af246..fbaefee333f6e6f0f56d71a952c6182ef0ef7b02 100644 GIT binary patch delta 264 zcmV+j0r&pt0-OVoPJf>Q3Y-E8Ai8}}o~~wGRP@OHOlbzQydBo9fYVWO)e+Vyofm6) zS`rFnZDn$KE;u(dG8#4tAXg3w5Vj!ETAjUIDz}O|cA8Y7IcaLJ8g=%Ni#Y%XtdXB;m>W>#cKS4v7^2mufQ z7y%#wC;>15IHBI;(E^d@AzhT=p8uKw2M7WcrL%YcngJUK0~!|y&jJz%deE-_1u|Iw z8VCRY00000fIpxC0a7dqAV=Fo))H`_+&=KKws+Lv?yoa(0*VCfa&e?7;C8svKNy6i O=+xGa+vpFIGyydtrDgPJiqH3h4m~AjSLe|KEC)irX@0iLSi0p=P1v-@WPq8ca`2-4-b& zX%Y!)Z)JHdHZUR!vC598wdj$7YMll5(t%zOaBhIoc|gK P00000004kLlV<@nr=L;r diff --git a/app/src/androidTest/assets/backupTests/account_data_17.binproto b/app/src/androidTest/assets/backupTests/account_data_17.binproto index f1aaf270ee334a2d0ad109793cd385ca60be1785..87a8f3e5abfa20f10a4b4fa1977c72312ab16a0b 100644 GIT binary patch delta 328 zcmV-O0k{5=1HS{1PJhAz3cmshAi8}}o~~wGRP@OHOlbzQydBo9fYVWO)e+Vyofm6) zS`rF#VPbM=ZecDkHX1exATHMlmX}KPr=(eB3MG*5(TpUX+r;_`S%b;x1N_*OG7=D{ zhE|mnxT?9erN7e~zYc~N2qFhVVQyq;V`VA_Qg32qa&&Vt8-HkYbZ~PzFE4XxXKrC^ zE^l&YFLYs0NOwVYZ#pRoAPmJCky0zK+g_r0{iey*OLd;|r(Ht~#VkCbSngIt00u}EmsQ;P)8wdj$ z7YL;R5(o%qc|HFQ>hu2^2mk;80001hKT<3TAoB0@?*kH^&(Vp=^IAA;N~Vw080J^~ ajH?TPzl-xLofzZOm-4p%%&u3HTmd%NMTL3* delta 283 zcmV+$0p$L_1Cj%fPJfjG3X%c}AjSLe|KEC)irX@0iLSi0p=P1v-@WPq8ca`2-4-b& zX%Y!@Xk~0{c`h(98a4_b*1r$?9>#YEtwZwBXO=jJsvQPAjkR_&`c#ASA9!Lc5)cyQ z*D%AvCfp((kL)!frQ{e0A_Y)kbaQzs22yEuWpZ;eAZT=SaDQ_;FE4XxXKrC^E^l&Y zFKli~L_r-3m_1h0S5>H6_nT*|C#{@2m%%4@+|+F0UHPd h8W#w-0ul(MT@a!F^qqG98VCRY00000fIpLo0XDgDY3cv~ diff --git a/app/src/androidTest/assets/backupTests/account_data_18.binproto b/app/src/androidTest/assets/backupTests/account_data_18.binproto index 1a1c0d7ed31a9a1879e72d4fa9f0d9c39f437899..ff58c6f18a22eba98f829b1ef93304c118b15730 100644 GIT binary patch delta 175 zcmV;g08szd0?-1GPJhz@3eW)xAi8}}o~~wGRP@OHOlbzQydBo9fYVWO)e+Vyofm6) zS|S8Rc42NR1W0*gWjZGcAPzQe=CqhC+#4Gb)9uNZ^iW$Z3`RyXL|n1?rix@pM-l@? zRZ>b`2mufQ7y%#wC;>15INR)v14sc-0ayWG0cZhm0eAs`0g=-YAziMJ|C#{@2m%#Q d{jvX=0UHPd8W#xf0TKwFG57yoD4CN50Z|$ZK2-n! delta 174 zcmV;f08#(Y0@ebMPJh_}3f2J%AjSLe|KEC)irX@0iLSi0p=P1v-@WPq8ca`2-4-b& zX(9(hY+-U~V`VA^NM(0vbaXl=3Lp$ZAgeiSOOCzo)SE=K$kCif%Yb-9C!e&W=_keW zYd{hMMO9KtUkCvZ0T=-w0Vn}50XVLxv$_FD0Z;*00bl`W0g=ZSAw3Fq|C#{@2m%$) c=-2<60UHPd8W#wO0TKvVxfuUJDEX29QT`%BYybcN diff --git a/app/src/androidTest/assets/backupTests/account_data_19.binproto b/app/src/androidTest/assets/backupTests/account_data_19.binproto index 26daafb12507c77252cc767e870aa5133c4a58c2..9b82f0c193f273ed907656d6b7af50041cd56331 100644 GIT binary patch delta 330 zcmV-Q0k!^v1Goc_PJg=s3b+CaAi8}}o~~wGRP@OHOlbzQydBo9fYVWO)e+Vyofm6) zS`rFnZDn$KE;u(dG8#4tASLf}aC{0HRHuqlYMJXNmv6GAozFBWppP|pnVC%~Q4$bJ zm6x6G4C&Gc4Y>4O1Y{i;0U`%VVRLP1Ze=P2Q*Li}G8$-fbboMjIxjDCX=iR>Y%Xtd zXD>r$R%A$5N;)YDAnJ~v|97U5_wW8K^*KSGIMEsax1z~YR8=l8$eLF~4iW=LLQoh1 zN=7)L-sI5&Z~%w_0+Im+H~|O^AQGAZ2M7Tbl;NKLngIt00u`mRcmJ9J8wdj$7YNS+ z5(s+GuKxuxSU>+72mk;80001hKTAG!{-nnki)`e*cpWNU3ic!kP-{-EFrfQ}T zXI6e{rJk9Ap@EbcmqOaD;8Wjt{7y1#y7#n^z12%|@urVcH+-|cazetht&LM$NFe%T z(=WS}>+e=fx1XT#uSHgZQHj|nHBpPxBef_mF)t;x%1A1sq@=!}*h*i&I5RyjF-I@I zC|y4<)hDc~IKoPkOW|wJDbd*PGvovuY%XtdXB{teVNghSL3VFSVh8~c z0T=-w0Vn}50XXEsuJi+u?jm0NivOAc2M7Wc?3QQ$b5;d2B&S zUkCvZ0T=-w0Vn}50XU=bx$Xp!>LM%H82_392M7Wc4ngJUK0~!|yxB?Ogq+Ox^ V^qqG98VCRY00000fIpLJ0W$$8RT=;Q diff --git a/app/src/androidTest/assets/backupTests/account_data_21.binproto b/app/src/androidTest/assets/backupTests/account_data_21.binproto index 78e4768f384ea64777f77270f6c7f566bb82e642..dc43c45deb72a5ba0bb2ef45d84bb424a2a3dea3 100644 GIT binary patch delta 289 zcmV++0p9-Z0+$1jPJfyL3YP*3Ai8}}o~~wGRP@OHOlbzQydBo9fYVWO)e+Vyofm6) zS`rCzd0}oYI506X8a4_b(%q;kPyVAK{VJy`3Im8^>##rVgogAPYi?z133nE65)c^Y z2hV)8L}6L`Wg3+=CEXYUA_qfZZe(d=Whw_!Z(?O~baOf>3V$FB#Tt=PE3eyLqImtL z$<|ACp7N(%Lkz_%P~a6DWib5`165N*7y(K}INR)v18@L{0RoZ%1~>r-4H z6{?U5cr?5 z>ZgWQl@z$DxwWOg(-;FH1yEshb9pKTQfYQ&a&tN<3LqvngIt00Tn$8 zcK@0I2M7Wc&*<0xngJUK0~!|yi2)J_S-BYhK`8nE8VCRY00000fInIWF)}kWH8uzm Q1_%Kv0tgER5|ecSB9Gi*UH||9 diff --git a/app/src/androidTest/assets/backupTests/account_data_22.binproto b/app/src/androidTest/assets/backupTests/account_data_22.binproto index f5dcce2c0a1d339b0a6910bebe627909ab172464..69a932e8fd5e92017757a35dbfec7a482825754d 100644 GIT binary patch delta 318 zcmV-E0m1&H1JVPKPJh(`3eo}!Ai8}}o~~wGRP@OHOlbzQydBo9fYVWO)e+Vyofm6) zS`rFnZDn$KE;u(dG8#4tATRPiG0GrFKKGznmKD^kz4n+~l(u6tBBB2rmonHzZW0i= zi!1H^x=Bd?Uf{Ebcw*TY1R?}Qc42NR1W0*gWilFQbaZfYI#Dk#b7^O8VQemMa%V3? zW>#cKS4ui33Lp+PZsxR@E!-O$64UL;m-J9uEeu9RGelgm`KF3wNJkO_MO9KtVh8~c z0T=-w0Vn}50XU)Fl;NKLngIt00u`mRcmJ9J8wdj$7YNS+5(s+GuKxux zSpOOb00000004kLpaB6=ED9h;+eFq9aG=~i@Upgd)Zp%~GjRfn1nqKhq$%KbxYIuv Qgr(@z){ooh50h>IHZ!q(`~Uy| delta 272 zcmV+r0q_3O1Ed3xPJgEY3Zw!GAjSLe|KEC)irX@0iLSi0p=P1v-@WPq8ca`2-4-b& zX%Y!)Z)JHdHZU{Y2a2nU_OZcbtBZSJQM%71S5)e-l zpMaGOj;ZmDz7UY(QhFE!A_qfkVRC6>Whw?pWp`*Z0U<2o2fqKB0S5>I6|Snn|C#|C2m=}y2)O|g2$hXX W{|>mE{~8DY000000DwP}oB=j+$!eSc diff --git a/app/src/androidTest/assets/backupTests/account_data_23.binproto b/app/src/androidTest/assets/backupTests/account_data_23.binproto index 00fb0975462bd2064380239301b04d8fcf399641..6689dfdbfde8d9808a1a44d663707509f2ea2e89 100644 GIT binary patch delta 325 zcmV-L0lNO91Iz=EPJhn=3d{luAi8}}o~~wGRP@OHOlbzQydBo9fYVWO)e+Vyofm6) zS`rF#VPbM=ZecDkHX1exAR?_x`o`f1S^IF?pAw3&8EtFf#;5I4i6SjX2)(M@`4SMv zGr~j+I_54)TA;i3d#aEa1tJGZVRLP1Ze=P2Q*Li}G8<@gbboMjIxjDCX=iR>Y%Xtd zXD@VNP)K({c5gZ<3Lxr^pZ|BJk@xTZE%iA;pE%JP0JoyaQ&d$hFvyx$L=F-IM?z2- z0ZK+V18@L{0RoZ%1~>r-5g-H6_osn|C#{@2m%%FDX9ON0UHPd8W#wq z0TKuZXLN@lP8VCRY00000fIm_!3Lx_D^zQ=_p3l*V$@5w`Y)Yn&)EMSh{fw&% XfWM3LE1ekQ)0gtL|IDselU)HuyTXLl delta 284 zcmX@ZyqI}{U;Q#BuEk7T3P*o`_eSCeL=;IwjGjTL0JiG_QupIIZQX8=p5U%a9Wg=J!4>B*5=0 zctJs~{O2y2btgK`XaAC5Rbuu@P1NG_NG-}s%u7kFGE&GWDXA|gw$j%x&P>ls%+bp) zO4rZH^KxEiD2x)|6k^o{g>ik0D}hm$!&~o0C0Y1ga7~l diff --git a/app/src/androidTest/assets/backupTests/account_data_24.binproto b/app/src/androidTest/assets/backupTests/account_data_24.binproto index 7f12f59e9109d8386c13d6ed5158874c884a4b7d..6ec32daa62c9fe1565329a6e1d93aafe7c80e646 100644 GIT binary patch delta 175 zcmV;g08szM0>uK5Re!pDP@b-4TvYVP{!D2Gv%DSFt$@=}a@7&mDV-NuK5Re#0%@c-X>l#1IjXNj)7wV`IAbXbZ~PzFE4XxXKrC^ zE^l&YFGFTlWJp&^Iw=Yu48K`|MmV9~I6{WLx|C#|C2m=}y z2+sl%2zt=2|3U>aSpOOb00000004kLQZfo4d#7SISV=w`uqKRMsAuT3RCPmH)H8ZK f#PEk#@+)VV5)MdAPj72YT2O6jcX3oolT`sTUder4 delta 276 zcmV+v0qg$31Be5VPJfF63Wx#K`| zML5T@^L=mthyenU0R}h$2oop*ngIt00Tts1zW#YEtwZwBXO=jJsvQPAjkR_&`c#ASA9!Lc5)cyQ z*D%AvCfp((kL)!frQ{e0A_qfkVRC6>Whw?pWp`8QIc!Ugz3?ezc4d?j zyH{dyZf0Jp7E5qmez}zmo8bQ+#AFf;_`4CvlICER z66bi&D8w<(@caKbjhX+YI2gd7!9GZZOF?SdbM^yFk;m2iwmR1SR=9c3TE|3Bz3}$2 R`SxMwXUJcZV3_#B3;;{rQIY@v delta 182 zcmcb_w2osV)HJ>0)`Gorb&!!7K|LCQVg>g**O?RZMC_|{)3oIqUT>+2ePC& gn5D!yIvIsHB6mvschva#Uy6eP3>xew%P^V&0LCakY5)KL diff --git a/app/src/androidTest/assets/backupTests/chat_00.binproto b/app/src/androidTest/assets/backupTests/chat_00.binproto index 667223fcc3d1921ae1b7a4e885d6b3892ce5084f..3dba406f9d86459e6522e786ccea338bc37d6acc 100644 GIT binary patch delta 126 zcmV-^0D=GR1nmT{_W^cw8gmE(5Cj+jH~~NbN?|ww5?dk)X>DO=WiM)QWoK$j3J@&9 zw2V-${!_D;PT3x7PN@b%7 delta 127 zcmV-_0D%AP1nvZ|_W^fy8gvK)5Cj+jH~~NbN@6$x5?mq*X>DO=WiM)QWoHUb3LrIO zFk>}lH)1(AH8M9jI5lE7F*RdkG-fzCH!@~4GB^+b8W20zE>Tbi@me7UOE*k>e;FbW hTnt}(mr{9!w-wD#iE{KPDDaMk-2)l`Q0vvQ^as|!Czb#J diff --git a/app/src/androidTest/assets/backupTests/chat_01.binproto b/app/src/androidTest/assets/backupTests/chat_01.binproto index 1a14b1b8a17bf42ba1e3f4af896a3303d59850f9..3eda02c9c3fab80a8f3bff34e7f296948d243842 100644 GIT binary patch delta 63 zcmV-F0Kosb1;+%i_W>qP8chfT5Ck9rD4@;iz4#0;$M)^Bo;6A_5-lPLX>DO=WiN1U VXOlJp9t>UP>xP^Oiy_5|4r78n2k delta 177 zcmV;i08anM1i1yU_W?h^0UEsl2m=rVAOR@Q<@ulZ7BKqD{`j&tN}vG}n*kyTX>DO= zWiN1UXDSd``(+xHH6`6$sj7J|@;@;!fDn@%0v=@wTM8g$Gd4FcW;ZuwVrDgEH!?9X zG&yE9IXPruVl-wsV>n?D0vZss|NA9ad6hmTdbvkOwQA)e5aVYLckA`%ArzlkovTlr fiYShY=jI182}N{jVOVr#S7JB-AOTRW$%X0%(`7=V diff --git a/app/src/androidTest/assets/backupTests/chat_02.binproto b/app/src/androidTest/assets/backupTests/chat_02.binproto index 8af285988fc55334bc154907b8d2eab676908c12..f5d6fa006791a277e240f58fc156c5e662f472cf 100644 GIT binary patch delta 139 zcmV;60CfMa1)l}5_W>lP0UDzL2m=rV7y&4_g13UH8Zhkd+se&1H~~NbN`e760TO(Z z90Dp@YEB9e10Lteb{Z#+moWb-drq?+5)gp);mO<4OGqPab$=%X^n@7X?z5u=I08Z- tI51{5WiewpWMX77G-5P3GBY-0H#IkAGB+?aW;8f78UP>yQ230}%LZdTFf;%F delta 155 zcmV;M0A&B41+N9L_W>og0UEOb2m=rV7y&5I`{&KK1u(PNftrjpH~~NbN|FIM0TPP= zlN$mmX$oHoAUI(+GGb+7Vl-r8IWswBFf%kVVP!BgHDqLBWjAJJG!O$C5ZN?e+*+~E zafu7E%1~Lt2Sx(#RK E2mRiK0UDnH2m=rV7y&4t&Fa1Q3^2#`?X#XWH~~NbN`E*35_yvt z0xDN(O9~KwH!d5O^4RKND(1+G|GQ`s5JOAKax`jR`Ft^glD%$o{}}wGr$9m=G&3|} pV_`QkGc-0~HD+cxH)As~I5IghVq`XDH#25t8UP>!P^Oiy_5_wJG9&;1 delta 56 zcmV-80LTBE1bP8d3-Y5Cj+jDA48kpZFFq`pf?KvNt#ZKmkfJH~|tYlNtgl O3K{?)1W>NYh3W@B9urgm diff --git a/app/src/androidTest/assets/backupTests/chat_05.binproto b/app/src/androidTest/assets/backupTests/chat_05.binproto index 4e2aed653b1014bccf8befb879056e8ed1bd7328..11304a626fcd8d1b97ff603986de56380c54b599 100644 GIT binary patch delta 63 zcmV-F0KosO1;+%i_W>qP8chfT5Ck9rD7b>Rf~guX?C;yk%{NLh5-lPLX>DO=WiN1U VXOlJp9t>UP>#Q230}%Lcu*6~q7l delta 164 zcmV;V09*gZ1gr(H_W?h%0UEFY2m=rVAOR@Q`{&KK1u(PNftrjpN|ON+jsYSGX>DO= zWiN1UXDSd``(+xHH6`6$sj7J|@;@;!fDn@%0v=cjP6{A3V=!YiW;bFvH#IUhIXE?9 zH!(G1WHe?tIX5z9G%`3402&ZG*Dg^|2k}}V21_?ge191t5L^sjdzVsqg|`*WPlmuDb`{7B|rV diff --git a/app/src/androidTest/assets/backupTests/chat_06.binproto b/app/src/androidTest/assets/backupTests/chat_06.binproto index b2080358e7258a881865e1710b45e88044826369..8b954d38e21374cc5084146dc57e1690f64472a6 100644 GIT binary patch delta 13 VcmbQlGKpmaFB9w5&#$L40RSKy1sebW delta 13 VcmbQlGKpmaFB9wQtDC;C0{|e&1zrFE diff --git a/app/src/androidTest/assets/backupTests/chat_07.binproto b/app/src/androidTest/assets/backupTests/chat_07.binproto index 9d21feabb0bf1231e305caef287babe952e8b40b..4cfc4df71728573b0761429b06a5909ccd6b7114 100644 GIT binary patch delta 33 rcmV++0N($a1eye}0RkDI&Fa1Q3^2#`?X#XWN(2Z3AO}#Um9O>$^7Rfh delta 33 rcmV++0N($a1eye}0RkD&<@ulZ7BKqD{`j&tN(2Z3AO}#c$%X0%0PYU- diff --git a/app/src/androidTest/assets/backupTests/chat_08.binproto b/app/src/androidTest/assets/backupTests/chat_08.binproto index 56506b5c0749a0fceec2fab904037f9f27d4b39a..af462927b8817d38ee2ee2aeb5b457efd257cf52 100644 GIT binary patch delta 39 vcmZ3$vVdg+Ba{4&rtM8Dr3~J@zkTYgxdo#GqZgY6BL}krN5GGsOQ+cYFPILp delta 39 xcmV+?0NDSa1fT@40RkV;`{&KK1u(PNftrjpH~~NbN(MLq2m>GpP@v?ly9YFQ4rc%W diff --git a/app/src/androidTest/assets/backupTests/chat_09.binproto b/app/src/androidTest/assets/backupTests/chat_09.binproto index 688a64ffe6e3873d97a665414b172f18cc61aeed..bcc0409f705f63642d9cdd6c1ef7bd794f42f6f5 100644 GIT binary patch delta 13 UcmeBS>0#Nx&cwR)^XsWh03TZg2><{9 delta 13 UcmeBS>0#Nx&cyoq>ZUL303ZnkOaK4? diff --git a/app/src/androidTest/assets/backupTests/chat_10.binproto b/app/src/androidTest/assets/backupTests/chat_10.binproto index f07cdd2d392a433e6aadf35d5f0852f013941649..cbd4585e8315cb5060c5528348084d21656ec907 100644 GIT binary patch delta 39 xcmV+?0NDSa1fT@40RkVO&Fa1Q3^2#`?X#XWH~~NbN(MLq2n8StP^Oiy_5?sP4*>uG delta 39 xcmV+?0NDSa1fT@40RkV;<@ulZ7BKqD{`j&tH~~NbN(MLq2n8StP_D^^>IYJ155WKc diff --git a/app/src/androidTest/assets/backupTests/chat_11.binproto b/app/src/androidTest/assets/backupTests/chat_11.binproto index 41920144e00a025fece4c92a80abeea6b47080df..daea7d3bceb0ca230caf1321b91fea664cb90785 100644 GIT binary patch delta 33 pcmbQmGK*ycBa`HgrtM8Dr3~J@zkTYgxfcrun*w*hkDg1X*#PDa4ewXQU diff --git a/app/src/androidTest/assets/backupTests/chat_12.binproto b/app/src/androidTest/assets/backupTests/chat_12.binproto index be0eb5377ed6005a167a941714691e4b04089ad1..44ce2fd62b65eab4da7decad6d40422431fcc48e 100644 GIT binary patch delta 13 VcmbQlGKpmaFB9w5&#$L40RSKy1sebW delta 13 VcmbQlGKpmaFB9wQtDC;C0{|e&1zrFE diff --git a/app/src/androidTest/assets/backupTests/chat_13.binproto b/app/src/androidTest/assets/backupTests/chat_13.binproto index aa54329d9068427e21cbfd80f9ea0e2b31fff9ea..dbd391e708f45862b8939bc105a22d3be7c030dd 100644 GIT binary patch delta 33 rcmV++0N($a1eye}0RkDI&Fa1Q3^2#`?X#XWN(2Z9APrEam9O>$^HmN& delta 33 rcmV++0N($a1eye}0RkD&<@ulZ7BKqD{`j&tN(2Z9APrEi$%X0%0ZtD9 diff --git a/app/src/androidTest/assets/backupTests/chat_14.binproto b/app/src/androidTest/assets/backupTests/chat_14.binproto index dc1791cf164f3226555874cb724d74fc30700a52..772973b3fce22af7777b1ae8e7f6af66e115f7f0 100644 GIT binary patch delta 39 vcmZ3$vVdg+Ba{4&rtM8Dr3~J@zkTYgxdo#GqZgY6BL}AfU%-!^OQ+cYFZd3= delta 39 xcmV+?0NDSa1fT@40RkV;`{&KK1u(PNftrjpH~~NbN(MLq2niq#P@v?ly9YGb4s!qi diff --git a/app/src/androidTest/assets/backupTests/chat_15.binproto b/app/src/androidTest/assets/backupTests/chat_15.binproto index bc9b6c21109e01874663b525a490da0684d988c4..8807550d4e15de71153202113c21506a1f19f3a6 100644 GIT binary patch delta 13 UcmeBS>0#Nx&cwR)^XsWh03TZg2><{9 delta 13 UcmeBS>0#Nx&cyoq>ZUL303ZnkOaK4? diff --git a/app/src/androidTest/assets/backupTests/chat_16.binproto b/app/src/androidTest/assets/backupTests/chat_16.binproto index 863bdf4a7a3ad11c8f732d5f47181eae5f8d21bf..cecb85635f5b7470a860ef2c0df38b0ba3361a3b 100644 GIT binary patch delta 39 xcmV+?0NDSa1fT@40RkVO&Fa1Q3^2#`?X#XWH~~NbN(MLq2n!$(P^Oiy_5?ta4-EhS delta 39 xcmV+?0NDSa1fT@40RkV;<@ulZ7BKqD{`j&tH~~NbN(MLq2n!$(P_D^^>IYKC56u7o diff --git a/app/src/androidTest/assets/backupTests/chat_17.binproto b/app/src/androidTest/assets/backupTests/chat_17.binproto index c78d042e5445473d0f68d5658f8cc06f3eb3bf7b..ee8fa2a346354154b5963b9117a2512906bfe313 100644 GIT binary patch delta 33 pcmbQmGK*ycBa`HgrtM8Dr3~J@zkTYgxfcrukAh&pkDg1X*#PEl4gCNB delta 33 rcmV++0N($a1eye}0RkD&`{&KK1u(PNftrjpN(2ZDAQ4cY)s8r diff --git a/app/src/androidTest/assets/backupTests/chat_18.binproto b/app/src/androidTest/assets/backupTests/chat_18.binproto index 2fec5b82ba88bffaba88433fcc4631bb721a5f9d..86ba04796113a6765732a3c5dd027eac3ac6a986 100644 GIT binary patch delta 13 VcmbQlGKpmaFB9w5&#$L40RSKy1sebW delta 13 VcmbQlGKpmaFB9wQtDC;C0{|e&1zrFE diff --git a/app/src/androidTest/assets/backupTests/chat_19.binproto b/app/src/androidTest/assets/backupTests/chat_19.binproto index 9306615b951ced80173c7492065bea0cbc73f021..cc4d79cb7d5fcf33ef4e9d5c2f235defdf1c81e5 100644 GIT binary patch delta 33 rcmV++0N($a1eye}0RkDI&Fa1Q3^2#`?X#XWN(2ZFAQMogm9O>$^R*64 delta 33 rcmV++0N($a1eye}0RkD&<@ulZ7BKqD{`j&tN(2ZFAQMoo$%X0%0j>`W diff --git a/app/src/androidTest/assets/backupTests/chat_20.binproto b/app/src/androidTest/assets/backupTests/chat_20.binproto index 119e329ebaf2aa86c1d819676a0b6171981fc264..62067d8c1ea04889d3466d178cc4716cf5e15544 100644 GIT binary patch delta 39 vcmZ3$vVdg+Ba{4&rtM8Dr3~J@zkTYgxdo#GqZgY6BL}~NNWhPtOQ+cYFjx-C delta 39 xcmV+?0NDSa1fT@40RkV;`{&KK1u(PNftrjpH~~NbN(MLq2oE3>P@v?ly9YHm4u1du diff --git a/app/src/androidTest/assets/backupTests/chat_21.binproto b/app/src/androidTest/assets/backupTests/chat_21.binproto index 356e200bdae80a020e7fee0a6a28735febe89076..b807fae3c5b6798408e26632829540da8a17c82a 100644 GIT binary patch delta 13 UcmeBS>0#Nx&cwR)^XsWh03TZg2><{9 delta 13 UcmeBS>0#Nx&cyoq>ZUL303ZnkOaK4? diff --git a/app/src/androidTest/assets/backupTests/chat_22.binproto b/app/src/androidTest/assets/backupTests/chat_22.binproto index a76834ff0bade9b53b4d9d1893b5917d149ea3c2..cef596c97e4569240c3f1b890e98dc2ae88c6024 100644 GIT binary patch delta 39 xcmV+?0NDSa1fT@40RkVO&Fa1Q3^2#`?X#XWH~~NbN(MLq2oWF_P^Oiy_5?ul4;cUe delta 39 xcmV+?0NDSa1fT@40RkV;<@ulZ7BKqD{`j&tH~~NbN(MLq2oWF_P_D^^>IYLN57__! diff --git a/app/src/androidTest/assets/backupTests/chat_23.binproto b/app/src/androidTest/assets/backupTests/chat_23.binproto index 7f38d41466dbd0002d1545193ca8e4277126f826..f2decffcc58bdc13d264ce3b11884b9c5da510fe 100644 GIT binary patch delta 33 pcmbQmGK*ycBa`HgrtM8Dr3~J@zkTYgxfctEkOpJGkDg1X*#PEr4f_B9 delta 33 rcmV++0N($a1eye}0RkD&`{&KK1u(PNftrjpN(2ZJC;?EQ*Niv diff --git a/app/src/androidTest/assets/backupTests/chat_24.binproto b/app/src/androidTest/assets/backupTests/chat_24.binproto index cc2d406f9c34f6b0accdaec1bfd150d08353d3ed..af05b5607bf24651eee321189cd00d30f81daf2d 100644 GIT binary patch delta 13 VcmbQlGKpmaFB9w5&#$L40RSKy1sebW delta 13 VcmbQlGKpmaFB9wQtDC;C0{|e&1zrFE diff --git a/app/src/androidTest/assets/backupTests/chat_25.binproto b/app/src/androidTest/assets/backupTests/chat_25.binproto index bbe5abeef095607a03ad887002db0201bac8e020..3213db2c5343664856a6a57894cd9ed10eefbc5f 100644 GIT binary patch delta 33 rcmV++0N($a1eye}0RkDI&Fa1Q3^2#`?X#XWN(2ZLC<9QYm9O>$^Scg8 delta 33 rcmV++0N($a1eye}0RkD&<@ulZ7BKqD{`j&tN(2ZLC<9Qg$%X0%0kjVa diff --git a/app/src/androidTest/assets/backupTests/chat_26.binproto b/app/src/androidTest/assets/backupTests/chat_26.binproto index fc10205d92388ebddaa7b87c0f46b7ffef88ca59..dbcf7b32a3852b293b9bc6383ea6331b37ff976f 100644 GIT binary patch delta 39 vcmZ3$vVdg+Ba{4&rtM8Dr3~J@zkTYgxdo#GqZgY6BZsIIL%@%oOQ+cYFVYUS delta 39 xcmV+?0NDSa1fT@40RkV;`{&KK1u(PNftrjpH~~NbN(MLq2o)LtP@v?ly9YF~4r>4a diff --git a/app/src/androidTest/assets/backupTests/chat_item_contact_message_01.binproto b/app/src/androidTest/assets/backupTests/chat_item_contact_message_01.binproto index 50b4a830dae0f29c897b6323273ad296c920bc7c..e1f1c7c8b1c52598a26dbe84b50338b0d8321c41 100644 GIT binary patch delta 174 zcmV;f08#(%1%d{k0wsU~BK-jf0uTfkp}?7pk}*OK2;R*9!^JTWqWpx>n>1qI0Serc zB?4f5Zz2k5ZDD6+FKTdQXKG&x5D9wOw7_l3#tSQ82g8JChY}D!KpslplhWdr6ylS^ z=Wk9J_rdj}0wM@uSZPdCV`oe#05I16;l=GSLLf6{G%zt`G+|_BIWuH3WimN7F*Ic| cIWuE3Wj8ivG-Vn9ItzGKb!K=;Qc`41Qk&gEPyhe` delta 155 zcmV;M0A&Ay2JZ!+0wwJMBI*GM0uTfkp}?7pk}*OK2;R*9!^JTWqWpx>n>1p~0Sd{J zB?4e-Tp|i-ZDD6+FKTdQX9`XVAT%;KG&p8qI5#;lF=aP5IXE&jG-fe0GcYt^G&N#1 zH4p$A5cB^s#4aL?@a&S~7%Y#hn_fD``N&Yjf;hYMT#M5Av4#!&9Y1pjP6!SoSC_a z>8bh!dFfVcm5Hu}k--i>ggr8&WPH+mGR(sA6D|Eb!|luc+;sEveRQqE9V0CAE3+7+ R7_7LQlDtdvOPtDzy#ae+A`$=q delta 183 zcmV;o07(D52b&0>0v(wIB9;UQ0uTWhuF;(B^Ds&V3IqrQ8USK|1PcAL9RgSZ9hdhcXe~hN20c1`Mt> lfhhdQ`R)QT3sqKRbWBWoWKCjrH~=~dLSjpGZ*)R-b4!E$J-Pq@ diff --git a/app/src/androidTest/assets/backupTests/chat_item_contact_message_03.binproto b/app/src/androidTest/assets/backupTests/chat_item_contact_message_03.binproto index 9963d7abcba6be9a01dada3b15045a701635c13d..06ffdd33a98c0b1c798c17a12da6c565b148a82c 100644 GIT binary patch delta 222 zcmV<403rX;1=adWuWMwuoG&y2r YGdDLhWn^Y#HfA(5WH~uuWo2U;04%pneEa*dO(~VNc9U^985R_0Aip43Z0WA z0$o8fA_-}2VP|D8aBgQn?GQ-i23j0UWJyn0KTbtCSu|9Ba8giGYDFR_0AlO`3h9$1 z0$qQ9A_-}2VP|D8aBgQn#}r7l2U;9VWJyn0KTbtCSu|9Ba8giGYDFOZ}-nT>t<8 delta 143 zcmV;A0C4~P2i6Cm0w2@^BGCf~0uTWhp}?7pk}*mM3I+%SDgp=rVz~nfwzD4sI{_DO zA_{43VP|D8YH(#|ItY1oa!_@2Pim8J10F{bISLL+Pk2dqbaq&8Wm0ivSRxQXQzG;f x^9jxGKDDVJ_x27d5SH7S$-5;=8?fG00oJx~-UO^ioV>{q^#)z2l2Y MJ?-;TvKXWo05x7AWdHyG delta 146 zcmV;D0B!$|1SA0tf+O!vPAw z0SXHm1Wjpkb0PytNl6+T3Jf$fH#aaaIWRCYI57|d8VPkpLs3_Cb#+A|BMJ~pWo~(4 zKuC3NbY*fbV{dH`0~!r_L{3m{VncahLqbPEDhUVyA_ZhiR%lmiGFKuBX>DO=WiM)Q zWoJN~9Z2;H56x6cyxAHZ)H+(Wmpgc7?-r8>HRSx5OUDWVWS!4UzG5FT{9nglbMO_STE_209CPR&{20Nm5c|O;Rh^Plf;h diff --git a/app/src/androidTest/assets/backupTests/chat_item_contact_message_08.binproto b/app/src/androidTest/assets/backupTests/chat_item_contact_message_08.binproto index 46fc048088abbe51d820aa38572b04718f055279..ce0ec19460007a63397fd47e4d2c2c0407f2ab8e 100644 GIT binary patch delta 240 zcmVZ*Cd`O>!5DE-5G&eUeFgY+VGdM92 z0h53N7k>!|0U`xtOIBBFGH)UZX>DO=WiM)QWoK$%3J?i;*|flI%Ek*TUhfmK5TX!{={K827>TqXHrbVOVKQQ)6dLC;%|l{^7;#F+w0SW;8G{Wi(-A qW;rutGG#J3HZe41GC4D2Gi5h6W;A6Q06GhJRta@xcu7)HWKB}k0ZkeJ delta 402 zcmWm7yH49s0DxiQ+)hqFwIT*&F=eS_3FW;EP)ccWxo>e zKLNi&AOr}{T$D6wLoW!>UF;#cGO%JdL@c=UHff{O7g%q#j#?bo>2Ph9EKwxfZnuw* z8HQt+R_8leXzoH%)0Wau?Zv8gt{z5-L#|7oETJ&BdSV)4lpM~Y6Qth!d&VFH3wC`I|Q-2Ny6et^;-n5dw}1^uiVeV7i9kfr5;fXA&#FtJbwD{@qF+EFJn34_t!t) zzrCdq?AUog@y{s!8ZV5%#0T!OQs9;#gHcH4uH(BJg=%rFipfzNgCKMp=v4|x5-&BI z7tKzm-R`s+1VR=U^03d3;8r7_Czsn?tP_Bnx)#f0aER+1z<^%5rxVklZi>T`>uv8`mb$>R>4EdWsr4Tn0F{&r}r*sg%>5 zCMe!|EJE9#l11LWafEQE+ts`vtJ;ETU=Zw8am%C;U2x}P%kK|a3^Ec_&9ONs`I*h> zu>kB1TeUE>lFz&ZdNElJ`_~ExHsNyU-0IZHVF&uv0yi_KqBUro9E!lAPgig@>dhyH zso6`mG@m=k)XaLBcR#=lBM9JXA;8Qz2KEbiCi@p= j1Ukx<^?s`eXHg`dy|b8cJIdxqSI0AjKM3a)TT14&6qGM@n=3TbU&XJs#HaAjvY2uD#wL}pkSI0AkDm3dsQq zDGCNsZ*FdBWfBHgVRUnEZW;qkaxNkRN^&kL1xjyZX=O47Q+0D;Zebb_3Jf$fH#aaa zIWRCYI57|bA`}V`OJ#0(VL(WAZggdGE@N+P5CJL)2mvAmWN%AWS8Fm{A_{43VP|D8 zYH(#|3Qh_jG%`3eIA&ouH#speWj8lDI5IReW-&A~Ff?H_HDWb25C9qw^Zzo$E+UNZ w?2_XcERU?@A`n7^kEnSO=Xrue@k0cpTU99cnck%WItzGKb!K=;Qc`41Qco33{{R30 diff --git a/app/src/androidTest/assets/backupTests/chat_item_contact_message_11.binproto b/app/src/androidTest/assets/backupTests/chat_item_contact_message_11.binproto index 039207fb62697f7da13d75b9321eb5ea5ca710a2..b23009c64a981f44e3ef84010e7809619a71ebeb 100644 GIT binary patch delta 195 zcmbQuv72=PQ~gdxrEQEHOahD&3lGffnPlk2#>K+H;>3`&fRSr1BbPcChg(i+NpePN zkr1bQW=>9OaY1IP7Mn|AK}KGx5r=OkPzoq2#m~iUY;0z1X=!0$X<{V6q9np45E`28 z?H=M#5EAMdqL*KkF2JJ2$-$_^n&KT6o^52T#F?3ElbD{WUyzsX@K(U%DO;3`Pl~61 tguS1uWu!?+T|rPlP?oDjK5M7ZOoQ;6WWF0gEa3h(*= z$I&EB=V+E?7{%w5sJcoOSRE=-T#nK2MS?NzzOP3*!l|%r9Ds=Xqsf6U8KH z)Tnlg)2>wRrXAP(Kc6>w|G2boS;S=&YZ!I_iZ#!MhMVp?lOSNB9<9oplTcC$-FmpO2dit`7uUQ_B+bZG=i zVQm5r+B?I(BzM#?mmCf?PnUz8z&x&_l4MzMGO7ta^<rfEp`kv-9D+QF(8lD3=|ETc~4Rok7 diff --git a/app/src/androidTest/assets/backupTests/chat_item_contact_message_12.binproto b/app/src/androidTest/assets/backupTests/chat_item_contact_message_12.binproto index 26215a3dfcd78afb2656c91fa1480f2ed1c18e5c..7960153e5cdbaa79dc3e55981c693351098841f0 100644 GIT binary patch delta 525 zcmWm8O>fe00D$p9q3g;>8scGA6HSvPN(`3rTH;}p@nR_qXrZhg%)c*`meE3K84#7l zi=SXO6OCRx=x*xCc+rEW#l#pdOEmFjIC<7MKfsgUa~gbzJoPV+0>mE(@ngQNlh2P= zzezTXhL8aE?fI|QCnJFzVssyQ(NVx3qt$l9u*Q84dK zfCX?2-ApDk8Iq()GLemAJ{(6wi9|X<)7dPYq%c3eG2oizV#__`iRA?pt7_I9>{L9< z)ts1O4>2Ec1;yI!LA5OGjD&Vkh}n+*zgsj4(^-DcFrszD9|=zve5tOFx)oRItN2Dy z+LKGxLXe_xiEHqKJcYQRQ8~;{?cBO%cEx_V$slgN>NYyv4jbyvrNUBhNA9VZC^+K98|a|b?hThV+eHZra98|96Sfb@jfqI=GfMabb6`99u#KYHfM9S zdpxzB5XIZ}WN6++u@5gE$;i)FXP;Jz_+)V(iC{;^r{40Jbn()A02+swe0)Nc`BFX^>0uTWhuF;(B^Ds&c3JVAX5ZI&ZwXQWv0Aj5H3aSAL z3mODXX>)TT14&6qGMWJ*3TbU&XJs#HaAjvY3R!wtLvBb)NNRdOoE=E@3tAjZM@K4V zEG=m+Y%Om;Mlws+)Kv!$>_A`s$)GEguQht$mK&Xp08F+(Wo_~(KG RG73;(SZPdCV`ofAI0Bx)M<4(I diff --git a/app/src/androidTest/assets/backupTests/chat_item_contact_message_13.binproto b/app/src/androidTest/assets/backupTests/chat_item_contact_message_13.binproto index 325fb4105278047782573dcb5d01a512579bf1f8..7d43c29852220812bb45ca081aa9cf579b3ef22d 100644 GIT binary patch delta 153 zcmbQhHj#A!Q++?9QV$~slK`W{!UHpVCK-D1bMbPp2&|ubYUyf2FD4Ggq&%)1E*&oR zpv2^i#MB%icITYL%98v%DHh+NVm&41;37RO4xjv@qQuO+R3m23vP2^rCC<#;#Pn4C zg1mGq4);J8m$V4COot!B9+^=xKAyf-wLwl6_PTLCdMQFCvHp5_+1~L*rJnZrDOn6s F3;SY0tf+O>;Vet z0SYGy2u5sWbYo~`auNwgX>4p|b8u;8Dh5PhaAj f#nD`#v)LDLC=&OX-lYOM3wTy_W_U?bQe;h1n-ErL diff --git a/app/src/androidTest/assets/backupTests/chat_item_contact_message_14.binproto b/app/src/androidTest/assets/backupTests/chat_item_contact_message_14.binproto index 41cdcff59da2f2b57530336bf8b68f86bf67b150..964701ccf18610bff8192a65048b9b5e2b790dd0 100644 GIT binary patch delta 76 zcmcb{ew1YaldFr869+sTMFB5F79Icq delta 480 zcmWm7O>5I&003Z`tZDkT8=>qVnVDmrtZP$+_>1UFr%Pn2srAgPMP2Xfq z5&JI&f(OBq7xCgiJbUo4!$5Ws{0HJ;qF40?JUpMbZey>p%~zbc!AXpY+c<@? zkboe!1dPN+A8~MngGYeqyN+YQ6rmYt={hvt@-hrAco{Y-xMK_QgzPU3$Dk>Y%;om? zIj+cY*}_vQLen6T&E~VkVxdsX@f1eKr&6y`>!S;q*#(pcH%@3AHhl*{FLUb7s0i}_ zP^vl=8_MBaQEN)Z_00cn-K_?za>ugRHi@OSgSA|5oAY54>60-Xuj!pp-B~L-OVp*V zJT3DiGP=!+a^RL?&>m`&Mz2DmvWU8a;Xp`CLcOYZbwl4QDy&B0DIzp|WP0?r(`dB~ zYvG*tMkfjr6`_MBY^-`V7&kS6kNz7Ct(2Uhv;L8Nst#oRyppi(kv|@UN1?eAfT~&+ znoXNhz`G2vW`+r$*mG!>$T0A_KI+)|eM#s)&gWs~MfGImrzKZvJ(u}(R@08%(}N=m# diff --git a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_01.binproto b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_01.binproto index f5b778b54e64c666156d4d9a6a7da35ba5158599..7d225396402e11eb520508cb7fe63ed050d8559f 100644 GIT binary patch delta 195 zcmV;!06hQ91>^;w0y*LVBHsZB0uTfkl#Yt@`!zxi2;R*9!^JTWqWpx>n>3mMzyTT& z3Iy<Mv{3J^4E zU-^77f|9*%bN`Sc#`+QvSz|qE)m@qP_;L7ynw;X;80fa8>jEMTMMF_nb#-+`Mni2w xaVP*VjFzLd@-adnH90mjGh{Y7WHmKpIXPxFW;i!7W;i%AIbk_tWin(q8UR7~Ob7q~ delta 171 zcmV;c0960v1n>3mMr~w)g z3Iy<JNm3LrRP zH!@;nVq!F8VmUK8WiT@|GGS#fGc{ynVr4gGWi$`~8W7nuU))-;&vLK_IN>Glb8sRM ZigLcYO}RPXG%DaV-M)Y1DAS6ksRLt0L5TnW diff --git a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_02.binproto b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_02.binproto index b66a6d9a37f508a58ffeeed4f7cb663a1e0e22f6..30de5bd0d7db9ae8a3e3f80120aa8aaf63c50577 100644 GIT binary patch delta 115 zcmZo>Tg1A6$z=hf(p*LkCILo?seN5vew%u+aj|f)NHNS}Y-5xXE{CHfV*#hK}Oi8;CjIf#)YV^+tQr0 zE|^Va5)hY4^{1p+WeO#b@6n7Tp4%9#httRdA`L}DQCD?!bwx%)Z9{P=12Bx1qqXue qI08Z-IX5(6W;J0qVKg;4HZ?F|GBr6cWoBeCI0<7iG&yBtVj2K`+e1A7 delta 174 zcmV;f08#(>1?&Z&0w?MLBIf}J0uTWhpYw;~&@@U93JnMZ5ZI&ZwXQWH0tf+`0mlIf z#FHliN_%=D6Le*GbT4=dH1V=^=}5Ca+zN?M@1_Is+3X4+HA_6$zRA`l`iNC>^E-1+LH ckdMbR!bB*yvdi`aG6{7>Ls3_Cb#+BJ0#{u=wEzGB diff --git a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_04.binproto b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_04.binproto index b510fdd1c2f4cdbc009215bf7a6948826c2a60f7..57863c549dc7bad63849c11f9042bd8efec2020b 100644 GIT binary patch delta 93 zcmcc5I+1k&lX*X*QV$~slK`W{^uDeyzfHY(xwtu41lG?zwRE+i62mOUd?`ULmJjnM xH2{?~?r1xB!AOCTD{8VOlY^9`l5k0CMTvfeZgFOMUSf`JK~7?3UKWEC0{~qo9Y6p8 delta 171 zcmV;c095~x1>Xgr0y*6QBH9560uTWhp!0|0&@@U73JVAX5U-uerK>R_0Ga{30U8ks z1n{4dfDi!~lAXMf)-oUg3Z?;*Hv&LrWg-)FWq5Qicr9~jXKrC^EpTjMX>JNm3LrOR zVm3B4Wi>W8W@KYxF=1miI5lB7VP#}uWHLEpVl)r{8W1km36_^i^{1p+WeO#b@6jR< ZeYR!gXZ_0>#)YV^+tQr0DAS6ksRJj$KA->q diff --git a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_05.binproto b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_05.binproto index 17fc48a0112822649b429f24f143b0690aaed7cb..8c4fd2971505c830c7ae1c9e4c1e2d7b5dbf033b 100644 GIT binary patch delta 80 zcmeyyI+Jw)lk0Rwr74UYOahD&Gy1x|{5JLC;9}!o(PH9YoW)opCCJ6{Vg95Bplsug bwu2Xp6c`~w6MF?%B$^;XOk5$8-I+oFx@H)B delta 174 zcmbQq`i*q~llvD&rH_mpOahD&3qQ9%zF^|T!NtbGqQ%6)IE(QHqm&>Q%ZK@s8i3N1 z=I)tz%}4<%G_hBJMPf2Uh>2@G<78K+kZ7SuCE=3PiW2<_-Qvvjyu=*cf}F(6JS*

=$Ky|4ipyIC T1DhxQKDsG)o59LC%evSAdR;zE diff --git a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_06.binproto b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_06.binproto index 98fbe021c4124afeb1e4a645772a47c98b0be987..852ddc0f702babca35dfb08641029820c728ffe3 100644 GIT binary patch delta 45 zcmV+|0Mh@r1*Qa`0wyIQBM1Tz0T`K%iuC(6N(~AN2m}z=qwBS{c4;7UWo~n2a%prRWMyM-a%CWCZggdGaB^jIVRC765?>+{ zbY*ySFL*6;X=iR>Y%OqXVQFqU24hQUM0$D>Kne_GdPq!9Z#ZjBT2O6j5CRyY-`1ib~I0)M*!BDetv0uTWhqw|O3&@@U93JnMZ5U-uerK>SA0tf+`0hj?A z5efwGpOSzO0T_~$?;5Ck9s5>+A-bY*ySFL*6;X=iR>Y%OqXVQFp>K0XQwdRJFQabaV6cMt;@ z$+^~??K2_}@fnI`^I_jQsLRDiFW|S;r<$wLyLRAlcqKEHp5KrRdZKQuRjk diff --git a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_08.binproto b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_08.binproto index 0ce10b630e896d08e51f60a427db45d2f1035222..8ca4a559729d6f44e7b43aeca32011caf3d477dc 100644 GIT binary patch delta 76 zcmZ3+dX!}WldFr869K+HV#F|uv5Qekkc;KR{7DT!$w_nf zOuS~K02P|pE5IT#86w2QmBeMmrBzyznU|QWP?BGgs8EzzP@0mNn3s~6s*qGvT9T?z zmRgiqQd+D~npc`D#3I0=z%0bZ!6?A0pw1$sq9k0BT2Z23p0antQBfep005s(HOl}1 diff --git a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_09.binproto b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_09.binproto index 09cc5a05c60434ddf313a579737aea1459f3b697..77af7f7fc07d83c30405271fc944c6bdc55cd0ae 100644 GIT binary patch delta 51 zcmV-30L=fW1gr$00xT;cDF^}(0T`T)iuC(6N)HMR2m}z=qwBSK`xdL^CvX` bl{D^XJ9xoJfl-M2!~BUWA2sv>#diY$Hs~68 delta 64 zcmX@WvXf;2lcj}{83&U9qr|e$?T;^*c=2*^bFc`kpL=TQYC|iAS&WiWf?O;g=1*z> TDw#BQ&%|p+3XDQPfr-5UkF^z_ diff --git a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_11.binproto b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_11.binproto index 7d15dd1abfcecb7cd4d71e1ba3eb8cbc5cfa0f16..8ab0bf08bf9449b5275cbcd0d56d65d1fbb4e7d5 100644 GIT binary patch delta 120 zcmX@g@{wf$Q(=Kp9tV>Eqr|+vt}nk$z1X-|I9Qw*W-&%c339P~m_MljDA%~7?cfC? z1xAR_#9jdwi6)2;6PE#(9+ysTVsUYzLSBAuW?o`hrb2OQUU6zsW{E;dYI1&2szPR7 PNor9+QEEwIQD!j!Dn%&d delta 76 zcmey!a+GBOldFr869}5P;S!PJrl1P XDKJ8WCiV)jNKA$ZF$n?HOzZ;ygpC;? diff --git a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_12.binproto b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_12.binproto index 9f835d1948bf89b6ae8a4206f4c40a089164a664..9b9d2dac9d07fa51ea4187c29630d4c469f44e5f 100644 GIT binary patch delta 216 zcmV;}04M*d1keSb0)Nf{BFg~?0uTWhpN@+3`!z}p3JVAX5ZI&ZwXQWv0Ga`<0Sc-C z3MmR9X>K57WoBt^X>@6CZe?>Ic5iHTbZ}vGAah}7X>@dHa}op)0U!YqeIgTdWq5Qi zcr9~jXKrC^EpTjMX>Mv{3J^4EU-^77f|9*%bN`Sc#`+QvSy5v>Y1Lhs_V{u5gPNS; z*cj-xrRxGB4MjsyS9NuDMMgtyLvbhoFpQR?wem4SAT>EQGc#m1Ib=08WH~uzHfA_C SF=jY8GdW>7V`VaAI2r)+s!lQh delta 49 zcmV-10M7r=1*!y~0xBsYCkO%%0T`(BhvU#RN(~AN2m}z=qwBS)Y8?4UQ8T}vlxq|1i4r~ z%%9W%RMfbm?cfC?1xBtoE(Wq$FIDT2Z23p<67GnVy%Jqg#-Zn3-qAo)Q^e85xk5 I#URB10KwZaBme*a delta 73 zcmbQvdWdBKlar&8JqMEjqr}S3?T;^*c=2=baD3FdaWD$7DzE@)CIKb|Rv^s=q#1?U7?p%e zQY%XID|Cx9)AJH@bPIA4GxMxi6T>~7JhIZb1k(SWmO9qDV%_aabGGQs@J$sGnC|s; z`I5*~F4YO|FZQU+yDhP%{qhNBC0 zav5_Oa_JZ6=cJY>l;-3l<|gMC6{Hp^?+Oad$tKkgk~+F)o@2`OA-}|6M>A>5{1mX%-qc6(qe_8%#_r;VuhT8cNIjJQIr8zl?xykuO1*t^}xruoxiMgf43aN#qnJKBc3Z*4LE>JwRq_o&b z8*K1lh{1duJHd>40fmnp^_37$}~YtB{#jlA4o~nx0sqkeZWO z;>5@C5$s(BfnQ*H7ULmCDM2ol5A!EA2rx?goxl6_S7QZ6t~HY@n2oC{m4r)DD@yb$ zbc-|7^AdA(3vv=O^Rg1S1d22>88VJ+m=l&+_EfwqWP*@@g_enS3{QOZ^q|Vt?V@M> zCC*QLvWroP)7>LGHz%*k&rO5DVC8~EyT2MbDHvNAB^sL;C7C80B%7w0Cs~@C8kt*K Qm?oJUnkJ{1q)9OV0L?U*>;M1& delta 497 zcmXAly=xRf7>AvB=rTpv#O6r#a))S>#BAd2DH8CIa2ibhfi!bFbH@uiGj}^PA>E}* zpyUObGVUOs$(y6%U@XmFG_;kUe$36KF~WV3==&1ym?8 zaRxHvLK#R|OJ~ABqLmSe71m{7P<332rVrdgS(h{xpN1#eX*J{%k4qoOz8NSWSfIK5( zBee8&^WJJm%J={N+qzW)LLU%1NzZLmPfoN&<%|_8c5-FhU`MfZyqhvqbb&%V&1*cW z$Mp;CnwUy1@fM$&Y0cE5=^BqO#_jOLSorbJqh__Sb9HTZA>KZFa8L=&`*&-rzdybD Sus`3dO4mPs`1;B7Q~v?y9J(z4 diff --git a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_02.binproto b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_02.binproto index 73c0dac9ca0ac6a4dfa31b76c6cae5bf60db89f3..a962fe37fc3be8e144a5a2749e99a10c02e9ba5f 100644 GIT binary patch delta 202 zcmeyv*1@)bslJU#shNp`Nq|LS&aGJoFPa*KgE^09P6KkBgg9=383K>Mlmw#!<19u~ zE@Li3F8$*CoYWG9(wv;c+~oYCg47~~+{C<;#N5(ih19~*%#_qzh0+or7bu=uQd$f& zYZBN7f!SaRVwP4rqm&>Q%ZK@s8Uz?6{?6b1`m3=5RA^!^&{h8+LQGuolaDZ2F{(`d W&m_jjnHo}(=I>jOl9|OI#Q*?A8cAXR delta 335 zcmeBR`@^&o+oV=3Bs;*W^xFofrM886}I5RyjF-Nx`Cowb6iX$z% zB-}A7FNZ6JOCiZ5EiEm{$kf!r+|tt2IMvA1JTb}A#N5O@$fi3@kt435#wNtIy>F&NY>#4@7nKzd+8gV5jRk=q7yMz=+STFzp Dk+FQU diff --git a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_03.binproto b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_03.binproto index b6d2d2eb9949817babb84ae74ccea06fb0387bdf..e0a7084e88f2915cee5d5ba32c697c000c10bf5e 100644 GIT binary patch delta 423 zcmbQnah81nQ~haXr4!5?Oad$tzuPW!ZZb3q2XhV`I}PMG332QIGXxHTDG5de##xM} zT*h36T>8cNIjJQIr8zl?xykuO1*t^}xruoxiMgf43aN#qnJKBc3Z*4LE>JwRq_o&b z8*K1lh{1duJHd>40fmnp^_37$}~YtB{#jlA4o~nx0sqkeZWO z;>5@C5$s)FfnQ*H7UK~{u7i_PnN91v8I^=fQY%XID|Cx9)AJH@bPIA4GxMzYqWmMn z(_BK*3p~9FD}%F=xCA19r%FvVRlOU#a#f}NCwoI7f$s~VriorzyZ76Sm?_(mjg=%; zv_E>yq{Qj&k)4~9SLNrX!ECT{!J^$?4K0|Q6w=HS4NMa)%?wRbOcGO)Qqs&UE%;26 QElrZl%#4kVjf|ui0K4{@c>n+a delta 495 zcmXAly-OTH7>C*O;Fbx{*m-O!uzzgA7~vntab^~T;~vQE~>N`@&I`T~v3Spf#92G=k{QKG=qYFc2% zq^2CURKYY&mDDUX%-Dizlmp9A@6*g;_`J&eU1v`E-|EczhOzg6+$T#U(I_mZM!BRx z0W3u-tr%JmH{g_8jY=}NU{o*(GAodR89F+z=znVZl>fb^*J*=VX_fTJL$a)#2P$fq z$W=iFpen4m!5L>MXr_22lCf>)=w3=^r34z|jzF2R+$i0f^gmTU8C+Fm>|J`~{NUC^ zwD+og+pyBimvb5i68K!s0p(Jw>@V-E$sXAxbgR>ey9rweBeorP<4&A*U;&~|Ys@UG=EHE4X~Q Hku?4TQv$VN diff --git a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_04.binproto b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_04.binproto index 916f2e47f160bd2bcd2533f6b5d121c880f58207..9518ee23d42a89d5c19a9a150a90b4b93018f690 100644 GIT binary patch delta 188 zcmcc1_LX%3Q~hT~r4Ni8Oad$tb8gK#c+u1-9L#w zav5_Oa_JZ6=cJY>l;-3l<|gMC6{Hp^|R1z*pttip2&@IkP S&r8hFEyzjC%*$esVgLXTY(*&m delta 292 zcmey$dY5ehQ~hlwr5j8fOad$tKkgk~+F)o@2`OA-}|6M>A>5{1mX%-qc6(qe_8%#_r;VuhT1r$E9GFl5Ci2kep&@ zkz|mPW^9^bl#-HYVU%c+mX?}mY-A+BASJ-X+>!ixgZ14?#GFi^<^rQwu<9ca)j}M*zzhM1Ziq9ixh%QN zxlEHwixQJEOMuqoWhP}PIn zIPr0Ogm_or7nq*KSS=;U#qwePqy_;-iNEuAzy4~hzz7kV*b5Aue-I%iuHeZ%%)tPX C&vpa= delta 502 zcmXYtPe@cz6vlhwfRBsmbKDHB4zn{bWfmb*2ueszNsAFAb8~&~&Uo_vnR)kK5n7B9 zwTZx*Tr`^$H{v2f2qN9NlUfHY+!^IcOWhS+-)nWw`8fQ(^PMN1pZv8<^JBK~A?s&? zZ2rqxYxhmD*hq$7n=5V@&-p)+COAn--UF}g-6NCa4!Ip+NDVBav2_+xLqSv5Fas!2 zU}!bO7%{1V(>WD04WW{ng@zd$gGO1i9CZ^Si^bW*^LOgm?f*8V>YjZ`ML$OO5m zTnmln>T9 zMOpHz3ubz3M)KSUxy;zZd0DAW)h5)!-9pe+`hK-Mv$k{oXlteVt+Ib5xU_w6__*_F Sd0=DvWcB^|_2Io|t=WGYYQIbX diff --git a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_06.binproto b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_06.binproto index a9588985e7d8ad52f1889ae7b0de39ebfc16953e..d80251ffa3581fc97253719b259a0b3f5d331d50 100644 GIT binary patch delta 142 zcmbQn*2cPkslJ6#sgaR`Nq|LS&aGJoFPa*KgE^09P6KkBgg9=383K>Mlmw#!<19u~ zE@Li3F8$*CoYWG9(wv;c+~oYCg47~~+{C<;#N5(ih19~*%#_qzh0+or7bu=uQd$f& WYZBN7f!SaRVir4_5X*=8lNtaNyfg*? delta 287 zcmZo;oyN9+seTHR(nKZ>CIJ?SANLL~Z7?({1asz2IsoK232{sYGX&;;-w`D$)!n| zIhlzHS*67#`5NnlB2Dwpbn_ZNFq=G{K>iz`w>OW@CqDMml$Z+x}9Eo`dD Oj#WDiUR~Yvg&hE`W^Hr; diff --git a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_07.binproto b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_07.binproto index ef899f2fed7ba059dad000ff745fdbc35c14a136..415a43a7dc7bfa3131d826857526e3e7cd788485 100644 GIT binary patch delta 298 zcmZqWSje`3seV3_(i|oZCIJ?S-)$E_oWVAV$;s)aaqff)i2-4JJ3b6Ikk zbD1WW79}QSmH@5E%S_5p$S)|#%+FIu&d)1OO)ddi3=~hyRmjXMNzKVgO;0RQNX^MC sapL3n2==bBz%MX8i&0Wakc;KR{7DT0j1qt6?|%K&SbAj2F`EIyW^IlT@by3hAw&)hA|b^ghbD?hYy_LR-O2fyoteG)2G}`zVXr+~)ScO=mvx%uR(Z)k@Znt_r7@p_-&GyM&__ESn4{B>cSc!t_ z=ii&}w(9jxF&w>q;)g~Y9u!UVvnW*pq)%?sTXccmNHJj+R?xbfYi1c3<{NGSB??TO z0gWk_1~S%Cnj1)zG(54~It>P8+hu6FkUFg2FPz7vb1eK`I?EgSWRA|#tMrON;WDtw zo7$T31VK8{aZC)sN#+bH$^C+Z;F8HyBQV?X^sJ!&D(P`}Skg;dw~RDTuhS;IrhE=m zV7bVZ2EkBiCx$rdQwm5`Rs>1;lF#U0N}oyzwALSiGU2&ZrZE? z`0?V|T12YP|Nh&4Gy{Y_CUlyf@A9EQ=@vrypUk^d?s*-jQb0G{w$R2w6hI}uS37O_ zs-0e)GT4?Zo60kWGH%dQoIiXZ7nkm~n`-%HbfWrpe{XPnxfX4FS^l%}?P&h&tKRsX h^{0aiQS)G*E>3Q~AAH?8GctPa((c7KAA5%*{{bit$D{xN diff --git a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_08.binproto b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_08.binproto index 0eb36561c50957610ee68cfdde33d007fde39bb2..6cebf5e9a5916119e3abf4585ab860861524ad07 100644 GIT binary patch delta 180 zcmZ3;wuW^9Q~fGNrR9tqOad$tb8gK#c+u1-9L#w zav5_Oa_JZ6=cJY>l;-3l<|gMC6{Hp^Vos+rga06a@X A2><{9 delta 298 zcmXYrKT88K7{<+cEk~w!E=Q-=Iyn^4LC{S%5pfh8gqWn|#k=H8a?-7xT*Sdv7pc?^ zZhi>C@8L%fH(eCN)#>>&Jiq6qF>5|WgK5;BL`lTr?EC%gdAPB8QHRITYY2O3GOi7q z)RGY(59Ej*(gV6LQE(5J=&Mp$?m0LfjPigQ3lx&?=D-4*A8qU6InPaX(8lCDc1f_uL=v Jp6I-_@CW+JX2$>k diff --git a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_09.binproto b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_09.binproto index 852860d96c222e0c0676fa02463085a518624bcc..b6d294f404e966764522d25d931de9f13b872ee2 100644 GIT binary patch delta 283 zcmaFCHi>NkQ~d-crCufuCIJ?S-)$E_oWVAV$;s)aaqff)i2-4JJ3b6Ikk zbD1WW79}QSmH@5E%S_5p$S)|#%+FIu&d)1OO)ddi3=~hyRmjXMNzKVgO;0RQNX^MC eapL3n2==asz%MX8i;+u+J5Qep@C|bFQqEsnI93d4#h$2FWhY%N_G2S5>w6=HcF>N>k3KeOfLb&0+C^466#HUN?Aqu-78rGF9cW3`1--^`wA4`BCW+K|9v$OL6RoT! d=6D1dg)Lh@9aK;0Cx_3eEQ|iA_j$Lt`Ul3@jJp5; diff --git a/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_10.binproto b/app/src/androidTest/assets/backupTests/chat_item_direct_story_reply_with_edits_10.binproto index 53138284b793f883ad4b59638b2a4cc3b59c2767..cf9a8b694e143cae6e99df265c2bcaf36a1fef88 100644 GIT binary patch delta 168 zcmdnYx`1^7Q~f+frP+)eOad$tb8gK#c+u1-9L#w zav5_Oa_JZ6=cJY>l;-3l<|gMC6{Hp^`OA-}|6M>A>5{1mX%-qc6(qe_8%#_r;VuhTY%OqXVQFq^ zWC{>8YG3($F@lo4Zgc;TBF6d>5LshAY1Lhs_V{u5gPNS;*cj-xrRxGB4MjsyS9NuD zMMgtyLvbhoFpQR?wem4SAT>EQGc#m1Ib=08WH~uzHfA_CF=jY8GdW>7V`VaAI2r($ C-8WPK delta 124 zcmX@kx}J3b6U$mgrB#zzm=qa1CaWTp1F%Y8sgwdNcT3nMO0wy*h zA`^6Fcyup#EpusSZeeUKaBN{|ZaN2KSyy>kP;P1f8UQj83Iy<n>1Ry0h1sC zCVzneA`^6Fcyup#EpusSZeeUKaBN{|ZaNEXYfndMM{!MfcyJ0`3LrLQV=-kgV`MQn zVlZT8Gc{x~WMpADGGR1kW@TYBGBOYX8W0Kth-2%pKkbBu^cibzWo#l4ZNcEp7_i?p z(%q;kPyVAKD9r26+ypWUc~fglQAb5mbQgD1H~=yc3Iy<cl*+uEqXJ2Q-uVkdwpHLBr=st zb;A3LJu35VORQNytK5`)y+BAxln`Ipl90Rt)C1nn4A=j^< J*bWh50suTFOr8J$ delta 200 zcmeyt`kHkClhjK_rDu#BOahD&8!pay``N&Yjf;hYMT#Nn!el8XgZe5Z;gZyf68#F@ z;>`5C#2np%oW#sLE4F0sOqZ%Eu4pa=BO{{}6AJ^2q?E+Ol;kwa)Wk#+O9P9vWOHNV zWFr$30cI%yuc!sPzg4fAkajEh)Hfc#lS%?gx*i;RSKayfYRQEDBIa<4M4XY-nj2fzqtYiM;|W5=S6HOaRR$N2dS) diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_long_text_03.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_long_text_03.binproto index b922c3669e22d96ba08237e2eef5b9cee008bf9e..2b210a81fb1ec4d5aad0c11ad5b67e9cbb697591 100644 GIT binary patch delta 71 zcmZ3(dY5GZlVXfg6bF+4qr}FGbKZV7@Z#s<1=$6l0wLD{BGds00uTWhveBIF^Ds&c3JVAX5U-uerK>R_09v<`Ap$3V zeIgTdWq5Qicr9~jXKrC^EpTjMX>Mv{3J^4EU-^77f|9*%bN`Sc#`+QvSz|qE)m@qP z_;L7ynw;X;80fa8>jEMTMMF_nb#-+`Mni2waVP*VjFzLd@-adnH90mjGh{Y7WHmKp tIXPxFW;i!7W;i%AIbk_tWin(q8UQj95efwGpOSzO0T{NG&)CN@AOSMBM?e4o delta 154 zcmV;L0A>H#1+@jB0wJ>jBCr7n0uTWhveBIF^Ds&c3JVAX5U-uerK>R_09uoiAp$3D zSt1j3Wq5Qicr9~jXKrC^EpTjMX>K|TZEH_QX-9EQczAFUH3|uOS64=HVPkrCA`nZF z*l7<<5zrtWclo*;uE;77h~x4~A*Y2AQG=2D#jZCILo?%@^mq{cPaH!NtbGqQ%6)7*#P@mPy}JNlCaQwW377 zLbo_GJufjww;(4mGtY`WB{IA+G9WLDL5jghkc;KR{7DT!L$*ylf8)530wY9dVy^&; J#CC`f698u8BkceH delta 176 zcmbQjdWm%blk5dXrL&A2OahD&n=j6J``N&YgNu!WMT?1pF={L0WEm#?`gkSblGKV4 z{R-XU%=Em(9NmJP#LPS^wq);2m#Qiu2QHqJDi0t3{A}N-fZQwrCW%G&@Acm{RuVXT zNbQc2T>l$WrKL~K>QCg=5)eqvd9hyFbCS!SYE|jfW0wv7-Z)xkB*?|`Vg95Bpc4*n X+;^tmT!9fHG_hBJMdAoMM2rale`!C( diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_long_text_06.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_long_text_06.binproto index f5e10a3d244622ee8910b295d31f024bc3f8361a..51878197e5c1ed2209381d88461785fd1717a4a6 100644 GIT binary patch delta 183 zcmV;o07(Ct1Jle3JH2wS4MGRV|sTG0~pD<)|~A#A`tNzoOtx9 lAvQYqo+*s{@<}QXzyevvCQh|MefuEU-a9NbFoUJ&)CRw&GB^ML diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_long_text_07.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_long_text_07.binproto index 494473b599e326428d361032e9e0174fe37b5ddd..b0eba70d3db14110ab4e1f4ff1d806f600b7ff20 100644 GIT binary patch delta 90 zcmV-g0Hy!`1oQ-;0wHrEaR>qs0T{K>obB^4N)HMR2m}zXoyw)FF){)O0a{a&Ap#~X w86p#OWq5Qicr9~jXKrC^EpTjMX>Mu&8UQj83Iy<`5C#2np%oW#t$tQ0N*ldSlkHHJ--_U0A;pP+Q?mykeYvTf$o*qPsc6#i(QHRsU{ zi5J_JzGhP5b#)F5FD)%~b#u;jF4SN!=$W>7>nB4e1yf5iW8)Mv%M?@76idrAvos5H y!!!#EW6MO#+3n>O8RY5M65A!EAfSfn={Eg#A3XDczp^3c$EE3xxLQDWw)JtIi delta 179 zcmaFIdX04flhhSPrHhOlOahD&+b+&|``N&Yjf;hY#fTwl_hcz1gZfk@;gZyf68#F@ z;>`5C#2np%oW#sLEi$rsyq|~G&lawS&W6M+nV-ur9AZePCl9XzmmTDrvASH0q zB>qm+#`8rR*exEazAr9N66h-0x7&B8nr07K|TZEH_QX-9EQczAFMT?!yJWMeU9Fk@sf zIASnlW-~QpGGt_7I5J^0W@cq!Gcqy|0vZqs1Bhemus`jDhV&V0Ze?sD5N*NW%^0xX iHPYRvDo_5SA}Gx3&)ftu3wcv(Oi@QgQgj4&Q#b%(Yd@&~ diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_long_text_10.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_long_text_10.binproto index 3d7f8c7f1ec0745bda5762e34db5de6264a2fef2..82d5e43882e5d67f5c44ebac4f227f829cce7dbe 100644 GIT binary patch delta 201 zcmV;)05<>D1>*&v0wLi6BHjTA0uTWhxY3;L^Ds&c3JVAX5U-uerK>SI09wJ5Ap$3V zh5;fIbY*ySFL*6;X=iR>Y%OqXVQFqU1z}f7LP%<63J_=g%NoXosIJ@6oU|^OO=S`g zmrC`gq*-MOC6MpYj3l1h7_5iW$O9q`MMF_nb#-+`Mni2waVP^YjFzLd@-a99LLfOe zG+|~nVK-qkH90mlFkvz^IWT2rWHC4#V=^>3Wn^L+05TB@1n{4dfDi!~ww2G=$1)%R DQJ+Y~ delta 188 zcmV;t07L)d1=aSI09v$@Ap$3V zdLk2aWq5Qicr9~jXKrC^EpTjMX>K|OV@qj7dU^_53Lr8vGGsJ3FgRjlVPRxrW;tbH zVKg}~IA&uvGc#i{G&B$c8W2iapu6^as*q;dQ_A)XPRSw=A}vS=y{g>#>ZFj5$1}o2 qD7Ui9_5?Bsbwxu_S9NuDMK}U75eftk@Sl=^5CIs&vA)cYHy{BK+(Y#M diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_long_text_11.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_long_text_11.binproto index 6dd9dd7179deed29e51046e8778497ad4809fc86..6e7df96b5b70abb38a947173fdb6c310e01a6ab3 100644 GIT binary patch delta 102 zcmcb{+R3_rNvfSusfCe)Nq|ve=fyd1KO1ls%+W2#NzBa4Vvu4m669j}Fn>}5Q0KO(=WiT0QecD#P3#q5k=PCqVgdji%^=$V delta 180 zcmeBVy~etLN%{(-(nUrNCILo?ofqf4{cPaH#>K+H;=~ZOn{l!flYV`wl5k0CMTvfe zZgFOMUSf`JK~7?39+w}Nf_X}knVD&-shN3NN^+86VzQZqX`)49YD!Xyk!5m{i2#F? zfZlb^Y16&FE?*Lv%B4Et{Y52#+HI*%)Bm29I@Y>k-R(Y%OqXVQFq^WC{>8YG3($F@lo4Zgc;TBF6d>5LshAY1Lhs z_V{u5gPNS;*cj-xrRxGB4MjsyS9NuDMMgtyLvbhoFpQR?wem4SAT>EQGc#m1Ib=08 aWH~uzHfA_CF=jY8GdW>7V`VaAI2r&0@<1j4 delta 135 zcmV;20C@kx1)T+;0wJ3LBA5XP0uTWhy3w5N^Ds&c3JVAX5ZI&ZwXQWv09t&LA_5{> zSt1j3Wq5Qicr9~jXKrC^EpTjMX>K|TZEH_QX-9EQczAFUH3|uOS64=HVPkrCA`nZF p*l7<<5zrtWclo*;uE;77h~x4~A*Y2AQG=2D#jBmyQj zA|exXWq5Qicr9~jXKrC^EpTjMX>K|PWLZ~vSx|0j02%-?5efwGpOSzO0T{NG&)CN@ FAOS|AAdCP2 delta 163 zcmV;U09^n51ib~I0wlWuBDetv0uTWhyV0EO^Ds&e3JnMZ5U-uerK>SY0tf+GnE{g_ z0w!}`A`^6Fcyup#EpusSZeeUKaBN{|ZaM~IOKC)UdJ;ei3}kvpOiyoXOhTdnFrX#?vtU*u{P_5efwG RpOSzO0T{!vzRZs|AOQ`UJdOYW diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_long_text_14.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_long_text_14.binproto index e0a37c8aae4b06bfcdc92ccc7b4a0d6fc39a68a0..993ad746b4c933903407acd67906e37d5a4df7f8 100644 GIT binary patch delta 215 zcmX@X`ipe|lgtlBrLT+}OahD&doIp-``N&YgNu!W#fyo9DeCTI8771JHby1klGKV4 z{R-XU%=Em(9NmJP#LPS^*2Hj6Cy%T&E`jvFr=^ayu2^^b(wr@NGkjBp1g3j^UA`nT zl}mNP`-?p)^KMJ5X}^4eS&7%xIWWAmwA9tjIoG*RgV~^G+TyLB3@w#`k3ODar>zEicFMV-^%}9`o<-`0*4M2MjZ`^mL-&}zaA~dmA LfJNd6M2HChp*%f& diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_sms_01.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_sms_01.binproto index b1a6e54ecee1907c2b89ee411d7020dc91e04ecd..9775c36b7e85d2a93d58614b76fdfd2570f56d48 100644 GIT binary patch delta 90 zcmV-g0Hyzv1(OA^K>|{0ObQS*YG3($F@lo4Zgc;TBF6d>5LshAY1Lhs_V{u5gPNS; w*cj-xrRxGhAT>EQGc#m1Ib=08WH~uzHfA_CF=jY8GdW>7V`VaAI2r&L0mkSemjD0& delta 90 zcmbQtI+=BYBU2EUAD4nfqPbC0YEqI(N|L3qWvYR(iBTeuG)+lKN;OYQH4$Kt61Zs+ ueNytK5` z)y+BAxzJ$}m&ZD(C>ftLpA56f8=1uGv;4ROZk5P4itzm_ut`^6arMFHEkXh}145Ba8gLIG)+rMH831NL3gT+c~y?-5h$Pp>Arv35>W(%OlEzHd=%#2bj&5~1%lMT&{jf@gg zOp?+Plg&~M4J=G8!5(j6T>AXWNpLbt6; z-)7gItkXgQ>3>g49cx{&?)IfQTl8l5rb2?*g4s#I%see6Imr-czJ+O`MPh17Qi_pf Qa*~Nrs-=ZViW$(00RNY%GXMYp delta 513 zcmbQqv5sQ_lk6H6rIjokOahD&8!pay``N&P(Tk0Xg@Z+kA!;JaWLYN3dM-aM1&c&; zqomZNB$JdROJmDa17j1TL?CIJl9H5ao|bANz#t`X( zEj7{D$Vh-mN`Q;GBl-0P`?oD^UnH~hQgf69at}T@E3x6e>7~0XwEX`qR?;~0`urUh zBks!JY@a}P*PxQ}U<(GR21c$LCC87xEQh{&0gt)7 zT+v(#Mn*;{CKd)3NhyhmDamP;sfmdumIfAS$>zq!$wnq70?bkZUQr8nf2&?KA?;T1 zsc$@fCzS-0bUirsuDbK{)shMQ$BhrUXl&nf`WuT8XQ``mV0dY1sjCGOFi;v9x$2cT z%Q90^L2fW{Xk_welmZ5XySvup^~@3hpm;D(Nis7tO*J($PfJNoGE7W1voKAxNK8#h zN-?rbP6Ee+-gVAt)4jefUlN(hr8?pLMJ0jSZK+Sw|DKjQ*1BTd?MrjEK;i)aK0mdi diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_sms_04.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_sms_04.binproto index a4e7da5cfc4096a4d0803ad99ddc65e92e2f4989..e60ec3b028e68804fb566d7e9d7a9b119f032e89 100644 GIT binary patch delta 90 zcmV-g0Hyzq1&#%5LshAY1Lhs_V{u5gPNS; w*cj-xrRxGhAT>EQGc#m1Ib=08WH~uzHfA_CF=jY8GdW>7V`VaAI2r&L0l~#0hyVZp delta 90 zcmeBU?PJ|w!xY5j$E9GAXl|60nv`Ucl4NOYnQCBcVw4CZO;b{mQq9v+O#~RE1a6wd u--+6IzGwrx#Y5Hi#RW diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_sms_05.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_sms_05.binproto index c8c79fa7863e555bd18ac4d5f0f301e231d191dc..e673f1123c4b8e8ce6890da39af31f4de32f1a85 100644 GIT binary patch delta 464 zcmdnOF`r`rliXYurCBT-OahD&n=j6J``N&P(TjtNje|vtiGwk!VX_>PTz!@gmw-uD z{LdQ0rb&DAivLegI`&IQATrrD^J?tOZ$AouG|!sz=!V3LZA)J>IVqT0ni(6Xm|3Qn znxZ^9SQuL-S|+C&rC3NYNH9uGX5^Z{sKl9>o0y)eUyzq>#p~)E7+zXh z>gwj4>s;tCiOXZ1RFsTQnoow=d9U^-a#Skr#_1hWOu;}+)T7G_2%mS)MR#>s}}#zsbo zDJDs2iOFWEh6WaG0v@siBCiAp0uTWhv(cRG^DsC8N(c%D2m~qu2mxA^lO6&de+o_t zAUI(+GGb+7Vl-r8IWswBFf%kVVP!BgHDqLBWjAJJG!Ot95ZN?e+*+~Ea(~7650~i4soB;}%0U`-$ZDD6+FK}*WIthALS4MGR zV|sT$@)St)7+M@mW=v={R&QZBe@;nPKX*<>EpKm3Ejw31SU7Ka3S9~yHe_QlWiVr8 zF*sr{WM(rpWHMxAVK_2jG-hUHVKXu^5CR$y3Im8^>##rVgogAPYi?z1A`orC;LRAY z-!;(AT-G7EWAYfMo`MN)KkQ#b$`fB_18A_-x2WNB|Ne{FCxIt*lb zNK8*}YfV~EZE8S{5J;U33R?;wGBPq`G&nFgVq{@qWMgJIWnp17IWRb8V>dH1V=^=} z5Ca+zN?M@1_Is+3X4+HA_6$zRA`l`iNC>^E-1+LHkdMbR!bB*yvdi`aG6{7>Ls3_C zb#+BJ0vG`rfdLACA_;bB4P<3+FKuu%K!E~Cff|#q10D* v5C9qwF4qZ`mrC`gq*-MOC6MpYA`pGHW#wo6%NoXosIJ@6oU|y@il?aq85LshAY1Lhs_V{u5gPNS; w*cj-xrRxGhAT>EQGc#m1Ib=08WH~uzHfA_CF=jY8GdW>7V`VaAI2r&L0mttmng9R* delta 90 zcmbQjI)!zE6H^eEAD4nfqPbC0YEqI(N|L3qWvYR(iBTeuG)+lKN;OYQH4$Kt61Zs+ ueNytK5` z)y+BAxzJ$}m&ZD(C>ftLpA56f8=1uGv;4ROZk5P4itzm_ut`^6arMFHEkXh}145Ba8gLIG)+rMH831NL3gT+c~y?-5h$Pp>Arv35>W(%OlEzHd=%#2bj&5~1%lMT&{jf@gg zOp?+Plg&~M4J=G8!5(j6T>AXWNpLbt6; z-)7gItkXgQ>3>g49cx{&?)IfQTl8l5rb2?*g4s#I%see6Imr-czJ+O`MPh17Qi_pf Qa*~Nrs-=ZViW$(005sI8Q2+n{ delta 513 zcmbQqv5sQ_lk6H6rIjokOahD&+b+&|``N&P(Tk0Xg@eV2A!;JaWLYN3dM-aM1&c&; zqomZNB$JdROJmDa17j1TL?CIJl9H5ao|bANz#t`X( zEj7{D$Vh-mN`Q;GBl-0P`?oD^UnH~hQgf69at}T@E3x6e>7~0XwEX`qR?;~0`urUh zBks!JY@a}P*PxQ}U<(GR21c$LCC87xEQh{&0gt)7 zT+v(#Mn*;{CKd)3NhyhmDamP;sfmdumIfAS$>zq!$wnq70?bkZUQr8nf2&?KA?;T1 zsc$@fCzS-0bUirsuDbK{)shMQ$BhrUXl&nf`WuT8XQ``mV0dY1sjCGOFi;v9x$2cT z%Q90^L2fW{Xk_welmZ5XySvup^~@3hpm;D(Nis7tO*J($PfJNoGE7W1voKAxNK8#h zN-?rbP6Ee+-gVAt)4jefUlN(hr8?pLMJ0jSZK+Sw|DKjQ*1BTd?MrjEK;i)acMr9} diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_sms_10.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_sms_10.binproto index 99573e0ffdc02021c4d7a9428b37063e8077b390..0c79ec802c835b72179602482d1341a0be983ac9 100644 GIT binary patch delta 90 zcmV-g0Hyzq1&#%5LshAY1Lhs_V{u5gPNS; w*cj-xrRxGhAT>EQGc#m1Ib=08WH~uzHfA_CF=jY8GdW>7V`VaAI2r&L0l~#0hyVZp delta 90 zcmeBU?PJ|w!xY5j$E9GAXl|60nv`Ucl4NOYnQCBcVw4CZO;b{mQq9v+O#~RE1a6wd u--+6IzGwrx#Y5Hi#RW diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_sms_11.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_sms_11.binproto index f28515adfe4776e1fe17a05b9199b9acd75fb27d..8b0d759560c7e36c35413111705a0afff316561e 100644 GIT binary patch delta 488 zcmdnQF_&Wjlgw-ur5P+7OahD&J1@?8``N&P(Tk0Xg@eV3A*x}r43k`amJgSJNml&N z8pEbZd-IC_Pf$AcOGqFx**5cP?96XJ3V$@un)B#}#EWf9Uo$x=m|B_{8>g6ArkI+h zSX!o;rCFF8rde1RTP9j2ry8YLNHIt-N=;_un!u>UnVFlIo~mDvmu|)D>KqteT3YJr z=A7$X=rD=PW1Uo#j8B?RhS}t;Oyc!fep~{#O5__w`2H2xq^qyE`rz{xA%UCm_ZUNN z8Xw}7VmWtHW#(6jXJ@x`vRE)UDWq7Mrlq7B7@C@-SQ;BA8yTb+CK{L|r>0mMnE+j7 zD#ajG#FeMSnOK^VnXjK)U~I+d=Nj%_?_L&|Z;rGw1QaVx_g-zm7fRh?H2Ob=H?b=Mk$tN$*IQ4hUUgbMu{mV zNok46W~qh-7N(Y9kGC*#H3B_emYI?Yvev}mrm)8~W}r{q-L=wmbTjpGbo1@qRqE`c zO3Vv9{0wbNT#bP)(G|$d+8|Z>Z9=!LOW$VKo~+YC0_lHGOC4)nvF`SzIa~B*_@+W4 Xz=GLHVe&g>2`-~lOAC_}GoViaOU$ZG delta 522 zcmbQsv58{=lgtJdrL`;^OahD&J1@?8``N&P(Tk0Xg@eV3A!_Pm878@UEi$rsy zq|~G&lawS&W6M+nV-ur9AZePCl9XzmmTDrvASH0qB>qm+#`8rR*exEazAr9N66h-0 zx7&B8E`GA=vs$6Mp)!ma>a5fn585erWz!t7+NG5 zq@)3zVw94SXknCSl9ra5Xl!I8z$7KW#oUqndV~GjmbNdF*?FlsN&>kDADorgaNqRO z-4$B?{}wB0oOylz4vP_YWpK7npu1~ONqMjZgH!_}SB(;9VrfcdzJ7gffw2`&N|lF? ze}1-aR6uT)L!W@hTwbndE(IeaqZAVh1B;}T#Ke^3G|SY)L=#H`i?n2OW8-8a6B7Yu zDFLsj1-rjhubPl{EBMqm9>0@H0!q3b9D7&Y`T1(eg#P2khg>waZ#w;r#fY=i)j2S{ zw6xUKf(aN#jf`CNN}OexyeX;q`nd%r4vkD6jZ%}>GRp;kV#GWp$;`|&)zr*9EhRb0 zFfrN8!Zgt$F*PMA#mF)_2^=GO*Ey$6_xiegNn|RQ>V)?fl>}xy-^ KFU{Eki4gz-Ik_YN diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_sms_13.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_sms_13.binproto index 967e11b2896172705b8fb8336d3358493d8a1c3a..a1765c9a5546a42fd510c398a9393d11b039017d 100644 GIT binary patch delta 90 zcmV-g0Hyzw1(XG_LIP51ObQS*YG3($F@lo4Zgc;TBF6d>5LshAY1Lhs_V{u5gPNS; w*cj-xrRxGhAT>EQGc#m1Ib=08WH~uzHfA_CF=jY8GdW>7V`VaAI2r&L0mttmng9R* delta 90 zcmbQjI)!zE6H^eEAD4nfqPbC0YEqI(N|L3qWvYR(iBTeuG)+lKN;OYQH4$Kt61Zs+ uex=g|#`7u%M;W^z(6wKOv}PBF7g zF*QxGv`jNgvoJSIv#>C>Otef+HA=CNVvt~zn#{;Gfl-MwGdD3kRlguF-HO-MIWWAm zwA9tjIoG++VG@_eI;kibpEREgv&oy8#Ot&CxCCyM$Ty1c{VT9ZS6^}U!RIYP0ypFD zF^1eUKEx}sv0!jgNU=0cOGz~_G&M=FG&W8)GDtB@G%!g{O|djG z0lLamib1M~D^H0tu{0$!Uq83N*oxE7HQc?(v8u?!;W~%MX*rOMMmJpZ3e=OmcGh=m zzx}t%(?dw0y&~ym&f|l{N^8A;9ecrf)(h`%+QVk6(OfA74Z(-zW1bVzIGbI&dt%<`;VUKIfK%ct1Yo+PvX6ohW=G(ig z)Y(Usm=}2X8QPY(8UtOTE0CGBL8|oIgl=1xzRj*ZS*L{r(*K^8I@Y>k-R(09 bO@%~&1+$aFBFkiXCdqm(KQ0A} zM02C0)TAVnlq5@I%Txnn6Qe{RX_}Iflxm)qY9hcOC2-Ru{!Y}!^Fm}-!mVrY?Mkdg+p+bAU^(ZVRv zBrPp9(b&jHfJsV#i@78D^#=R5Ep1;Uv-47Olmv1QJ~%6};lAmmyDPN(|1DP1IP?1a z9Tp?*%HV9DKzG-mlJZ~+2B`){t{NrI#L|?^eEr-4V=JDNDi0t3{A}N-fZQyHzIp+V zxx8G_Tna`;Mkyv11{O&viHRx6X_l#pi6)i?7HP@m#>UA;CME*RQUYF43wD32UNs@@ zR`98BJbovY1eA0=IQFi(^Yhh`3H`^754mV;-*oyLixFq3t8-v@X=$me1rsn(8X39j zl{m{XQ&K^0FmY&P@@SL-286r2*5r-M5&@uiFi%M`Gc!#!H8W33Nlr3MOg6JHO|(c% zO-V{IvP@0_$AjK=&S}%VzAj%9naZU);r&G=f!b}UPt*UNmO9qDV%_aabGAU@0RZ~( Bwf_JB diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_special_attachments_00.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_special_attachments_00.binproto index 7fa0b801e72cac97fc0786e43ba1bc1993b48763..04fd57b73a788686116060ab3eaedfa00df8f061 100644 GIT binary patch delta 144 zcmV;B0B`?^1)2q*0uPu0B9#FM0uTfkz4fcuv6Bx17IkzQatdrB31M|)X>TuWa5HLM z3J^9BZtM-F2fyf61mxpq4|fs}6rWk0t52MY3J+nEwEz1h7?S$(o&q8UXK+bMad{{J yFxH6pTuWa5D-{ z3LrRQW@chyHaIspWI1DGH8eCcG-6|6H!?FcHeoepW;qZ58W6p1bN`Sc#`n>1R90UC4) za3Tq5ZDD6+FK}*WYGDcx6+>3|B8=fU2E4QY@-c3#5)cgn&JnSuV1_lN>uFS0&nFnm zrkafcA_`+fX?HHZV9gGc{o~Wnwlt iH8eFgV`efp8UPRiG7$;{@Sl=^5CIsC-s6djG#~*QAV84- delta 158 zcmV;P0Ac^E1(pS%0)LbNB9Q?I0uTfknu+zJsx(3l2;R*9!^JTWqWpx>n>1Q<8ea-q zA_-}2VP|D8aBgP`P6{A1GdMIkHZf*3GG#Y6GGSpfW@I)tIbkz1IA&rtWMpIz02&Y~ ze%-5hX+x5d-fJ{@)40(h5Hp09A5!OXs!!Hwqd5C*-6-L-(if-(5CSq03Iy<+~>i_@% diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_special_attachments_02.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_special_attachments_02.binproto index 062e6a5bbe35c22bee1bb8aa655c6e0f220714e3..5d477fda48f948ab9f25a69281863f05a1646493 100644 GIT binary patch delta 193 zcmZ3&x|4MQQ~h>Er7escOahD&`@gQfvC+hfjf;hYMT#M69-~wlSAh~|S!POVzJ6|j zNme44z}K`UcY)-b7we@xC%OEoRuvNXd2fEo(cd5b->;g|b=xStQ)2VNlmFS2xZG3R z%BxcIJo8dD7z{4WIp6r%&`BZ9G9}eA&CDd(G%YF3AT2E=&B{E{(!?S$CCS*x%-q6K nia~%`g3(Bji{-=oNew_p_1=5j*=?c#6`I&9z#`EH5n=)Ws0Brk delta 172 zcmdnVx`cHBQ~e@FrTL5;OahD&vpc^oUS;CN#>K+HBE=BZ$tab`6|KZsmYI^8ub*3B z!sW-MV31^#l$v5;X_07QmXu~{WSnYlnrfPwlA3I00+cfqV2~2}G{Xur6Pv5>t;a1f+`)27676E1nMk7^0E|w4TCp7@=Uw`4y^U0

4^=kRrzVZ?3x)Sz|qEA`pxJyJ&dX%~V56%5pSnU->Bf@dxma1P}oj0Y4isIsgCw diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_special_attachments_04.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_special_attachments_04.binproto index 2d75c320c03ff04466edd4bb1b14ef3848086a99..f58d3d1d743889102e4f2d6b1e061a795348ac95 100644 GIT binary patch delta 179 zcmV;k08Iat1*-+10)MFiBBlWd0uTWh!S$=yu{25z3JVAX5U-uerK>R_09uIw8gvS9 zA_-}2VP|D8aBgR6VG0lxLss}AjNv#2ytDxFF>b695Dfy(5wWIVhBc+@X;fCvCm747 znvDV?3S&fRcR_7gc}Z+205JNsj`Hj=LLe|?FfwChF)?B>VJtQ_FgP|dHDNVnVm3K7 hG&MG3W->P#01yH)5efwGpOSzO0T_+mR_09te!UkY0y z32AL%XJs#NZf6Qk3LrBxI5asnF=jO~Wj8l6VPQ08WHvTAVKXy0W@0vEWMmKk8W1Xe z-K%(MLz0r-YczS&xX~gIGlZ5OQs;82Pu6LpIQwngDB-lys1^ng0x}T_1n{4dfDi!~ Luh7EhlQkd#SSmJ~ diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_special_attachments_05.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_special_attachments_05.binproto index 038e13d06b3bbf0abd985bc03042f1f0798342dc..0e6b09b63fb8d8f4e3c27de7c2071a3b54250d51 100644 GIT binary patch delta 195 zcmZ3+x|?+YQ~gdxrEQEHOahD&hrX`9vC+hfgNu!WMT?1pF=`&8R2f%+5@%UvN@~7- zZh=WwBA39|v?h0f p!cvMsfLVgkNRW%=!~97NKxg&dd)(P=q5u_|*ek#y(FYM?0sz(=MZ5q2 delta 174 zcmdnZx{P%JQ~eS~rG<zDeO$)j0cR=?@kGW(jphBS9{f5A!EA09~;D!lCDr RO%TuWa5HLM3J^9BZtM-F2fyf61mxpq4|fs}6rWk0t52MY3J+nEwEz1h7?S$( zo&q8UXK+bMad{{JFxH6pFE5WQ}5 t|Bxca`fskg6SA0tf+Gi2)jP z3UDF`X>DO=WiN1UXKG;z5EVmK_#%wqI0n450P-@h+hFk~ksyV^W$ delta 159 zcmV;Q0AT;E1(yY&0)LeOB9Z|J0uTWhpo#UPsx(Ru3JnMZ5U-uerK>SA0tf+GbQ)g@ zTOtW*ZDD6+FK}*W3Qh_jGc!0eIW{q7H8N#4H!@*iG-hNrHaTH4GdN~qHe_UE5C9qw zDt_IocxgkDlHO}HdDFPjA`ml#mLF2*a;i_(X`?v%ZQUs0v>4K;1`q-=5efwGpOSzO N0T{2)!snAUAOVC7Hpc(} diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_special_attachments_08.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_special_attachments_08.binproto index 46472cf69f8695cd144e8500564195a656bf06e5..ec545d3094773660a7689301b9ac8f8da63a305c 100644 GIT binary patch delta 193 zcmZ3&x|4MQQ~h>Er7escOahD&N58JVvC+hfjf;hY#fTwl9-~wlSAh~|S!POVzJ6|j zNme44z}K`UcY)-b7we@xC%OEoRuvNXd2fEo(cd5b->;g|b=xStQ)2VNlmFS2xZG3R z%BxcIJo8dD7z{4WIp6r%&`BZ9G9}eA&CDd(G%YF3AT2E=&B{E{(!?S$CCS*x%-q6K nia~%`g3(Bji{-=oNew_p_1=5j*=?c#6`I&9z#`EH5n=)WyM;xr delta 172 zcmdnVx`cHBQ~e@FrTL5;OahD&3p>9qUS;CN#>K+HV#E;D$tab`6|KZsmYI^8ub*3B z!sW-MV31^#l$v5;X_07QmXu~{WSnYlnrfPwlA3I00+cfqV2~2}G{Xur6Pv5>t;a1f+`)27676E1nMk7^0E|w4TCp7@=Uw`4y^U0

4^=kRrzVZ?3x)Sz|qEA`pxJyJ&dX%~V56%5pSnU->Bf@dxma1P}oj0ZaKXSO5S3 diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_special_attachments_10.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_special_attachments_10.binproto index 475a56f7eba8b84056ee0ea85327f5301f11d1c1..1a8b492bc3e89c40fcfaa673c4cd3d67aa0ad239 100644 GIT binary patch delta 179 zcmV;k08Iat1*-+10)MFiBBlWd0uTWh$Mvh&u{25z3JVAX5U-uerK>SI09uIw8gvS9 zA_-}2VP|D8aBgR6VG0lxLss}AjNv#2ytDxFF>b695Dfy(5wWIVhBc+@X;fCvCm747 znvDV?3S&fRcR_7gc}Z+205JNsj`Hj=LLe|?FfwChF)?B>VJtQ_FgP|dHDNVnVm3K7 hG&MG3W->P#01yH)5efwGpOSzO0T_+mSI09te!UkY0y z32AL%XJs#NZf6Qk3LrBxI5asnF=jO~Wj8l6VPQ08WHvTAVKXy0W@0vEWMmKk8W1Xe z-K%(MLz0r-YczS&xX~gIGlZ5OQs;82Pu6LpIQwngDB-lys1^ng0x}T_1n{4dfDi!~ Luh7EhlQkd#X393X diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_special_attachments_11.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_special_attachments_11.binproto index 474bf6df3f063cea280b9d71d661af2fa19e955c..fd0286e9b5b5423691b0179e20cc429d2b645399 100644 GIT binary patch delta 193 zcmZ3&x|4MQQ~h>Er7escOahD&C%&$}vC+hfjf;hY#fc$m9-~wlSAh~|S!POVzJ6|j zNme44z}K`UcY)-b7we@xC%OEoRuvNXd2fEo(cd5b->;g|b=xStQ)2VNlmFS2xZG3R z%BxcIJo8dD7z{4WIp6r%&`BZ9G9}eA&CDd(G%YF3AT2E=&B{E{(!?S$CCS*x%-q6K nia~%`g3(Bji{-=oNew_p_1=5j*=?c#6`I&9z#`EH5n=)W$JIr_ delta 172 zcmdnVx`cHBQ~e@FrTL5;OahD&OFF+UUS;CN#>K+H;=~Zu$tab`6|KZsmYI^8ub*3B z!sW-MV31^#l$v5;X_07QmXu~{WSnYlnrfPwlA3I00+cfqV2~2}G{Xur6Pv5>t;a1f+`)27676E1nMk7^0E|w4TCp7@=Uw`4y^U0

TuWa5HLM3J^9BZtM-F2fyf61mxpq4|fs}6rWk0t52MY3J+nEwEz1h7?S$( zo&q8UXK+bMad{{JFxH6pFE5WQ}5 t|Bxca`fskg6SY0tf+Gi2)jP z3UDF`X>DO=WiN1UXKG;z5EVmK_#%wqI0n450P-@h+hFk~ks%}P9r delta 159 zcmV;Q0AT;E1(yY&0)LeOB9Z|J0uTWhrit~Vsx(Ru3JnMZ5U-uerK>SY0tf+GbQ)g@ zTOtW*ZDD6+FK}*W3Qh_jGc!0eIW{q7H8N#4H!@*iG-hNrHaTH4GdN~qHe_UE5C9qw zDt_IocxgkDlHO}HdDFPjA`ml#mLF2*a;i_(X`?v%ZQUs0v>4K;1`q-=5efwGpOSzO N0T{2)!snAUAOVu-Hst^S diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_special_attachments_14.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_special_attachments_14.binproto index 0c343b4ee86e5ff6f76cf7a7870b7c3b40a2b2ec..d56316ee106321ae33fb67112d05f3e59bbc6627 100644 GIT binary patch delta 195 zcmZ3+x|?+YQ~gdxrEQEHOahD&r@yYgvC+hfgNu!W#fyo9DQX_0R2f%+5@%UvN@~7- zZh=WwBA39|v?h0f p!cvMsfLVgkNRW%=!~97NKxg&dd)(P=q5u_|*ek#y(FYM?0s!&BMdkni delta 174 zcmdnZx{P%JQ~eS~rG<EzDeO$)j0cR=?@kGW(jphBS9{f5A!EA09~;D!lCDr RO%K) zZ?dJG&on8Z5)he9DN$+jbwx^*m!0nn>CzakgvfOw1w&+6S9vG^Fv0M+n)NY4AUQcS kWHLE5F*Z47GdDFfH8f#4H90pqWMyVBV`VvHG8zCF0sRXtMgRZ+ delta 115 zcmV-(0F3{a1&9Tp0tAKuB7>6z0wH5!8ej@sA_{43VP|D8YH(#|3Qh_jW@Iv9VK*{j zFkvt=I5;*lWnyA5GiGIEI5apmW;8K55C9qw33nE6)B5!u80QDie6&PiA`ty5rz;8r Vh-2%pKkbBu^cg71waWAc7y*=FCLRC) diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_standard_attachments_01.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_standard_attachments_01.binproto index 0288b4861e74f50fdc5dc668a03d38908b30a798..04d9714a5970008d068caa25b979db05a6861c3a 100644 GIT binary patch delta 330 zcmaFHF`0b|HDTO1s45jxj5S->I2hcWhNzs zP%cL$&dl7z^i=(VymTwBWM|*h)U1rW;53IN@*cC9C)Y43xMnd(F(?UaxO?KL^Lq!b z4y~}~5;<$0ORZz%TFD60ot~Ly#gXoopY7w}lj|^n+vA-?5KpOFL}fvii%)21w)bRv zX1V&TI4*(St!2i)LYhCzS0w4I_ZGb*ByjkU+8rgi{x_ydOP`$8pU5lG)%WKxvl6Rw zN@RGY2D8Dz4?AXkHMC%IQb;yVHZn3x0TPC(7HO%;#->I_iKeM0$tgx@mWBo?QVbG| zQbt^IN}P$MDVh2Dxdp}!e}z4!3I?%o3lE``N&WkK^8%|A&tn3M~55a&fjv)M1v%%1lb; zCmFf6Fe-6o<|d}6>KEjtYYC_?ZgX9&8*Ztw(CfC|gb9TP4FXnNzA4^e;n~IBsd)~| zI6Z!dPflf0sOL)HQZO@1Ni;Q1PE0d1NH$4LwlpwEGD=BJHMKA_Ft;!@Nfcm`5}3N- zoAs3w5}s{soZ?qQCI2c3q}>WW^^M2xB*UhAPaD}=y)@RXy!wpUh|jUA$Rje_EyCB| zsW8{sfED8MWwP#|^vjrWh`UzJ-o~$Gwy`QhGQ)9zqOXFmtw4@Y^L?gpA19Kx&W0MrqG;=faq{PHj0R}07>g7r15uSF^8`OGY zSERq#q9hP3Gx^Z(8;j)GRZXsbPv5mp7^E1K1UB3~an$*}16PMu*mH@THP5B;xw4V8lx-`MK29YwGm5?|EKcl33Srq7>#>2DoD_ElpC4EKLo~EYpn5O-)Qq z5-m+F%`H<>(+ra9Q!P`Bz^)DDa#Z4kxV9iK9XY&!&IP(Qh#^YGC(S3rEG$3K($6#8 zzTD4EH$UG;*E-xW!Xm#Chey^ia;*eL1jOL<%rvA>n85Avu3jRDr_?Q?vLMUFCp0wM z8)%2SyH=WxZl+$2Zoa*{N}YXFiFtvCpP_Aut8rEwmq72}5FlkLWx1jThp#oHBVy^&;#8ik7695?(P<_wi0JqW=d+l zer|z@6_;;{cUX9Kv3F|T|+7=idHF%o2=Jiy6847?rp(a}(23^|K06)3pTD7q_{t z)(yARSm;9&6R_rw3}N&-FeWh371^fYK=={4~-toeDqRGV*T~kO3@rs1qy#w2#quxz`YI>!oc(;w7MDaNfxlYIwYiu(l3#DI yf7{abMN;F`)>B{DBp8hZxmZ5TpVR=e4=kByssI(6*ek#yF|QRY!~_5gf!D$S diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_standard_attachments_03.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_standard_attachments_03.binproto index 899e0c42dfae28183f1104b48ffb57dbf59d0cfd..e8ac0cf4365e38076652af43b4e1d6a5a6f898b5 100644 GIT binary patch delta 98 zcmV-o0GZU)l@U@0R9A3RRYg>402%-y5U}0I#Y68v3WzFJ=NN3P E=d{=$CIA2c delta 252 zcmV(8 z0xy5b0SdGMA_-}2VP|D8aBgQR5GSLCMXN1WIVhn@+b)ohaWH@oItoo>OIBBFb4z7z zK&A;u_!m+DS{zJfOlUS%Z(%u3NmoC2PDU+nZ%i#aS3y`fZ+Qw}3LrK%WMMTkV_{}C zFk>`jV>vJ|Vlrf9Wi>c4FgG|gG+__|8W2pCu=YFD$QVh6h6xwdRT=#v5N6s_%JvLS z$pEt6<$(uaW C+EvE@ diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_standard_attachments_04.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_standard_attachments_04.binproto index 7c3c1dba847e94cfa12e46d167a02b1671303fcd..4f99799c64aca6f05ea3cc2ab51ae226c02fb17c 100644 GIT binary patch delta 393 zcmaFKK9hX`ll^pNr76rDOahD&n=a0I``N&Ymy4T&MPU8hQ%hGHDltTTXOf!5$TgKw ziL)#-B{g3^x4^`TE7{pMH8m?EFF0*-1G8LxRt%TG+mqA31VrodxVag-#BBVzOi18a z!sg$v`sV*HUpDdk`+vG$CEkA7*TSO2>YNf8Ua7%kaPY&9SzisE6jII143dn~l2Q{b zQZ3Wc(#*{h%`6Sm%v00SQjJp5Or;nk7^OnE9F({+a}(23^|K06)2%qt-SV@2JbZE; zmdMw8%w`T^h?4Q~3eqt%OVz7$t|(RY$@lTC2{uwS4iERtFV4+kkYZ30*l_p6QRnv# zTpe0r&n0r!JeSJn%0@OeE1FASc~@}O%-8DE^EWM>d)`EIfsnvVU(LYG&!w(jQ>V{; z&-3z<#JZLfr7(Xm7#y^Ndc@MwB*nZ_&Dh-3#MC6w($v!2G9@+5AUV}C#R%jP XBS9{f5A!EA0K6pwni-Au delta 474 zcmV<00VV#K2k8f(0)OWNBIE-I0uTWhveBIF^Ds&c3JVAX5U-uerK>R_09wZb8ms{d zrvV}fX>DO=WiMxGW;zIHd3JhJMowoyjRQ#16H*LJd1rNWXL49ZOi)u=985QbjpqFl|-0(I1M0*D3|j8!~rr4 zSyy>kP;P5sS4l!hI06^}8j%4CeIf~Ab!2I8FKuu$Di9~5hDEC_S2-x5O4}}wkZ~}8 z5J1lnNbL$z1%E+rLuOVAP6{A3GcjX1Gh;GlVq`dBGBIW_H!?LdG-NeqH#Rq7VPRzu z02&Z`r(!o)Nj@8}CX8LEXXvyd5K|nJ!u!~w9|t8g)%Rz*t|-d2%Jc>z5R9K4Snat< zFopz;HH$zzv>I;;Ya$7DX=G(@FKuu%Itoo>OIBBFa|26dZj(O(9!nB53J7a-S3z2C zY)2vx66M!0!@?%qA|8+IH6o?tDiHN%f=3WzZ0N5WNs>hTdnGXZ-oKIq7y&X73Iy<< Ql7J8a7@dW{q@Fb(0o-S#!~g&Q diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_standard_attachments_05.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_standard_attachments_05.binproto index a6c6e3a2f843c780b7500bb1e1872cfdcb6ca404..4df88f857c3379d48acd2c1c45da75c0e75f3e61 100644 GIT binary patch delta 586 zcmey)Ihk_-lk7xRr9M^;CILo?%@^mq{cPaH!NtbGqQ%6)81;>1vMiI5LMWG`5@%*^ zVtT56L0-BQSF*EjYHC(SUT~Vj5_yl=%#&?d6za1Wq!^S0HrzdN)cL&wSBF;EbBUZa z&!yHea;;>9=}yl~v*Jj1%g^@l@X2+U!0qu)B8aEdEuyj@%f%-&G}}8$#>d@VD@{i? zQ!ht1-`-uN&OWNdyuicH(6+?YI4h1zpm%GT@vo5P&+-*XI_tefF9``8KBRU>Nv^*C zjj7VoCuj91@=A2|{W;96#Oj<98D6QuY;f?yj#*y~Ets4Xl8uv%jLcGigkh>hT57Vf zsgY5lX{t$bicy-Sp+Slig9M|L5tp12XJTneX1;!Ifw9A1VUMYTLF^&n1tFoXAvk+-m{8N0-6{JBg>;90`v->>@S|1V!Q@%#IKx?d&Ue%aT;0`n6S)K5+dsb*#d zNyceOsn&@Wsg`MJY3AmMW|oF&=Ba6EsYWSjreH6Ha5*S(K_W1#AT=E+4j}PY%A{a} l-DgIETr3~vPig?Bjw$CBbUrauV1x)w>=j^DeT+(6 znYoGSsrp$3sp(n*>WkZ4SL=pbYAp1+tv6vpp+SRy6-P#8Syix`U%JCGPLChrlg(Ka z>V>Si*gRaayz`s{m?T=4oSd-3L`gtu+H>{;Op(Xc{I)vQ{#LlDC7`EXc>CCV`>^vf zP+l#Gw3uT^c3lZCx*eVmV8ib<@$US76$d{L>VeSV6NEf+_2Nw{NF zUXHr}v&8-8+3WTgDhUV`EVyI$VbiwqD-YhSH!ft-5-41v`JimaW&1O!Qym<#H;Eg( z|FvQjiv**T6_*;!3F(<>R$RU*-eKX{#onoT4(A0u-f{)8I_5j4g-J0e3DjeFAb~3e zIV8FKxD?V-j1m*gjgkx!4U8=;%#2f$k_?Q~Qd2BUEX>kO3@rs1qy#w2#quxz`YI>! zoc(;w7MDaNfxlYIwYiu(l3#DIf7{abMN;F`)>B{DfX+L~$hCzL>OgIMU?5?SEo5gy z;wzp>p`I&&OTo-6CDGJ4IWf)5AlW1}+0wuu$tWc?)zre!z}&*rBvF7#N?_`SZ`M~% zNO-ojaf)9JmHewDkajEh)Hfc#lMI{gJ#A!f_0m|k^6E2YBRnE3QvZbBRG%27G5SdLWQEBsaMM{;Io$n0k z(ipCU$aNwGLu6T3c_;ud!SJ}6^)W&qIXN_BGC4IdHaTW9H#IahG+{Y4IX5|EWo9sA LWjSOr8UPpp$jLX) delta 220 zcmV<203-jn1@;A?0wMGPBJlwT0uTWhw9%aH^Ds&c3JVAX5ZI&ZwXQWP09w?OAp$3V ztN{wA0U`-$ZDD6+FK20HItXZac6w7rPG>-k14z;nQVdLaXLWREa#%)8P*YkQOh-p5 zW-KjfE^IAtKSv~fKU#D*a7a!uJ#MBZaIa}Yz6j8B?RhFMsCqNSf_xP7^w zn{Ix-kFIsNV}wP1Wfp@JgOb38yC;r1zjxs3&tS4i_``HCc+_1>bFgai&BQoExh*Z;;;Y3Y-*`V)C2y88YcW>#W# zPKgY!)L=F^_+iJauZ9*(P72A!$wo$IDL}$7)gmo5+1S*`DA6?4Bss+>AkEUyAVrEn zf>FwdOHPS1u{0$!Uq83N*x|3R$5g=}_K@&`kWkkU?A|mI+yMcQE delta 496 zcmZ3;K7nHalS&_pQa1|+lK`W{){ArAem3yp=i=pH5m-O>)Y8?4Mob)xQE!+ht1#); zPh{k(RpLx6P07sH&n+<45>Q{<=DJ!p+)`tq*KNHC6ABF)1RTx_dc5TdVs*@SP7CAm z<5Dm+HcYlOPBuzQO0h^ZGE6ftH!?LgNij_`H#1L4OiUGEkP@g~o@5^3X(zowttWOx z`im_}0>Ltq5Byncbc90>)h4@ KOXis>FaiLQr?2<` diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_standard_attachments_08.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_standard_attachments_08.binproto index 8fae2018d2a1f585869e694dd4ea33303220032d..1db2c3bdff3675a2262188bd50dadedc9d27a042 100644 GIT binary patch delta 644 zcmcc1xt4PQQ~hdIr4_6kOahD&+b+&|``N&Yjf;hY#fTwl606iKMy{!hN}OexDXIDT zxdkRxT*=P9si|2RdBJH>GCnDu{t@=Lu_=Q1IIX9=5szv`R+zkJ!m@9+QVewBFprG8%vixR7IN@RGY29v?T z4?AXkHFQ!)H8V3vGEPfMO|(e0OiN2MH%~OPG)yy3O-oBPN=Y-7Vvt~z3gL24;>yfT zOi$I%Do9PY;z)PP&-U@~$#qyF?=hP>hymzCuOJ;WvsAr0=ZaEQpL`$RnqVVUrXU%h|e6DO{W3!^U1eSLNXU%-AK0SZa(z)kN zG#3a7%=Fa^%=}#H>NR!x-1j^$FG;LxIZ+Dp2Ls$6mX;mYQsAYGjmX wnrf1qVw7fSXpjPm93w$4mJjnMH2{;d6#nmQ~hmLr5mgqOahD&+b+&|``N&Yjf;hY#fTy55UW%JBUgTDsJt9^0cMH&&9m3-F;o%|Dp+vG?!%^Sr<1G42;uKQ!Gp@%+gE@Ed>~)1USpZ@-P4TDkt%r{d~<9mqaCjzgo++xtKeWUvIE~ z+tT($QsdOtQ(xGC&O6D-wS^JpKwubY38*h_b6u?)ZmF@*>$cv6355m?0w}It#_91x zJct1paA`gnW|LPki`R1{a4DFXr6igfCnu(v86=yeCR-X9BpIcorkYw98kk#{nj{J^ zNeN8d@Xh+l2?@`(Hcs)Yp^|@<1k!E=pZdn*camY#y{C=rtzH`IR$hI^Y{chSRpb$w z?H1wd?^KxUY=JFs)-ZA{hq$~R7`>pd<;bWks|t4W!xho)?pkR&x|w=8y7~6*Ds}cz zCFTVleulOsuEtz(TndIsNofYD7G~xq$%z&zKrfh@m{?kvCmCB9q!<}kBnmJ~2^2_O zf8+gQ`B&wZQ_J11x+g0MNbl$KZYw#}`(~=kjA{#Bg)WWhpZ*_VG~$U2uZ#@H%T5gU obn>uZl3+9v0wHxGa|i+u0T{Q@obB^4N)HMR2m}z=qwBSTuWa5F&t6G)X2QU_F5a8y-ARB8Yk03r~u-N?m5??4KODpuzhY^>+y CoFKIT delta 196 zcmV;#06YKo1la|k0wmV~BGds00uTWhx6z#K^Ds&e3JnMZ5ZI&ZwXQWf0tf+GwE>eM z0wRBr0SbL031M|)X>TuWa5E|pC!>Z%t1VYKD4|N*E|8FMFn|z1&k;!N3Q`3@Z$oBQ z3Qh_jH8U||IWuE2W@2PGVKOmhFgG$aGc;s1W;ZrBVqsxr5C9qwd#7SISV=w`uqKRM ysAuT3A`nv?lfwJhq8|q(G}ZTKx~?e7waOIq1|krQpB-53xk)gF1dTO|Ks>ba$wX`b diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_standard_attachments_10.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_standard_attachments_10.binproto index 113829dbdd5d435f046b1363ad253a1c0c9c3d16..1f4ac06de0e631d9c44bd9152d86b93efefd0c33 100644 GIT binary patch delta 394 zcmeyuzK?wYlj0s`rJc+iOahD&J1)+7``N&Ymy4T&MPU8hQ%hGHS}{b;nXJg9UO$VG zYbv7>XIW-SYQBDMfr%AYva@e$YF0*Ga9Wg%Pl~61guS1uWu!?+T|rPlP?oDYNf8Ua7%kaPY&9SzisE6jII143dn~Y?D$GEmAGh($dV$6U{6Q)67%T(o&65(oCfo zBp9VaxEz$YGIJBtQ}we7Qq!$C(%tg2eLQ?}9hS&@%x0eao=KrTi$RJ(Nnpd>6Gxrj zJ8*Sqg*}(ZS@T>fpDP<#YgROu!1Au(teLOXr{`~4I`_PZ<^mysnZBBVnV(Bty{1l| z`=00JC5d${CrV+CWq>=@($XZw$kNo%%rec`+|B+=5;(%dp7HO(MdI@L182;^8J WK`xdL^CvX`1ANN41)Wa}6&L{v`HwXK delta 448 zcmdnT{)K%3lj0|4rT5GnOahD&J1)+7``N&Ymy4T&MPU8hQ%hGHS}{ajnykpAUZ2mE zt;AWDnUb2XpIcyJ#pRpg9TuKl?46nyCF7Ig=^tV5=V}>g5>i(X6cCiuxVTQl?U(E8y7NZ2^22Td{DOIvi+IV msSXa=o5T&?|5~w%MS{^tkc;KR{7DVKXqwx4V97jF1x5h;hooZw diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_standard_attachments_11.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_standard_attachments_11.binproto index 47197de1cf0ce9b598eb684915d76ffda465031c..e404cc7c7cbdb01c802c77140c57e9e3a0d137af 100644 GIT binary patch delta 612 zcmbQkHIH)vlk^-`rJ1Z8OahD&J1@?8``N&Yjf;hY#fc%RnRT)>lfFVIm!lGAW^Q77 zs(wLUx)oQlvu|o@Rz_ZMn!^%#kJ-$V<(U=gvlyfplms^1J#p0ey#rT=R@ifioHfs- z)-iIeWQ6HX&rGx8NO#N6_VMt^b(p~I@lGO$r_?Q?vLMUFCp0wMJ4(jK-CZk9M>kV1 zM>pTzU8T-Gs>Hm&!_UyR#ML+}j!U3-Ynkz{kmk?w6-hely+tnx2^>D8c1KCBzW z($Xhq^(XR5boKo?%&f%foDvycsljY;@WYN-UkxpooD`CclZ}kbQhjofp{^k~d^wA; zo@*-5n`N0PsUU48$bkg(REnp6guS1uWu!?+T|rPlP?oD#Vw9L@Zj@w@Xkct%VP>3~lw@F>mYQN=VqunMVrVJAASJ+A zE|!1!*H<}-=j`XhYPPr}Dhd46TCUB-+>!ixgZ53nR>d z1$pUO0_uy~TvzLcTWT!yx~(^1LZLx}0E(-ZaeDj^pPa>{P|uaXrC?^3l4xq2oS0^2 zkZh8gY-wPSWR#McYHDFKl*W zNrp}Lo;I?#dTFd%dG#5y5uamKkw;{;N1-39*!^pK9;$RhMkaA>HmQ@A2 z`K3GbGJ9MS4&w2tOfM}-FN$#U2?(Bio=L8rD~?OSFexd`Al1Um+$1^CA_eGDQxg+Q z3-csn3xgCR1B*lfW+{OJsq1gNe=Ps1+;VEU+g0~uB?0OEd~GGCdf!ZSnNe-QtI(w} z{nP&=j7B_>;gyjAdD)5Ko=zSXOu%rQ$jDWz#FMy zCR-XO8>JU1(F4@CIV~DO=WiM)QWoK$z3J|A?Q)-#(Czo%srJc_-DWDP%nN2BC zY4deON|l$L?+oeE7_NlKbs_~rWLZ~vC;%|Q@VJ`wF+w0YIW%N4IW;jhIc76AH8eFe WVL3H9H#uZwW-w!AIb<>#02l#OtSRCE delta 116 zcmV-)0E_>U1(F4@CIV~;c4=f~Z!c|dG&%}RWJ^|8YjaCwZdx2nWJyn0KTbtCSu|9B za8giGYDF@^~#^rVOi$G>$V<24N_O^5P0h;43r=%bBJVMqIfx-j#wX1u!z?U6(bCT|+`in; zO*cQ^N7p*sF~TChGK)cqK}lf4-4jQh-#c)1XoWqO$XWATY8@ljN=BH$>6vL(9O-WP z**+dVxegP!J>E$K@szqnR2F2_yZD5LW_tteaCg^A)6vb;%hAoZcUP&ik18=Q@bELV zEpau@isKUK-CAb+E2R0ed_|JZdT-H7LIQ^msohbM>wjaawDieY{fWF1U44HJGb^z= zr$mNVYA_od{IFxzS3?UXCxv9=WFsT96d+-kYLS+jY;0;|lxUi2lAK}`kY;IUkRrt( z!6;?KC8xxhSelZVub*3B?C@9EW2#^fdq{XeNT_QFc5fO9af5hs|t4WOLtht z>G4B6h#^YG$16z3%q&%}&bgvg)hFM_w8+1ORs6SgUuGH21c$LB~FMd3-Zz(dYL^g2?z1`RHm1fq!&fF`2++5UF7L& zRU71FVXqtKqnBb5>#vuW?HylK>S>>!B4o?OkzEq*7?qdfF2F2tzj^k$J%&mGl|lsz z?$~|Uw5|NggLmtV3z@V83YTa;DBE$_{!Hpr2Z!uU;s)=3tysk(!6;?Lr3Q0CdS;px zmv4%9Sa^1^cWR!)c|ni2TtTdk`Oax!QVf{xHxlGx`7nP{128`3wjNkA&s2dC0GHvH AE&u=k diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_standard_attachments_14.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_standard_attachments_14.binproto index da11a26e555a3ea76388708f8b6ceadea6c1c4c9..e0b2532aa5a838642f07d7edeab3773fbc0f9e93 100644 GIT binary patch delta 624 zcmX@bb%k>Qlk6o{rSq&DOahD&doIp-``N&YgNu!W#fyo9DQY|GWLYLPnOTfnQyG;w z%Q90^^YwEJOsu$)oqbbNvoi96(K z{QFhk{Qu?4CVqeaPxq_D+b{cCSd>_uQzFAFHJA(ze%LYVtD%!Zs+pNVl5tv6YNAD| zWm;OAxp|_QrD2+RYFb*VQA(Pr6oUk#R0x-Y5?5w!VtT56RzYgI6-T;TezuQ?Pp-of z`FfAp%s~uMGCp2GI%a06dUehfrK&#pKE5@I4n%7QEx zpU}{3@5%F-fl(93CD6OI%=lMG^Jn>rB%Sr%qL+jO4j)pxqa@e=##CwPle790c_q5~ z{v2k8d5IYsH5N=x3dzRFMn+~SK*BK9A}ux9*wn}<(KOX0ImIZ=($F9UFRE|w4T dCp7?*(3EovI-eLSK!qmuatp9XOofOs0RVx>-0c7W delta 743 zcmcb@d5UWRlk5pLrK4;dOahD&doIp-``N&YgNu!W#fyo9DQYd-WLYM)`UI{RC9cfe z#Pn4Ctb){ZEep8+uAtAuZBwg zRT4Y_>?PVdPp4aj^<8Skg1otT-|%%c_Fi{L&qInLREE2l4n+rk9qa7e%=F z1O!jkVUernisMo+OiD^KNVPCCH%U&kNCCRk)WpQn!aT{?!XU-Sz#>tASxTTl>iQe+ zAIrZgx13t;cGW#uNkDo(Ut7tk-ZxWSW>j17Ds*W~|MdR|qY+PJcx7ZjUUp)*r;~>T z6EGkrGIG@_aVD0gWajJV78s+1V?8V!9nK4SyyXgFbmfw_^Xu}O+)nz@;IQet8%C^oB?Cz(fh+DUIv>xo^F{$h)gK(Nf@L%(kz@c1gHnR9=p|l7P_D>jsAp zsohbM>wjaawDgIVz}K`UcY)-b7we@xC%OEoRyFu@Z~r7_2}UD9E|w4TCp7?*?%dV` UOXis>K!qmu3b07bg9tGJ0B&vpxBvhE diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_link_preview_01.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_link_preview_01.binproto index 320ccb4e7e197c4c0c9c39534da6f65d80eaed4a..d1b1a5dafbd18b4f7a8e4eaa5a17bc9dcb15ae7a 100644 GIT binary patch delta 210 zcmV;@04@Kw2D=8J0wTErBDMku0uTfkweiB?;W0uE2;R*9!^JTWqWpx>n>1ROlOh64 z0l1TI0xy4WA_{43VP|D8YH(#|YF`QvW&N{7*)(6=TCvY^um?Ed5)ga}8dRr>Q)-#( zCzo%srJWeZweaNxA_!PbPeO5RLu4obFyzv(mF+P?AU9($VKHGfG+{S5VKp;0VL3Tv zVlp>5H#TNsGGR42WEub>5p`^Ia%p2_b0BqcZeboEZf|ZV{hy=0lQS|A3Iy<n>1RKlOh64 z0ko5E0xy4DA_{43VP|D8YH(#|3Qh_jW@9jAGC4UlHe_QlWiVr8F*sr{WM(rpWHMxA zVK_2j5C9qw{VJy`3Im8^>##rVgogAPA`tuzDV1%(;LRAY-!;9~yeGaj|f)NHIixV4N(?6vdc7xtvK?&{&Bx zGdD3kRlguF-Qgpz$CSz2nB*<87^E1KSc@`?ON%vrAK2IM&)7(ii{-=oNew{b-YmN{ UZGwpcBSdIouK3Kyh*!`_~)r7QL!Kai2mcI?^tXIBsC`|H9a*cu|y#+H66svD=95fC@o3M tEiKYG_T=2AL&ipeTr3~vPig=L!L^$kTjm)lFhYbT_6o2_T!#oT0RZL8YhwTa diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_link_preview_03.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_link_preview_03.binproto index 26cd4290d96a9315f0efec71f8d30b1a0d945c92..e8023ef5dcfa23b67cd14f57364837aabbf78b17 100644 GIT binary patch delta 209 zcmV;?051Ql2EqoQ0wcfzBE13#0uTWhxADT^;W0`N3JnMZ5ZI&ZwXQWH0tf+Go|7X2 zIRWI8T>>!_l>s6OX>DO=WiM)QWoJO|14yO=lc540e`;Y05IsbWvqg+*%YC+GJWVQ^(~X>w^GWNBw^ LX>)UF18pb(;L%EN delta 211 zcmV;^04)E)2CD|30wbvcBBlZe0uTWhxADT^;W0`N3JnMZ5ZI&ZwXQWH0tf+Ghm#`$ zIRVX+T>>$GkpUtKX>DO=WiM)QWoJOk7f2Oa985R_09v>KlOh63 z0a=r80v-}GA_-}2VP|D8aBgQn@EJ(b8`9v*4{8UQH$pQFB$Gcpkh1n{4dfDi!~ L?55h5kTf6xFrg#M delta 185 zcmV;q07n1X1*Zm}0wSdXBBBBa0uTWhxbec_;W0`L3JVAX5U-uerK>R_09u6tlOh63 z1f>BA8<>uH6_cI<9%>3s3LrH(HDxkkVK*{0Vlibm zI51&0HaIb5F)%SRFlIDjV>b{08W0an5zrtWclo*;uE>bbYx*J(SzaoqC9&s#rf41z n6Aw$rD1`T{yaOoEiTR1%GBObg1n{4dfDi!~*4eRyo-!Z-?e#t` diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_link_preview_05.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_link_preview_05.binproto index 9a58d1433c9397692ec66e8fb60109ccec16627f..68be1e7f51d5f26b89478ffc04667c2b52ab08c4 100644 GIT binary patch delta 217 zcmcc0_Kj@;lgt+;rH@P;OahD&J3k(J_|VXcgNu!WMT?1pG3w@I8K!8)>ys;(^qG1Y zC$C`As?Un&61Z)Y-nnki)`e*cpWNU3icv~PKul9Llh<&?E~)Alo13_Hnn|2Fd+7+1 z5=Vruzf)nZbBYF&!IMiHroJ_FQZO_#vNSR^vouICHcYfgN;FI~PfE2&GPW=>NKCRc zHj`pd5-iOrDauSvEmkNk%1czp%g@vJePCb1KVu_76)u(!^CvX`9s6e4t!WcX6c~*J PK|&LI1z05BLWGzAx9Uyg delta 184 zcmeyyc9m@blgwo%r3*|POahD&J3k(J_|VXcgNu!WMT?1pF>1$T8K!8)ZIdgQ^cmwO zuVm7y7c$~vtEg~^@Q+dw@Y$a1w{o@dw`PrvLF__X*J=sK2!2^=eWF^x%&4y7+J64u z2GI_28UjV<$x6c`~w6MF?%B(4L6Sb$)aRC;-^y8vp#f(p4d7&TSxjzH2w9Wj0_Di8rk4xT66+_rS{Ng_5kQ`9iCmhqefA}(QUX>oOF ta3EuEZgX{PAZc!NWo&F^XJukxbRceJXKZC>Wo~qJav*hdVQqDCC;-bKLe~HQ diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_link_preview_07.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_link_preview_07.binproto index 15c78faf45214f8e6556133dc4ab643c4a00a274..123920193acf842ad77b30357c47ab78d3713d29 100644 GIT binary patch delta 74 zcmV-Q0JZ;;2B8I@0wbRRBAfvT0uTWhyYa%|;W0`N3JnMZ5U-uerK>SA0tf+Gev>2u gO93B~aRMC`C;&1M3Iy<tF0uTWhyYa%|;W0`N3JnMZ5U-uerK>SA0tf+G?g5h{ z0!spp0h4b69e)xKM{;3hV{af-a$#e1VRUbE8cre#X>DO=WiM)QWoJOk7f2NnI|>GP zctluFS`Y&mvB}Zy;Wi==z3$`xJrm>w|I qos94SA_j9|aA{?3DA0-diQY0Y5efwGpOSzO0T|ZVu?2*lG9UpMu}4e* diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_link_preview_08.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_link_preview_08.binproto index e39e31df2a6cba4e4491aca33c422f2c387530bc..4b58ecc3a7c86c72f21a45bd4645bbe678862b0c 100644 GIT binary patch delta 242 zcmey&dX;Sflk{aKr3*|POahD&dp;g|_|VXcjf;hY#fTwl7t>^ErYM#jj9k)_BblV@ zh4_LpQ&RJa6+#ko3riDorSg@yGIJBtQ}we7Qq!~Ixdc-GZg#zC5`QOZ=qA& z1ZudXLY8+0XU%-AK0SZa(zz1Hw|;oaqQnv5>+e*U>zty&VDRM9hN*82ofOQI4H69# zO-&NbEfP(Q%@QpwQE`GA=vs$6Mp)!mN-=00 odvb2mA!8#!E|w4TCp7@AxOQ`6%RD0mMu^bFUI7+~>kuI(0NSN61poj5 diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_link_preview_09.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_link_preview_09.binproto index 056f953304374ea70293cd0ddd2a223bdfd189c6..42e1d1011398835fdeb40dd3809910936622c936 100644 GIT binary patch delta 138 zcmV;50CoTQ1k44X0wl@-BF6y;0uTWhz45}~;W0`N3JnMZ5ZI&ZwXQWf0tf+Gr~#89 z0yqP23LBF>0vl2i4NPHga%E+7AVzg(X>=MhA_-}2VP|D8aBgQn@eN3n3|bsaW=v={ sR&QZBPDxikcTPqvZ*NR3J6AziIB$7s02%-y1#)R~b#o~Dz`lU~Gxj7cKmY&$ delta 55 zcmV-70LcH$1^EP^0wH)Jb_fCx0T{jU!r|dDN)HMR2m}z=qwBSAC;$Z35DNeR diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_link_preview_10.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_link_preview_10.binproto index 293e4971d78e624ccc8322c2ca35c1b5d635a153..67cb595f17f2f6ccf8a329cc8b05a9f75809e514 100644 GIT binary patch delta 269 zcmV+o0rLK~2IdB!0wLrABH;oE0uTWhzVX80;W0`L3JVAX5U-uerK>SI09wS8Ap%SR za$#j-Zy;21VPkY*bZ>JSl>s6OX>DO=WiM)QWoJO|14yO=S{zJAM=EA4 zEom-nEpI#CNSWQntacx6nC<8F$(ps>U?J+n4LLg*fWHLEpVl*;kIXErG+|~nVK*88A{k_FY;SUPZ6INAWpZh9X&_{2XKrb8b7^fT05TB@ T1n{4dfDi!~?55h5kTf6xd&*y^ delta 221 zcmV<303!e92DS#E0wJ^lBC!Gp0uTWhzVX80;W0`L3JVAX5U-uerK>SI09urjAp%SR zw3BWEAAb%~X=G(?b0AbK+H;=~a3ooTW(QxwZrMlR{ekxbI{ zLcBhS`9-OzB?@k(>6s-`{ftVSnYoGSsrm(Z=?*)EJy!BW$@rxCWSE8JCtCV>hTE6> zx#{NT`{-JSJ4RUKS8~O1DI}VwrkEO8SQ;4_rI=V4SR|z+CZ;5(S*9i?nphfGqzN!d z3Gi4w)ANd2u=`u}stIYgf=?+4EPor+S+At)!LfJMou99kOz78m`RjGH5pSTMYq)!n zV^xtyWVV|HgOXliPG(_gW`RO-eqM2DjzVT$Nor0`YI=j^mQ!*tpS64}Ib8Tv03J}{eXNj)7wV`IAEUX=7z`Aa!zXVIXdAZYcY}zJUHSTB%e7 delta 227 zcmV<90383b2B`+10wJdYBBTNc0uTWh!12Q2;W0`L3JVAX5ZI&ZwXQWv09uEWAp$u8 z&68UKAAb->a$#j-Zy;21VPkY*bZ>JSkpUtKX>DO=WiM)QWoJOk7f2Oa985SY0tf+G$pMoj z0!smElW_taU=j^XVQ+F}Wpp4$b!TaG8Z#mZX>DO=WiN1UXF%}{NR$j(985_~I()aRC;&1M3Iy<SY0tf+Gg#wc# z0!sp=0h4e79e)~sA_-}2VP|D8aBgQn><>uH6Dt@!<*0c#G3XBk;iM;|W5^o_wOaOoF8xa5i delta 242 zcmdnXdX;Sflk8nJKAx#R?&bxrL>Pxl(aTT$#Cv>8biz1*z##GCp2GI%a06dUehfrK&#pKE5@< zMykf);hy=$xk5%sl=V8Nn}0txr@7m>Jbo zT-(q8+u+*aC&$^86q57vic^zIQcFrxixeEnQj1a(ixhHzBBjL&#rZjv&-IZG?=WhoSdmplv+@fnvt59QkqwykeHKMSPGOa O%Pa$mHOtF0wVJx=dSjj)5XP~IC;ze->MRmetnw9q{Nn9 z;OSLZsli}yt>ed&&xTG4h9;J2rk0i|iAg4DmdO^028jk~W`>r=KyF%El98ztg9PI} zMy1;j=R7Env@xr39?fi zeh7G+Vv3USN%P4t3(HTm^z#h2FZXlP&CmDIwGMZTu*k2>Vvu6cU=%XpGRiMXEXmAQ z$V)9OO;t!qP0lY$RVdFa&QvH$P0!5F1BzuP=PTqUmKJ3eD&Nqi2Y(o9AUCIJ=+Mkh87Mgc|%#;6WPp~*LyRO_V@xMGyJGIJBtQ}we7 zQq#HoxD+gs($bQW%q+|;QY@2GOifITO_Gum&5evr%o0u0(kulSqy+Zn75|^0bnI9D zy4|9Y$+nqF0^R?2XH?ug8{+JJs>mcO{-?&Dk01JhR?cQpn!yCNeZ$#h?>8Da@p0Tc z^Z)QsLxDwqS~xGxHi`Ph$aS7^@)aiS`UQ+!NN$mu$jH^li0nFtE<$i9u`T0J&*5Qs37WtK2FoU&E4aSJvZ(lq#?lS5 zzAzebxu++&`MG6BIR{%XXfO&1a|!09CZ`q`XO<+EWG0msE0m-f339P~m_Mlj7`W%w LEuAviM1c_i<_Ch7 diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_02.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_02.binproto index 5224ca32e6569f8b70fd805eab6f5f559afea941..1cd2f41406b50832f4ba75cb1aaa26b0056c043e 100644 GIT binary patch delta 543 zcmaFL^^ao#liw32rH4!$Oad$tj81GEi~@`jj8PYuge17Q3=EBoO-#+qEi8pt1XvUp z!6cJZ5SN`2XJ&3#n{%#nVW6MGBrcD2Qj>F-6kM_xq!^S0u7CC1vQ6Bn zp;KGyhK=&Aby8~?xmGa3w5DgKS+R$^7dciHc{p6>@Hj0O#8a5-oDvyc85xk5oj6&G zS*|`Sj!R%FZ{Ny~z54_vJPxYL{PN9ANWg9Dlti0q{a@$Pyc#0ow3bWk-+m`Yi7mar z)2pyjgW2F($B!qU4K0|Q6im#LOf5~!42_e`lZ?{R5|h)+%uEt33`{LeQ;iZ6&7~M5 z7^MujWRy4)OH(rQ^>Yi19c~JHTw@Mm^>p%ZHi^RSlW9y!lR-hoDDmjP+@&84z1X-| zI9Q|@qW&^+otYfVqM){tk&6owL|Fx?=~A;8xu!BIA&EFF;q~}02k~Pfmp~c!rLLTG z2EG2*rspTkdpA)?;L679$=SEV*BY#{3E;@M{#auAr)~FHl{mcJ(vz~Ci*kY9Tsmv> z<(FV@rkErdrkI-R$~Q5h}gtlU@Ext;Xg=-2>|~puz3Ig delta 803 zcmZ{jTSydP7>1qMQKuh`-wv`49hL!UQ^MJQW_D-2No&Jx)fL=GTRJeuZFEnW8>WI5 z6(Jogi|9mKYKcU73Mwfu2r;lC=%TPvN-#yT2qCCwREVIu`7YjzkN10czMtech~vSB z1l>=NI3h9nY$m>KhT5=+bgFgC<;yxk!a$hj)$s42GZ7W*5xTOL3fyK^iiexNT zoW{@;nHMFStT~XxFb-BwZ4jqmJ)pMSX!2E@pIUP+($jvKhU$;rO|Q6JBmVAZRb9!# zn05Hlv*F-GHvG&Rx9G?aMFR zy+4>=ROWWM@(z>kp5>*>fkyY}um9~DI=owE$iDjB=OF+QQ z7k<0r1 z^UO)&Z(OZ79mmNXxS>J!@bypKj3)^YBta$kn{Y6Q8GaDdf7PJdFaQ?3sEDco>MRDD zG5U`rZ)&M~WZ44Yod#je$+J8wh>Rp~DvLyfc!wQHNRpAnN&Fn)fzbB1g01Q5splDA zhSr=QX&5=n3-P;NbS-mVcJ`ybJJyT0`)-<0O6?|3puC`P+qSCWJ#(O~m?3ex7>%mc wYL#jU#biCU*Aj_V>ya?ZOasKsmD7#JolkGIpK0MN7@Chx9XCGV*+PW>0-4YRIsgCw diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_03.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_03.binproto index 6680a56f1ef23cbadc0edf9c30b3e3626f51259a..99aac1c8304ad4e2e7bd52fabe6b8e01373d6a5f 100644 GIT binary patch delta 295 zcmey$wu5Z}Q+*GkQYRw^lK_hZqZ1nkqX44>V^pP7Iai?)XJTneX1;!IfpJz6mq3o# zJI{z^5*nu0%O380zammdz%f$&=}XpSF&`h_u?R`7O_W$Z_sU&HC2r5C{OkzFlE}26 zEDZ*OLkG_+e{bldU}9)$X=I*inrdlanrLR4oMxD6oRVxDYhh|)W^A5fW+=q~vU>%i z(o&Ff7$qJbn7j0&p%*_FF9(ajjm59Gt}|6);$VzwW90Gyx|2o8g^MdQH!(d`KdT@$ zUCNBhL-q@QE2jUCONw-1}O#&Mj@br#FG5n{G!rah1|r{e1(+ERmAOHXW delta 357 zcmdnN_LXe`Q+0`j7q;5fz~ogcx*bm?EOXqFMcjw4iYhiw9-CzE`$0f? z1CNqGr=Npy&Z8T;hZ^tiTpF~zUgPVu4-?om7=>)Ota1}`Qj1FyQxX*lOEXgva}^R( qG7B<`lQR{HQVWVwGg9+XO7lt-5_1GI3rm60Wtn9_p?rnB{5$~gs&!ld diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_04.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_04.binproto index ac4ae4486f1b0d074af20ebe2b3cd9eee5e91792..998f9e9a9525059a15682c584449fc05769a44db 100644 GIT binary patch delta 119 zcmX@k`igafE0fYF1yUHZ|`iwP&EY4IYN=?tq&jX5OCg&^UCYBau7Aqu|7A2+{ X339P~m_MljX!z|9|0lN^D=-28TUjZ$ delta 84 zcmaFGdYpBGE0aP4qf#9QlK`W{=CjM*Z#3}Y<>KaG5m-O>)Y8?4N(@m+lhc{3)rGkP o^HP&ji;FW$5=%0ZN{barQjG+;SU$|3)Bx0aZr#!;lT8#D0gjg(Jpcdz diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_05.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_05.binproto index fcd9d276c7cbd7f5d99a273e78c3b16086d13675..5a26cdcf8ccd5212cb8c7c0e55ed16b651899c7f 100644 GIT binary patch delta 279 zcmcc5KA(L7llW0ar9+GyOad$tj81GEi~@`jj8PjIg(lx-vaOdYvoGqCfjBz33UJ8ol$Y~Y>2b>sUnlC_@5eoK7Qy2TDhD_X$ce1c1DRUXP3R-XyC=c z#m2#+#l*oF)x*TZb#n4ECKr_^MlK{rNR@CEAv?;UOVHyr<78iExq2Z7F77ZF@5Iu~ z05|s%CjlmjuDQ>8kDDn8d^wd;-ue5^V&?sdlM~%V9km43&iB1*=fgAQ%$b`dW`3TLAQ#Jr`I8!ejy<<->6FPP U3XBk;iM_zkJHKuzD@cq90DAFt!~g&Q diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_06.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_06.binproto index 38104b1b145116b62703fc5667737326acdbb240..653c24360fb0198649a95d2e20cf41d0c6352ab2 100644 GIT binary patch delta 119 zcmbQuI+b;U8dH9rQVs``0HegS19O*tH1y)-;^trxxUu;4)^(;@3{e4GVjPSDEK+=2 zJOQaCsYMC_iAC9|MH-AkW?UwTCHcAeMWwk4xrwRCsd7_Y|3d#Aox%nyi3MrY%rFkU)o{c9m delta 125 zcmbQrI-7Na8dGVBQV|D}0Heg#v&-IZH1Oi(;^trxxUu;4)^(;@3{hcRVjPSDEK+=2 zJOQaCsYMC_iAC9|MH-AkHe6P@i8-morHLtt3WcSaDT%oXi7A-{nZ?PO3Pq^}MX4F7 bc`2oNB?^f-nT4f5*|N+sph&(#UVa_`itH&) diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_07.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_07.binproto index 9798aae9c4ea49e6ae85afd51ad24295fe1c399c..4bc6c59b1b2927b6e863743f4b5749da0cddd75c 100644 GIT binary patch delta 366 zcmX@k_K$4=Q~g0krG1PXOad$tj81GEi~@`jj9F_LxmGc93AFp0JbCdl=0@hSkC_*_ zTD64~F8)2yCF)zgL&B|)Db&PVe!-46ha=qNWom!xO{#ACRiVW4Vg95Btvn^p%-qEE zRQ-ay^sIO;fr%+B4$8mFVwo-7{Q$*8mq<|xi!zH9l1qycQ;h_05UzPuYt23V&ww1ihG67gm}?KBQf+1$iFl~HLD$ia*f+s-a~ztO;p zpNp4+MPU8hQ%hGH8ZmJ&MwM`R0X@Q^6FPP3XA|X#bB!d diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_08.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_08.binproto index 7b95ff2c7409f9974106ea0a0a06946d1367e130..918e388011f936263fefd414ac4a6b4f8c3f3807 100644 GIT binary patch delta 373 zcmZ3&{)TMHXaUL2Ua^rN9yJsTGb2a6Fy)MG}jO^iSn zuqdr$m%4J&8T9&Jo1ULE@7+Wpfh!xYCuiRdUu&?+CV(U3`eTXdpYpcd zXI0|xc1usnb}q`*U^ZAfYxCuoh89dt3MnQ@hAHM|#%4(=Nv7tBDaHngiN?vM1_l;p z7AfYb#!?Itj2etWKo69q7UdfWasdNiQUlOyw?F)!+-j`A2oajt3k=;m5FsW2q=bFa delta 430 zcmaFEwuF5FQ~h~Hr8A5iOad$tj81GEi~@`jj9I%Gxppve3G`36G&VZ#l8Fs<qY zrk17#=0=7BOi}_*s}4Bwz3W#_ci(jLf_HDGlE6NRY3!+p zMk8MD;-JJr_e!V8LO-Wa3x%l23~AjEF3IG3{gNol>vRoqLjx4 zbzfFNeQLT?0#^*o!C3{V>0EwX3T9?$Ny#Q@Nfu_t7AeW8Mh0oghGt1g#)ip8#%ZR; zCISpn0@;_&Zg6{dqOWPTx5T>Oz~4#&X}^#BZnL=ai2q>rW*OzLCK_L-eVD*5!KlF~ zB*7(?SWu8!l3J9ikXxFZSz4@+Ur>^nubyWl$OR0wNew{vo?Ewc%48D-Mu^bFUSOo0 IhX^qN0QuOKYybcN diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_09.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_09.binproto index 6d592b223873aada885ebcc055cfd72c9baedf35..c7a2729eebe61e02896b823a66feb1e7c328078e 100644 GIT binary patch delta 392 zcmcc5{*P?|Q~f1IrSps&Oad$tj81GEi~@`jj9L2_xpp&h2{1n{lr)lEcEv-@N}};x z)eRv9hVaxy>itq)ObPs<^TbYgU3KVIUU)s~U#Ha^`T6fpvna8Am_M;kt6qsKGdD3k zRlhtnslbZ8urSdppdi#i*`rM=E0Ie;Sadme#viAU`J3-F*W2}3JrEL@yJGwLqq$q= z${7Bc+5heJc8M>ymv3fM;s`5B&(A0c4$@#Y__pq9+Xq7nCMN~Ulthap^Tf1dQ?ryL z6U!9CWMjj$WJ^nnv^2BSq$G1Gh82uTOF^Dulz4ey?$VEjUi@6V94rDi7Qf!Q&eV#D zgE6X&k;@0@Tb6ny7cQt{vkFqvrOdcYV2%gz9U4SEE(%4-_@sFHN7(zhT1J|L)D;8; z1ZBAzMp&kqW)+o~Wid!GXfO%^btabN=jIoc<|^bSrY5K6B^E0bmlh{y7Gx&om6R4K bO$gkvz;ZiU(G)*zLG&V6eG&8rbOa%GLAjLe%#Msi@$lN%^M1V<3 z;LG7m_P)Xk`c?lgZMk^8>4lPjU~E#QNnv{Df@1~Ow^$YxU(r~)Vb&K$BQE#!BsV{| z>?r483kD5FAsa5M+{B#J;?l&FM1{iA%#_4jg~XK1g3RLNOogJ_w07HF>#!vk%hdlbyDg;P zwbEl-W%crV?u&T6T#U42o+WW}T|Lof8M5QToipFlN|iW1%%9l%VSfKUEm0-T%-qEE zRQ-aybcZu?9)H=g7^E1cF)2-E0@}qW@#?_br5_Ewc)7Sa>RANV&powtwV@S5)Hg=1 zRg6GKuqZ8LuQvVo~#l4WY5QEHMws$rU`xuLnK zxfFv0qXwgp371iRQDRAEzCvDVVQH#DN@{X`QK~|DW^txMQEGZ-ejZRPGdW)&H?g!R gvsfXyv?wvvNRW%=!~97Nz;L+z;Xmu-R$~Q50C^^fLjV8( delta 446 zcmZo--@?9tseT8e(pE+eCIJ=+Mkh87Mgc|%#;hfbTnibw1akE0OpH`w0 zXJ&3xc8%}wk-7?r+) zoX#k*^X#(s8x6d8xwtu41lG?zwRE+i6+_ewMy|DtKrgW<0X@V8aZOf1YP!@^My?5r zN??)tRDF<;!)sxWJ0ejsKJM;XX*#-@dO5oJ_U%#FEcVc4~B;swc1C)N8nlmzmp znp!N_;b*i+wM<+4(3Y(lv)6A~!)(M;C%q5tYnw(l( joLQ1sl9^OmtWc6_B*?|`Vg95Bpij@OTRLU3i2@@4^sJb8 diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_11.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_11.binproto index 930217836dde54710a811a872bd8bbd60422ce65..006e204e7cac2ae609e7061108aa003e21218f01 100644 GIT binary patch delta 361 zcmbQo{(x-(Q~e1>rK5}-Oad$tj81GEi~@`jj9FV4xi&I#30x89-&=C=kdScArN2r^ zyxKwvp4)$TwO`uPp?ohnfJv#O@KgI8@$TxiU+;fUb&Hwn|6Gat!~BUWA2sxTm_KQ^ zR-O`PW^Q77s(wLUdR9D_z{C_52j$;ovCNikf82J&9~2Upv9129Qp2jL(gji8#)6^8 zXG^^Pv;G>B5=U53dVWSpaF7Or!MAl++dddNDOg%0nWdN-8Ce)4CR&;rCYc+UCYmG} z8ygy$nkJiDCP^_&VN{w3@(QEG>jQI_el+xA<6_}pabk$7;qn3cj77~k5f!hGCrQZR<%J+7WTSvK6)u8vHp5_+1~L*rJnZrDOn6s3>u6= nK!eLti}H;GxmbWcZ2;PM`@{dqt;PzB5TS{^!0@~S5n=)W$9;UA delta 424 zcmaFBHjjM)Q~hE_r3H)}Oad$tj81GEi~@`jj9LARTs@3j0@p<}wZ+2?B6*n9UUjUz z`$b6M^_8;zte6D}u4Ohz|HI%qN%%8aOQA6*C`IB~Q zc`9*b<|d}6>L(WDrCYJ*XQV`UgjNa}aj``>xg}PlDG5|^)Voam&$RDvgi<4Sa**Ut zErDMXmAz~|_y4;&{T@U0&V~03j{ILUm+3pB(ie~`86|d|UG{#XffpMW3kQo6L)1M+ zuGx%0XR|0xV&sBamsOCOF4fG))xZdI07%5)ijc=7#wZz|6i@#Mdp}ppNRyDdg8HC< zpe$Fz2+K6ntfCS#E3rmw!69Z#ov*c8x6bqx2WFrg1l(ZzvL{n3vM04{r0R|}n zo~;4uo=3hOn`H0%K|px}kCH&ApM!DEqZ_)18t?C18nnD#>|HGfRsV@(W5b^Ye@ZxmZ3Z&Y#o(^wqg_OQ%dWQD6j%&7ar{jE?gVAtnF| CQz1vjV<*bW*sI$x+cVXR%nvsbw)q@rbHhIM z_NV=+=j5jvFZmrO(yD8ykfNUT*x1R~uy?Zb?Y9|QFP}RT$~BMSx}RrDk6gY1TN_1mswws$?}Y;!rjK>DLEuX|MxbLOL6%{FY}E&lf()y6$MblX_p^xoFT z%+KD=nJXsL8f5&SUi0;Dd0wx$8zJnBE%D5rcQY7m*SqK|1wLwzDr?<%H~sPHxBpn; zoTQI2W=wQDm-gD?r|i*XRtKJYbgvHl?~=?Ey(T<@1L_V2MkqsAB!9Z>jfcIrZ05h& zy~p>u0Arj|3^0%xCEgsEyY!=>7cUn#2aCXs#joABt~2#wh;rZpg*}S~laLvgNn%NU zZhlc|u0n2NYI15`VzEMTX>oF9L1toJNokQnPG)*(PNG6`er|4lO1?r$W^!p>2>^6c By1xJb delta 412 zcmX@YK8bw+Q~f4JrS*&)Oad$tj81GEi~@`jj9K#-xn?tR3G~}G*B%UC5$(xn^lFA@6hUA#ygBkH$jeOl-PZC z+53$KUc6k~94rDi7Qf!Q&eV$`Y7Zk<4bU$vN+n!Smt+;Brc0%9CBa+<;z!B&c-05# zn3<*O)j3y`s`}*n_|^m)sTzled*&DC3Yl?nm8LkBC8p=57KSScNX=wFw)9s&!|t5y zm3oVRb!q_}el)%K?u$2#GflTNN$W5gwD(WwW|v^pU=*_9vdT@&Ni8l-Oi5HIEX_*)N-Zc#%}C8lDa{itQAo_mEGz{|mt~d#h4K~h^78;AC6pup diff --git a/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_13.binproto b/app/src/androidTest/assets/backupTests/chat_item_standard_message_with_quote_13.binproto index c3225ea23f1187382b0518f92475e31f4bb23194..b1e61d43af66843d17ce1b361f72f3cae734ae45 100644 GIT binary patch delta 142 zcmeyv*2cPksa{w~kb_BpMS{_Zje}8uQG#(2BSWE5K2VHN;_ZRCOFtTV@pJKVun4T5 zdur)wLoX%{#;8CpkXjZEW+4+Uqx_=8lFWRCywt+dRE3n(Y(p*LkCIJ=+Mkh87Mgc|%#;hJju1-cSfw}vqJpEKNE9bHNnJrRv z!3%^GzW>UyRWaWo*04~K!^T;Ax^}?VHpi}PfBVgl4nUcVlQz_-0zwaz& z-mf@0(OuM0OJMDM-@A4`JX6k`xmi-4bmfe}?jy4|vuZF333CbNr6#8q7iX3vmSiTC b7Ausb8VPa%!)HG;WT9j`j$i?zu{-g$=*4rQcPi{3< QV1x)w>;+nP2O`7-02?46UjP6A delta 323 zcmey*vWsm2Q+=*dHV2aciv*(+8waBRqXc7CG*={-!0Ehoa=Im%#o>B8J!e}du?s1P zoS6`6_3G8(JreR7mmh>=3osv)7wS#*TKZb<-n*kQsY)y#=1=U?l2zi$%uP&B)lV$Q zOSfXr&q#^z2(5JZ&EauPP>SIcqtbCkpnZ%Id(SR=ztO;}o`Z{xgT;%9gDGk~BUdia z2`oyfTu>vj3R2Uh!nuNBMuPYbuZ2DChzQwpah0YxmL;a=rWS?^FiY%txbOZPGbI7_ z>RFvBiVuJA^{1`PU-bN^mVoWb3!4u9^n5D!X}eCH?12XcFHdwIXOm#mU=)(z60=Dx zC`c_yElO3$EltiWEmp`cD9OyvGZN$idS_At(4ptnEuAviM1c_^G_e;LR_7r?OaL2! Ba!mjL diff --git a/app/src/androidTest/assets/backupTests/chat_item_sticker_message_00.binproto b/app/src/androidTest/assets/backupTests/chat_item_sticker_message_00.binproto index 77d455c41b8a48bf932caf1351e45a08c5f68ca3..f11189aaeac4ca268a3cf7df92aace57ada4a2ea 100644 GIT binary patch delta 133 zcmV;00DAw!1=9tf0tC?kBF>Wp0wDyf0Sc*;DFQxhYa$70ZDD6+FK}*WYFr8sd@+KO zy>4^=kRrzVZ?3x)5)jp0nfCZ`_=B39;@Hz@S-BYI&9sRGA_YTHS9NtL05HGTk@e^? nLLg){HDozCW;SLxH!)^7I5Rn6Ib&rqWH@9qHaImoVmTTBz9Taf delta 117 zcmcc2dYE+q6U#wHrG1lGm=sy&FmlbDtjS~-6RpIVnVXoNs$Yn>1>73SyHc z0zEh+A_{43VP|D8VQ_9|It+1bLu6T3d09|yYhggs9Z2yFY5*Dl5)ldn@Sl=^5CIt4 K!id()G9Ur(za|?1 delta 186 zcmV;r07d_q1?mN$0w(AIBIN-H0uTfkuhE?C^DsgV2;R*9!^JTWqWpx>n>1?20Sd7J zlOzH?e{&)VX>DO=WiMfHZf80LX-9EQctFYHq)$ diff --git a/app/src/androidTest/assets/backupTests/chat_item_sticker_message_02.binproto b/app/src/androidTest/assets/backupTests/chat_item_sticker_message_02.binproto index 7898b0ba98605d6a93aa653de010f64818d8f056..abc7f3bb821c886102ea089872440864911adb6a 100644 GIT binary patch delta 204 zcmZo?`^&n3N%l9R(ho)sCILo?4HxIU{cPaH#>K+HBE^vPh>>gOWLYM=`f4Sv%-qEE zRQ>YQqyj5ePbUxOD2MsX9`Bj6;#*@`ohqH$w|S&IN37Q(!e+^ImN=##Mmg! z!ZIz%Ff}pJ+``P%%+gefK}e8GndQU$New{v-8$59?TnEEBTx(|G_hBJMdCI@hzS6u C#!5v1 delta 214 zcmey%+RnCsNw$?qsfme$Nq|ve!^JsoKO1FAS zJypLvHL1XguOKDaJJY4AD%H_7%0J2BwV1~`KCT2V1tX)x6qBU1#ALHnLjwy_%d{kO zgOnu8G(#hc#3TblO95snf#q+5I+b)iIQFi(^Yhh`3H?d}N^8A;9ec^0wN>u;= diff --git a/app/src/androidTest/assets/backupTests/chat_item_sticker_message_03.binproto b/app/src/androidTest/assets/backupTests/chat_item_sticker_message_03.binproto index 539db5adb47b1094426fb8fcf002cb670cba4c6a..47beb147d36e56e56d600d5e01cce201d4ef99a6 100644 GIT binary patch delta 69 zcmV-L0J{Im1^NV_0wZ}McL)Ly0T{8-obB^4N)HMR2m}z=qwBS4;BEUQ7VK`xBWMX78Ib&ip zGG#e9G-Nh45C9qwmrC`gq*-MOC6MpYj3l1hA`oZ&%NoXosIJ@6oU|^OO=T#zvdi`a DWP&zi diff --git a/app/src/androidTest/assets/backupTests/chat_item_sticker_message_04.binproto b/app/src/androidTest/assets/backupTests/chat_item_sticker_message_04.binproto index 9a5713704a2f193621d55fbd84a98f55fbfea03e..e67682f5b383b96d2cf8681e27ed894cbf9b336e 100644 GIT binary patch delta 175 zcmV;g08szP1?UB!0wm@EBI5xF0uTWhveBIF^Ds&c3JVAX5U-uerK>R_0BXho3b2zT z0!4poA_-}2VP|D8aBgR6TnZ3;F@lo4Zgc;TBF6e}uDcZy5Y=6o_V{u5gPNS;*wbiP zxftfnw21^F1w&C+b#*8JFu&K4_2@A|AY?T)WH~uzHfA_CF=jY8GdW>7V`VaAIAk+6 dI5jz9IT`>G5efwGpOSzO0T|lCh}O(9AOU1@LlOW0 delta 143 zcmV;A0C4~41;_=U0wl%(BEta)0uTWhveBIF^Ds&c3JVAX5U-uerK>R_0BWWI3Xqc| z0!3d-A_{43VP|D8VQ_9|It6J*aZPv&S&xsrSqxGPLV{c@ALdVL0Gf2`P{*}1Mhc7& Op^3c$EE2aNLQDW5T_v6X delta 186 zcmZ3^`igY{lfnx|rKgM>OahD&n=j6J``N&YgNu!WMT?1pG3zWN*Am9b@=Uh%X-Zs~ zxryni`sJxf1y+0oDaqcME>%^jj;>MuNe-u^J=BGqx%fPM{PVMYqXKfX$_qoh1eheg zzy3dMr-72d*R&>gf#jSQ>!m#>x%{bC)e`u5Z+^Oaq0wml4BG~~50uTWhw9%aH^Ds&c3JVAX5ZI&ZwXQWP0BXDe3b~Uc z0zQ0uA_{43VP|D8cV%L5It58WNJCmcp94tm18QCh5SL2zr=(eB3MG*5(TpUX+Y%6i z$>{_9*pxE(pRwwvhE|mr{)PFN1tJAQQCD?!C<8FR*OB$;F*pK3AUHE)Ib}I8GiGCC aI5{*kGG;hAW@0gAVPQ8oHZ?XmH5vfd7C+4Z delta 130 zcmV-|0Db@71+)dA0wl5lBCi1m0uTWhw9%aH^Ds&c3JVAX5ZI&ZwXQWP0BVu}3XhW{ z0zOhvA_-}2VP|D8aBgQn>lR3^4iY{J3RhP~abaV6cSd9o0~pPypTem&A`lvu=Lf(7 kS;r<$wLyLRAlWJqE+=u@#-Be{&zK+9O3Y9|Fs#Y^Y*-{Pi~s-t diff --git a/app/src/androidTest/assets/backupTests/chat_item_sticker_message_07.binproto b/app/src/androidTest/assets/backupTests/chat_item_sticker_message_07.binproto index 41bb72122afe980cc9889079ea2438ff9f35781e..507664766c0578b12298769824968586c84c0ebe 100644 GIT binary patch delta 90 zcmV-g0Hyzt1&als0wsw7B8CA70uTWhwb7jI^Ds&e3JnMZ5U-uerK>SA0tf+WXbMx4 wB?3Ju6(R{~ZDD6+FK}*WK*kM7@EK|V8UPXz3Iy<>0lJwR=l}o! delta 96 zcmeBXoyfX?NwuF*sfUq+Nq|ve>%}>5KO1=QbMbPp2&|ubYUyf2BPI^UtURvB$*N4Y z`qD~VnYoGSsrrcpdFfWHneK(Y6%OxYJ(^^s7=#45SU$|3)BrT*%!Z{cSB(`I0cmy} As{jB1 diff --git a/app/src/androidTest/assets/backupTests/chat_item_sticker_message_08.binproto b/app/src/androidTest/assets/backupTests/chat_item_sticker_message_08.binproto index 0a9db69c71e128f8667b042f4e34a3a49b99930c..147cc07d8d62e91f54b2ee87343005db8d06158a 100644 GIT binary patch delta 188 zcmaFJ`jK@3lk9s&r8kTmOahD&+b+&|``N&Yjf;hY#fTy68Y9=*$+ApN_1Q|CnYoGS zsrm(Z=~*#c0yTzBllJBn|DT|A>{tG}-J(JQS7T>>`%(C#dDfgqH!f#H?v!|Tc1tIV z6037ycxkBygTemm6TiMNbW%t$HBGU!OfyTfFgHxIurRhvv`kJlO0h^WHnT9bOtO?> k5EA5K`7nP{1JF6Q4s~2RW2C?+3=x~yE5IUg8zRO80C!YI*#H0l delta 172 zcmey!`jB-2lk9y)r8|rqOahD&+b+&|``N&Yjf;hY#fTy67$eu*$+ApN_0dY4nYoGS zsrm(Z>0EwX3dSZziKzz0rYR{&spe^^CT6B-DM`jArYV*{A}u9ZfI&)N1G~jT)%V2( zHC$35%e#WJlmtw)9+=+USN|mS?`GGVCh>PPwr@K9jYUY1i{-=oNew{j&um!Qa@AOY T5h66PSAa$0EJ%piSb+%u@7_DW diff --git a/app/src/androidTest/assets/backupTests/chat_item_sticker_message_09.binproto b/app/src/androidTest/assets/backupTests/chat_item_sticker_message_09.binproto index 7b2c8a74c8df0061e7ffccea15c23b6cc193368f..e9be214aa8ce3964502f8cbd1dbba8dce2be1b24 100644 GIT binary patch delta 86 zcmV-c0IC1q1&#%v0ws(AB8dSA0uTWhx6z#K^Ds&e3JnMZ5ZI&ZwXQWf0tf+WYYJ(T sCjvwzBq9oFZDD6+FJW+QXF3dVZ9`;PS9w`bZfjvc(;Z0h4Qc=y0FyZz6aWAK delta 167 zcmV;Y09gNy1>Xgr0w>)8BH9560uTWhx6z#K^Ds&e3JnMZ5ZI&ZwXQWf0tf+Wy8#Ng z0h1*HM09f^3TbU&XJs#8aBgQh1!+fdO?W`c8%QS#SqdOAIASnlW-~QpGGt_7I5J^0 zW@cq!Gcqz}WHMo4H!@-n0vZtOus`jDhV&V0Ze?rSI0BX+x3b~Uc z0zQ9xA_{43VP|D8cV%L5It58WNJCmcp94tm18QCh5SL2zr=(eB3MG*5(TpUX+Y%6i z$>{_9*pxE(pRwwvhE|mr{)PFN1tJAQQCD?!C<8FR*OB$;F*pK3AUHE)Ib}I8GiGCC uI5{*kGG;hAW@0gAVPQ8oHZ?XmH5vdC5eg6l@Sl=^5CIt4!id()G9Up=??*HM delta 202 zcmV;*05$*d1^We{0wnnXBK83Y0uTWhxY3;L^Ds&c3JVAX5U-uerK>SI0BYF*3d55m z0zQ9)0U`=%ZDD6+FLz~Pa5@ffWMfNdM0$Ezsy5F)Kh`o`f1 zS^IF?pAw3&87RlK@Z|(D4tG;gbwxu_S9Kb7bwx%)I06z83Iy< wenDQk!!cfu50Y67QVc?ZTr3~vPig?_yLG7J+8HASMu^bFUI7+~+Ylip0NLsv;{X5v delta 179 zcmbQr`j~YAliWi_rF)DVOahD&J1@?8``N&Yjf;hY#fc&71S8jc#>p~Fw)KfhoSC_a z>8bh!dFc-CWIdW>xcs;j%*@kLl9LP*lg%tl6D<-`Q<74QER&N=j8ZKvOj68D1sJ3R zrh9!|z9cf0OLfBgi#;myZYv3-|2-{rtaZh@+n45S(VO9$s2EATf?O;g=1*z> ay5h`+r7c&D6&N8x6MF?%I3>7V`VaAIAk+6 KI5jz9IT`?=K|AsQ delta 124 zcmV-?0E7R|1+E340wk;fBB=og0uTWhy3w5N^Ds&c3JVAX5ZI&ZwXQWv0BVc@3W<{> z0zOPjA_{43VP|D8VQ_9|It6J*aZPvSY0tf+WdkSWg zCjvn@Bq9oFZDD6+FJW+QXF3dVZ9`;PS9w`bZfjvc(;Z0h4Qc=y01^=j1n{4dfDi!~ L+QNv|%rYPW*)Jj` delta 173 zcmV;e08;;+1>yyu0w>@BBHaN90uTWhyV0EO^Ds&e3JnMZ5U-uerK>SY0tf+Wz5xoT z0h1*HL3(B)3TbU&XJs#UWnyqT4sc{+OKC)UdSyXHT2Ep?${R>05gnX+9OW>d+2cKPRveeWbg!?=mqey=sZMx*u}5XzZ6Sf?lP{V7+?ZnY zWB$fh%iF@HO8jg6IfGS+)j2S{v{ZxHVE^@rUtbtnFgYn$7$;k%S{fLqC8tEenpv7kF$f8ADYJZ-KdAxe!dr(ruAMPbU<8T*g(mh2ut?m72r&Tw DE}lu8 delta 163 zcmZo;yTiJGN&Xh2(sf1-CILo?Js0P^{cPaH!NtbG;>E`E7Nq z{jG3QOF&P(@bn>3OEcnWq3 zav}<8ZDD6+FKTdQXKG>!5a?C}q RGi5S0H(_EqG&dRm7y*;qJLdoZ delta 141 zcmV;80CNAE1%(Bm0)K-6B7gx10uTfkuhE?C^DsgV2;R*9!^JTWqWpx>n>3OEVhUgi zTp|i-ZDD6+FKTdQX9`XVATu;JVKruEIX7c7F*q_gGGb&lWj8ZsW;rl2GGjJoVGsZs v5LshAY1Lhs_V{u5gPNS;*dh=#YG3($F@lo4Zgc;TBF6eC=mxf>>jD@756(6l diff --git a/app/src/androidTest/assets/backupTests/chat_item_view_once_02.binproto b/app/src/androidTest/assets/backupTests/chat_item_view_once_02.binproto index 9b35a6a8a977d24ce2eb5016ada7684e5dd401fa..bfe2d481bf511a1740b1cf990420e9912d72dd39 100644 GIT binary patch delta 80 zcmV-W0I&bi1>yvt0xn@9UkCya0T{5+obB^4N(Kr92m~4ck^xByM+!3{32AL%XJs#N mZf8Kp97wDVlSl#{7HR+*03s0XRXqZUfK4Kc9<$e#Nnnkw1QA$R|+6GIW%N4IW;jh zIc76AH8eFeVL3H9H#uZwW-w!AIb<>r0vZrq1Y{lBbRU5f4*qaFXD6s45SdLWQEBsa tMM{;Io$n0k(kSN5w21^V1#o0(N?JGoA`p+Mo|eH#NEwJB>WeN}#)UCbtm|T>$V>2S5{~VVR5O61B zO1X zkpT*f0U`-$ZDD6+FK20HK0uTWhveBIF^Ds&c3JVAX5U-uerK>R_0FnW$0Sc)B z3X}mN33h2@Wp6KSa5O3qW})QYz3KrPOixVR7AYlZFn|z1)g4HSA6gttWJyn0KTbtC zSu|9Ba8giGYDF{_9*pxE(pRwvNin!J01sDOh C1S4ty diff --git a/app/src/androidTest/assets/backupTests/chat_item_view_once_06.binproto b/app/src/androidTest/assets/backupTests/chat_item_view_once_06.binproto index 870a0880a2affff1a17d3240e9cbb9a0a34abf32..ce4bbbef05cb265dcfa9aa5e826d1ba248450cee 100644 GIT binary patch delta 87 zcmV-d0I2`G1?dE!0yStNW(Wch0T{H=obB^4N(~AN2m}z=qwBSDO=WiN1UXF$gsNURQ%PXZnmY5*DlA`tFXJpzeGPK~HIEaS#F+^PKj}!96k}5EBne$4imeX%9^i y&>$Xn`6>{I&ujXKNJtroUwC?t(b5e#Hc7w$ diff --git a/app/src/androidTest/assets/backupTests/chat_item_view_once_07.binproto b/app/src/androidTest/assets/backupTests/chat_item_view_once_07.binproto index 6aa74d0acba7dcadc55435cb17c32719a570cf1f..e89a4b223499d2094f9cd95f7f126a0e3acf15a7 100644 GIT binary patch delta 41 xcmey$vWR5?laiv6JO`5iqr}#WbKZV7@Z#s<obB^4N)HMR2m}zXoyw)FF){)O0g?ez3Q-D8 zA_-}2VP|D8XK7|Y>jp^I1rj<61yosjP(u&{82|E@sO~W$5F#Fr>@^~#!5a?C}qGi5S0H(_Eq JG&dRm7y)J%G&KMK delta 103 zcmV-t0GR)i1>gjr0$^VvT?hgY0T{N?obB^4N(Kr92m~?!k^x5wMG7$@33h2@Wp6KS za5O;G9Y~8GS{zJfOlUS%Z(%u3NmoC2PDU+nZ%i#aS3y`fZ+RL3A`p+Mo|eH#NEwJ< JczTb~(hWaXAsYYy diff --git a/app/src/androidTest/assets/backupTests/chat_item_view_once_09.binproto b/app/src/androidTest/assets/backupTests/chat_item_view_once_09.binproto index 5d81ba1367a2faf770475f0fc49e6b635cf02cfc..05c6c657c2d95c508abd58e8a8dc124da7575422 100644 GIT binary patch delta 114 zcmV-&0FD2m1nUH#0&8j_Xb1uj0T{Q@obB^4N)HMR2m}z=qwBSSI0FnWq0ScV~ z3YY;R32AL%XJs#EX=Xs%2uPD0S{zJAM=EA4Eom-nEpI|6bs;7(}qD%%cV(3`t6Hc~fgl zQAb5mbSMKbw!g)d^D#IALLfIVGB-9eG+|;nIAStlWn^Y$Vqr8nG&p8vHDzTmVlx^5 F7y;zMMiT%4 delta 139 zcmV;60CfMu1%m~k0)K%4B7X=15CIst(VXq`FiH&y3kU=dubs-Jt1&tNk^y20U2;0GC4A0WHx0tGiGKvFfuY@HfCWE02&Zk tV?AlrU77ayarlFpoZ{Fb5HxCE`Ft^glD%$o|Bxca`Y7nOr3C8&7y(BNG7bO$ diff --git a/app/src/androidTest/assets/backupTests/chat_item_view_once_11.binproto b/app/src/androidTest/assets/backupTests/chat_item_view_once_11.binproto index ba893754edbaad5f65373a8e9c08ea76d9a6a682..b8fa5a5dabd3c405a25196e9e2d522cf064ad4ad 100644 GIT binary patch delta 105 zcmcb}`iNx#Q&OT*JO`5iqr}dObKZV7@M7a);b3uMn8fJG<<4cS#95Y^lA5odTVUdF zRNAARFG|KI#nV5+-p|!C(j=s=ASfUx%hfQ#GR-ursKhLbL5e|1;9aOKQ)h#(Qn%dZ J>r*`wdI5)RAjJRx delta 217 zcmV;~04D$91knYc0)Ni|BFq5@0uTWhxzU{M^Ds&V3IqrQLI9EhwE+sU0ScV~A_-}2 zVP|D8aBgQR5N4s|-@WPq8ca`2-4-b&X)u5gK)x18y$D(yOlC}IHdb$8IZjDeKX*<> zEpKm3Ejw31SU7Ka3RemsIXN_BGC4IdHaTW9H#IahG+{Y4IZ`({WMyVBV`VvHG7th9 z5M2ah9olpsffNq@a6D%xs3H)VO({`n^L0f^m6x6G4C&G+=FPN;1TqD1WNAuTH~=CL TkEx!P!AM9Mh+lYmkI~W%hh0eY diff --git a/app/src/androidTest/assets/backupTests/chat_item_view_once_12.binproto b/app/src/androidTest/assets/backupTests/chat_item_view_once_12.binproto index aa6c883f1e5b3e40d4c7248dd2bc6b7eeacaa807..732254af87627ef6c2e96e0366e6db6479ec0cc1 100644 GIT binary patch delta 196 zcmV;#06YJ;1-u2I0)M&zBDVnu0uTWhy3w5N^Ds&c3JVAX5ZI&ZwXQWv0FnWj0ScA@ z3XuUK3TbU&XJs#HaAjv&985}5EH*Y}E`CFJbtO!1Oig@KG9@!tS4nSkZE9l*5c}Ao z9|t8g)%Rz*uEf)e+!7F2Nj@8}CX8LEXXvz4bwgPg%kr_S2R$MTNlI~fQ)^67M@3R} yC;~9Hzr~gFF+w0UI5askWieu6FfukcV>M)9I5szBIASz4G&eOgGc`FH02l#*^+Qhp delta 191 zcmV;w06_n|1-AvD0)MpuBC-Jp0uTWhy3w5N^Ds&c3JVAX5ZI&ZwXQWv0FnWe0Sb`; z3XB0F32AL%XJs#EX=Xs{21wThS{zJAM=EA4Eom-nEpISY0tf+;0jvQE zsR0U<0U`-@X=G(@FKuu%DiCI&`jV>vJ| zVlrf9Wi=208W1U?vhkI$_B+(b7)geP2^S&|_Is+3X4+HA_6$zR0J7fYDCoAO>jEMW TkEx!P!AM9Mh+lYmkI~W%D5Os# diff --git a/app/src/androidTest/assets/backupTests/chat_item_view_once_14.binproto b/app/src/androidTest/assets/backupTests/chat_item_view_once_14.binproto index 7ffb7f603e14e750e8b6236c206ce4dd6041f6bc..cd6c1692713b652337d77856acff6f9fcabaf897 100644 GIT binary patch delta 34 qcmeyzGMi-qleCnQ1P7AVH~Hf1h;LwI#1Om9q0d{Z(dGgnthZ*y%DF$x7#S$a@IA`mXu36_^i n^{1p+WeO#b@6jp{#QF+ZgURUw{MeK-_@A-rFp9X<<^>o52EQ;7 diff --git a/app/src/androidTest/assets/backupTests/recipient_contacts_00.binproto b/app/src/androidTest/assets/backupTests/recipient_contacts_00.binproto index e9777df1741c2d3a460bf0d35c94cbc497cb6cbc..188bbf1633b6219c68d474e75844741c833859b7 100644 GIT binary patch delta 25 gcmX@ke2RHPHY0nSPz(o)P{iaS#$eVJj0{!`0AGd%J^%m! delta 22 dcmX@be4KehHY0nqP$UP7Q0U|$#$YBZ1^`RI1&IIv diff --git a/app/src/androidTest/assets/backupTests/recipient_contacts_01.binproto b/app/src/androidTest/assets/backupTests/recipient_contacts_01.binproto index 17cf40d9e72e71c3266d35dcf47d6689020ae9bd..18a03fa1b702c50ffcd7b0bb8924f1c6da70e808 100644 GIT binary patch delta 11 ScmX@Za)xDtClfQH69WJjW&+{> delta 11 ScmX@Za)xDtClfP+69WJjV*=p- diff --git a/app/src/androidTest/assets/backupTests/recipient_contacts_02.binproto b/app/src/androidTest/assets/backupTests/recipient_contacts_02.binproto index 46703a8737fc9f8213ace30d78d153420a5ff6a3..7fb227c761d108bf45b9fc071b343fb667450f58 100644 GIT binary patch delta 18 acmX@ga+GC*H4_(;6FbL^#jm%nGX(%TQU==q delta 18 acmX@ga+GC*H4_)36FbL^#jm%nGX(%TNCw&f diff --git a/app/src/androidTest/assets/backupTests/recipient_contacts_03.binproto b/app/src/androidTest/assets/backupTests/recipient_contacts_03.binproto index 66b05efb600ae2b967912c9e3a5c588a98d39b9f..5f602ec265487bef5466b80a204ffd692e9211aa 100644 GIT binary patch delta 18 acmdnOvV~=X784h<6FbNHxu=${HUt1QYX(99 delta 18 acmdnOvV~=X784hf6FbNHxu=${HUt1QVFp0} diff --git a/app/src/androidTest/assets/backupTests/recipient_contacts_04.binproto b/app/src/androidTest/assets/backupTests/recipient_contacts_04.binproto index b2ccd6ea2f58f56590325763fb61494fd6ec5eb4..effe33c600fb51de3a08d42476b6249b6bee9091 100644 GIT binary patch delta 11 Scmcb>e1UnxSw?0SD+T}>umffQ delta 11 Scmcb>e1UnxSw?1ND+T}>tpjBM diff --git a/app/src/androidTest/assets/backupTests/recipient_contacts_05.binproto b/app/src/androidTest/assets/backupTests/recipient_contacts_05.binproto index 05c0529d428ae6af98e4b626a2242761733fbe56..1a03a944a50ab00612ae00a292a0b3a21c2191f2 100644 GIT binary patch delta 11 ScmZ3-vW{hgHWM?e69WJgW&(@= delta 11 ScmZ3-vW{hgHWM?869WJgV*-l+ diff --git a/app/src/androidTest/assets/backupTests/recipient_contacts_06.binproto b/app/src/androidTest/assets/backupTests/recipient_contacts_06.binproto index 022763952d320ead1092f81ef468e98357515bce..0f3f671db0b9d1d8385e1778b00e1cc0d3c5ddce 100644 GIT binary patch delta 18 acmX@aa)@Pv1rryW6FbL^#jm%nGX(%S?FQBW delta 18 acmX@aa)@Pv1rrym6FbL^#jm%nGX(%S;|A3L diff --git a/app/src/androidTest/assets/backupTests/recipient_contacts_07.binproto b/app/src/androidTest/assets/backupTests/recipient_contacts_07.binproto index d894d5a860298cc768d4552b0cee044bf5ed31be..bf94a61835f256553555620c7dad2bb7b84bfe2b 100644 GIT binary patch delta 18 acmdnWvXy0nHWL@S6FbNHxu=${HUt1Q!UjnI delta 18 acmdnWvXy0nHWL?{6FbNHxu=${HUt1QxCTf7 diff --git a/app/src/androidTest/assets/backupTests/recipient_contacts_08.binproto b/app/src/androidTest/assets/backupTests/recipient_contacts_08.binproto index 8adf672ddad5ec99ab5d8c75a59b1db569dd5a27..8a1a86c4d422992ec68a226e89473ebb77fb5035 100644 GIT binary patch delta 11 ScmaFN{Fr&e14d>JD+T}@ssp0{ delta 11 ScmaFN{Fr&e14d?cD+T}@rvst@ diff --git a/app/src/androidTest/assets/backupTests/recipient_contacts_09.binproto b/app/src/androidTest/assets/backupTests/recipient_contacts_09.binproto index 9d3588eb358df475f59325c3350c461c75cc90db..bd7912df09e192f49971a0847c6ea6f75230bdeb 100644 GIT binary patch delta 11 ScmdnOvV~=XArmvF69WJh4g#V8 delta 11 ScmdnOvV~=XArmu)69WJh3j(14 diff --git a/app/src/androidTest/assets/backupTests/recipient_contacts_10.binproto b/app/src/androidTest/assets/backupTests/recipient_contacts_10.binproto index bc8a1a6eb4c420b13d8b070e49b3b568b321e5cb..395596400b8a1febdd6d2cc62e843c6d702d50ee 100644 GIT binary patch delta 18 acmdnWvXy0nHWL?@6FbL^#jm%nGX(%QvIesN delta 18 acmdnWvXy0nHWL@86FbL^#jm%nGX(%Qs0OkC diff --git a/app/src/androidTest/assets/backupTests/recipient_contacts_11.binproto b/app/src/androidTest/assets/backupTests/recipient_contacts_11.binproto index fa5eec59590f8f06f14093f83f4cf8460bd3f68b..ef18d9da2dd12970f80ea08b470298701a0c32eb 100644 GIT binary patch delta 18 acmZ3@vYKUsA`=(46FbNHxu=${HUt1P6b3H< delta 18 acmZ3@vYKUsA`=&v6FbNHxu=${HUt1P3I;9! diff --git a/app/src/androidTest/assets/backupTests/recipient_groups_00.binproto b/app/src/androidTest/assets/backupTests/recipient_groups_00.binproto index 844a7e626ddbc1786d3a8db4f73de78ea961c2a9..bd64b3af3a3f4e0b7912fa4170a579e76693fd22 100644 GIT binary patch delta 33 pcmdnNwTo-RL>A6@j6$;+Ik=>zO`gRvmD_@WLyC=qQGhFe5dfh92Z;ax delta 31 ncmdnRwS#NJL>A6Dj6yRRIk=>zOrFIum6Jn?je}8uD}WIIkgEqt diff --git a/app/src/androidTest/assets/backupTests/recipient_groups_01.binproto b/app/src/androidTest/assets/backupTests/recipient_groups_01.binproto index cc0c9030b7def6a6d222cde6fb61bd0d8febbf52..d471bf0ccf51612bb971a47d4833cf1e1b8d9c43 100644 GIT binary patch delta 25 hcmey&{h52iBUV91ekooKMgcC315NL)&#?_)1ORT92v`6B delta 25 hcmey&{h52iBUV8MekooKMgcC315NL)&#?_)1ORS@2v-0A diff --git a/app/src/androidTest/assets/backupTests/recipient_groups_02.binproto b/app/src/androidTest/assets/backupTests/recipient_groups_02.binproto index f839f12d29923368014980ecf75e11ba1df90e80..8d5931e648cd6605a450952c8a4e3b490b489cfb 100644 GIT binary patch delta 25 hcmX@geUy8{7FIzfekooKMgcC38+Q*)ST2fqLS delta 25 hcmX@eeUN*@23A2fekooKMgcC32mLed-;fMo1OQ>C2fhFR diff --git a/app/src/androidTest/assets/backupTests/recipient_groups_08.binproto b/app/src/androidTest/assets/backupTests/recipient_groups_08.binproto index 42c251ab3feb1269dcc7ac6dc6ec9dfffe50d622..8bdb424e20c2e28998c4c816c3a6fd2d97c256a8 100644 GIT binary patch delta 18 ZcmdnRwTo+m0V@{=hZGwJqX1U`BLFFe0~`PV delta 18 ZcmdnRwTo+m0V@|fhZGwJqX1U`BLFFU0~-JU diff --git a/app/src/androidTest/assets/backupTests/recipient_groups_09.binproto b/app/src/androidTest/assets/backupTests/recipient_groups_09.binproto index 389998960518821356cd0c2714615d4292be432a..e133bcd1651c3b083ec0964e8f049167576744a3 100644 GIT binary patch delta 25 hcmey!{gHda16Dy!ekooKMgcC315NL)&#?_)1ORT92wDID delta 25 hcmey!{gHda16Dx}ekooKMgcC315NL)&#?_)1ORS@2w4CC diff --git a/app/src/androidTest/assets/backupTests/recipient_groups_10.binproto b/app/src/androidTest/assets/backupTests/recipient_groups_10.binproto index 376bf82dcba0c93c6dccd8a97e5bef237580f704..167f53fce3940b5ec113dd70bdfebfe490782171 100644 GIT binary patch delta 25 hcmX@keVlv4Hda9{ekooKMgcC38+Q*)S * val iterator = ArchivedMediaObjectIterator(cursor) @@ -1661,7 +1659,7 @@ class ArchiveMediaItemIterator(private val cursor: Cursor) : Iterator true + + else -> false + } + } } fun DatabaseAttachment.requireMediaName(): MediaName { @@ -77,7 +97,7 @@ fun DatabaseAttachment.createArchiveAttachmentPointer(useArchiveCdn: Boolean): S mediaId = this.requireMediaName().toMediaId(mediaRootBackupKey).encode() ) - id to archiveCdn + id to (archiveCdn ?: RemoteConfig.backupFallbackArchiveCdn) } else { if (remoteLocation.isNullOrEmpty()) { throw InvalidAttachmentException("empty content id") @@ -131,7 +151,7 @@ fun DatabaseAttachment.createArchiveThumbnailPointer(): SignalServiceAttachmentP val key = mediaRootBackupKey.deriveThumbnailTransitKey(requireThumbnailMediaName()) val mediaId = mediaRootBackupKey.deriveMediaId(requireThumbnailMediaName()).encode() SignalServiceAttachmentPointer( - cdnNumber = archiveCdn, + cdnNumber = archiveCdn ?: RemoteConfig.backupFallbackArchiveCdn, remoteId = SignalServiceAttachmentRemoteId.Backup( mediaCdnPath = mediaCdnPath, mediaId = mediaId diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/processor/AccountDataArchiveProcessor.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/processor/AccountDataArchiveProcessor.kt index 699ad1ff96..e719c81073 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/processor/AccountDataArchiveProcessor.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/processor/AccountDataArchiveProcessor.kt @@ -27,6 +27,7 @@ import org.thoughtcrime.securesms.components.settings.app.usernamelinks.Username import org.thoughtcrime.securesms.conversation.colors.ChatColors import org.thoughtcrime.securesms.database.SignalDatabase import org.thoughtcrime.securesms.database.model.InAppPaymentSubscriberRecord +import org.thoughtcrime.securesms.database.model.databaseprotos.InAppPaymentData import org.thoughtcrime.securesms.dependencies.AppDependencies import org.thoughtcrime.securesms.jobs.RetrieveProfileAvatarJob import org.thoughtcrime.securesms.keyvalue.PhoneNumberPrivacyValues @@ -37,6 +38,8 @@ import org.thoughtcrime.securesms.recipients.RecipientId import org.thoughtcrime.securesms.util.ProfileUtil import org.thoughtcrime.securesms.util.TextSecurePreferences import org.whispersystems.signalservice.api.push.UsernameLinkComponents +import org.whispersystems.signalservice.api.storage.IAPSubscriptionId.AppleIAPOriginalTransactionId +import org.whispersystems.signalservice.api.storage.IAPSubscriptionId.GooglePlayBillingPurchaseToken import org.whispersystems.signalservice.api.subscriptions.SubscriberId import org.whispersystems.signalservice.api.util.UuidUtil import org.whispersystems.signalservice.api.util.toByteArray @@ -61,6 +64,8 @@ object AccountDataArchiveProcessor { val chatColors = SignalStore.chatColors.chatColors val chatWallpaper = SignalStore.wallpaper.currentRawWallpaper + val backupSubscriberRecord = db.inAppPaymentSubscriberTable.getBackupsSubscriber() + emitter.emit( Frame( account = AccountData( @@ -98,6 +103,7 @@ object AccountDataArchiveProcessor { hasSeenGroupStoryEducationSheet = signalStore.storyValues.userHasSeenGroupStoryEducationSheet, hasCompletedUsernameOnboarding = signalStore.uiHintValues.hasCompletedUsernameOnboarding(), customChatColors = db.chatColorsTable.getSavedChatColors().toRemoteChatColors(), + optimizeOnDeviceStorage = signalStore.backupValues.optimizeStorage, defaultChatStyle = ChatStyleConverter.constructRemoteChatStyle( db = db, chatColors = chatColors, @@ -105,7 +111,8 @@ object AccountDataArchiveProcessor { chatWallpaper = chatWallpaper ) ), - donationSubscriberData = donationSubscriber?.toSubscriberData(signalStore.inAppPaymentValues.isDonationSubscriptionManuallyCancelled()) + donationSubscriberData = donationSubscriber?.toSubscriberData(signalStore.inAppPaymentValues.isDonationSubscriptionManuallyCancelled()), + backupsSubscriberData = backupSubscriberRecord?.toIAPSubscriberData() ) ) ) @@ -148,6 +155,26 @@ object AccountDataArchiveProcessor { } } + if (accountData.backupsSubscriberData != null && accountData.backupsSubscriberData.subscriberId.size > 0 && (accountData.backupsSubscriberData.purchaseToken != null || accountData.backupsSubscriberData.originalTransactionId != null)) { + val remoteSubscriberId = SubscriberId.fromBytes(accountData.backupsSubscriberData.subscriberId.toByteArray()) + val localSubscriber = InAppPaymentsRepository.getSubscriber(InAppPaymentSubscriberRecord.Type.BACKUP) + + val subscriber = InAppPaymentSubscriberRecord( + subscriberId = remoteSubscriberId, + currency = localSubscriber?.currency, + type = InAppPaymentSubscriberRecord.Type.BACKUP, + requiresCancel = localSubscriber?.requiresCancel ?: false, + paymentMethodType = InAppPaymentData.PaymentMethodType.UNKNOWN, + iapSubscriptionId = if (accountData.backupsSubscriberData.purchaseToken != null) { + GooglePlayBillingPurchaseToken(accountData.backupsSubscriberData.purchaseToken) + } else { + AppleIAPOriginalTransactionId(accountData.backupsSubscriberData.originalTransactionId!!) + } + ) + + InAppPaymentsRepository.setSubscriber(subscriber) + } + if (accountData.avatarUrlPath.isNotEmpty()) { AppDependencies.jobManager.add(RetrieveProfileAvatarJob(Recipient.self().fresh(), accountData.avatarUrlPath)) } @@ -184,6 +211,7 @@ object AccountDataArchiveProcessor { SignalStore.story.isFeatureDisabled = settings.storiesDisabled SignalStore.story.userHasSeenGroupStoryEducationSheet = settings.hasSeenGroupStoryEducationSheet SignalStore.story.viewedReceiptsEnabled = settings.storyViewReceiptsEnabled ?: settings.readReceipts + SignalStore.backup.optimizeStorage = settings.optimizeOnDeviceStorage settings.customChatColors .mapNotNull { chatColor -> @@ -288,6 +316,23 @@ object AccountDataArchiveProcessor { return AccountData.SubscriberData(subscriberId = subscriberId, currencyCode = currencyCode, manuallyCancelled = manuallyCancelled) } + private fun InAppPaymentSubscriberRecord?.toIAPSubscriberData(): AccountData.IAPSubscriberData? { + if (this == null) { + return null + } + + val builder = AccountData.IAPSubscriberData.Builder() + .subscriberId(this.subscriberId.bytes.toByteString()) + + if (this.iapSubscriptionId?.purchaseToken != null) { + builder.purchaseToken(this.iapSubscriptionId.purchaseToken) + } else if (this.iapSubscriptionId?.originalTransactionId != null) { + builder.originalTransactionId(this.iapSubscriptionId.originalTransactionId) + } + + return builder.build() + } + private fun List.toRemoteChatColors(): List { return this .mapNotNull { local -> diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/util/ArchiveConverterExtensions.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/util/ArchiveConverterExtensions.kt index cfc2e3c5d9..0d077d3e44 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/util/ArchiveConverterExtensions.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/util/ArchiveConverterExtensions.kt @@ -9,6 +9,7 @@ import okio.ByteString import okio.ByteString.Companion.toByteString import org.signal.core.util.Base64 import org.signal.core.util.emptyIfNull +import org.signal.core.util.isNotNullOrBlank import org.signal.core.util.nullIfBlank import org.signal.core.util.orNull import org.thoughtcrime.securesms.attachments.ArchivedAttachment @@ -45,19 +46,22 @@ fun FilePointer?.toLocalAttachment( uuid: ByteString? = null, quote: Boolean = false ): Attachment? { - if (this == null) return null + if (this == null || this.locatorInfo == null) return null - if (this.attachmentLocator != null) { + val hasMediaName = this.locatorInfo.mediaName.isNotEmpty() + val hasTransitInfo = this.locatorInfo.transitCdnKey != null + + if (hasTransitInfo && !hasMediaName) { val signalAttachmentPointer = SignalServiceAttachmentPointer( - cdnNumber = this.attachmentLocator.cdnNumber, - remoteId = SignalServiceAttachmentRemoteId.from(attachmentLocator.cdnKey), + cdnNumber = this.locatorInfo.transitCdnNumber ?: Cdn.CDN_0.cdnNumber, + remoteId = SignalServiceAttachmentRemoteId.from(locatorInfo.transitCdnKey), contentType = contentType, - key = this.attachmentLocator.key.toByteArray(), - size = Optional.ofNullable(attachmentLocator.size), + key = this.locatorInfo.key.toByteArray(), + size = Optional.ofNullable(locatorInfo.size), preview = Optional.empty(), width = this.width ?: 0, height = this.height ?: 0, - digest = Optional.ofNullable(this.attachmentLocator.digest.toByteArray()), + digest = Optional.ofNullable(this.locatorInfo.digest.toByteArray()), incrementalDigest = Optional.ofNullable(this.incrementalMac?.toByteArray()), incrementalMacChunkSize = this.incrementalMacChunkSize ?: 0, fileName = Optional.ofNullable(fileName), @@ -66,7 +70,7 @@ fun FilePointer?.toLocalAttachment( isGif = gif, caption = Optional.ofNullable(this.caption), blurHash = Optional.ofNullable(this.blurHash), - uploadTimestamp = this.attachmentLocator.uploadTimestamp?.clampToValidBackupRange() ?: 0, + uploadTimestamp = this.locatorInfo.transitTierUploadTimestamp?.clampToValidBackupRange() ?: 0, uuid = UuidUtil.fromByteStringOrNull(uuid) ) return PointerAttachment.forPointer( @@ -74,7 +78,7 @@ fun FilePointer?.toLocalAttachment( stickerLocator = stickerLocator, transferState = if (wasDownloaded) AttachmentTable.TRANSFER_NEEDS_RESTORE else AttachmentTable.TRANSFER_PROGRESS_PENDING ).orNull() - } else if (this.invalidAttachmentLocator != null) { + } else if (!hasMediaName) { return TombstoneAttachment( contentType = contentType, incrementalMac = this.incrementalMac?.toByteArray(), @@ -91,19 +95,20 @@ fun FilePointer?.toLocalAttachment( stickerLocator = stickerLocator, uuid = UuidUtil.fromByteStringOrNull(uuid) ) - } else if (this.backupLocator != null) { + } else { return ArchivedAttachment( contentType = contentType, - size = this.backupLocator.size.toLong(), - cdn = this.backupLocator.transitCdnNumber ?: Cdn.CDN_0.cdnNumber, - key = this.backupLocator.key.toByteArray(), + size = this.locatorInfo.size.toLong(), + cdn = this.locatorInfo.transitCdnNumber ?: Cdn.CDN_0.cdnNumber, + uploadTimestamp = this.locatorInfo.transitTierUploadTimestamp ?: 0, + key = this.locatorInfo.key.toByteArray(), iv = null, - cdnKey = this.backupLocator.transitCdnKey?.nullIfBlank(), - archiveCdn = this.backupLocator.cdnNumber, - archiveMediaName = this.backupLocator.mediaName, - archiveMediaId = importState.mediaRootBackupKey.deriveMediaId(MediaName(this.backupLocator.mediaName)).encode(), - archiveThumbnailMediaId = importState.mediaRootBackupKey.deriveMediaId(MediaName.forThumbnailFromMediaName(this.backupLocator.mediaName)).encode(), - digest = this.backupLocator.digest.toByteArray(), + cdnKey = this.locatorInfo.transitCdnKey?.nullIfBlank(), + archiveCdn = this.locatorInfo.mediaTierCdnNumber, + archiveMediaName = this.locatorInfo.mediaName, + archiveMediaId = importState.mediaRootBackupKey.deriveMediaId(MediaName(this.locatorInfo.mediaName)).encode(), + archiveThumbnailMediaId = importState.mediaRootBackupKey.deriveMediaId(MediaName.forThumbnailFromMediaName(this.locatorInfo.mediaName)).encode(), + digest = this.locatorInfo.digest.toByteArray(), incrementalMac = this.incrementalMac?.toByteArray(), incrementalMacChunkSize = this.incrementalMacChunkSize, width = this.width, @@ -119,7 +124,6 @@ fun FilePointer?.toLocalAttachment( fileName = fileName ) } - return null } /** @@ -136,49 +140,85 @@ fun DatabaseAttachment.toRemoteFilePointer(mediaArchiveEnabled: Boolean, content builder.caption = this.caption builder.blurHash = this.blurHash?.hash - if (this.remoteKey.isNullOrBlank() || this.remoteDigest == null || this.size == 0L) { - builder.invalidAttachmentLocator = FilePointer.InvalidAttachmentLocator() - return builder.build() + builder.setLegacyLocators(this, mediaArchiveEnabled) + builder.locatorInfo = this.toLocatorInfo() + + return builder.build() +} + +fun FilePointer.Builder.setLegacyLocators(attachment: DatabaseAttachment, mediaArchiveEnabled: Boolean) { + if (attachment.remoteKey.isNullOrBlank() || attachment.remoteDigest == null || attachment.size == 0L) { + this.invalidAttachmentLocator = FilePointer.InvalidAttachmentLocator() + return } - if (this.transferState == AttachmentTable.TRANSFER_PROGRESS_PERMANENT_FAILURE && this.archiveTransferState != AttachmentTable.ArchiveTransferState.FINISHED) { - builder.invalidAttachmentLocator = FilePointer.InvalidAttachmentLocator() - return builder.build() + if (attachment.transferState == AttachmentTable.TRANSFER_PROGRESS_PERMANENT_FAILURE && attachment.archiveTransferState != AttachmentTable.ArchiveTransferState.FINISHED) { + this.invalidAttachmentLocator = FilePointer.InvalidAttachmentLocator() + return } - val pending = this.archiveTransferState != AttachmentTable.ArchiveTransferState.FINISHED && (this.transferState != AttachmentTable.TRANSFER_PROGRESS_DONE && this.transferState != AttachmentTable.TRANSFER_RESTORE_OFFLOADED) + val pending = attachment.archiveTransferState != AttachmentTable.ArchiveTransferState.FINISHED && (attachment.transferState != AttachmentTable.TRANSFER_PROGRESS_DONE && attachment.transferState != AttachmentTable.TRANSFER_RESTORE_OFFLOADED) if (mediaArchiveEnabled && !pending) { - val transitCdnKey = this.remoteLocation?.nullIfBlank() - val transitCdnNumber = this.cdn.cdnNumber.takeIf { transitCdnKey != null } - val archiveMediaName = this.getMediaName()?.toString() + val transitCdnKey = attachment.remoteLocation?.nullIfBlank() + val transitCdnNumber = attachment.cdn.cdnNumber.takeIf { transitCdnKey != null } + val archiveMediaName = attachment.getMediaName()?.toString() - builder.backupLocator = FilePointer.BackupLocator( + this.backupLocator = FilePointer.BackupLocator( mediaName = archiveMediaName.emptyIfNull(), - cdnNumber = this.archiveCdn.takeIf { archiveMediaName != null }, - key = Base64.decode(remoteKey).toByteString(), - size = this.size.toInt(), - digest = this.remoteDigest.toByteString(), + cdnNumber = attachment.archiveCdn.takeIf { archiveMediaName != null }, + key = Base64.decode(attachment.remoteKey).toByteString(), + size = attachment.size.toInt(), + digest = attachment.remoteDigest.toByteString(), transitCdnNumber = transitCdnNumber, transitCdnKey = transitCdnKey ) - return builder.build() + return } - if (this.remoteLocation.isNullOrBlank()) { - builder.invalidAttachmentLocator = FilePointer.InvalidAttachmentLocator() - return builder.build() + if (attachment.remoteLocation.isNullOrBlank()) { + this.invalidAttachmentLocator = FilePointer.InvalidAttachmentLocator() + return } - builder.attachmentLocator = FilePointer.AttachmentLocator( - cdnKey = this.remoteLocation, - cdnNumber = this.cdn.cdnNumber, - uploadTimestamp = this.uploadTimestamp.takeIf { it > 0 }?.clampToValidBackupRange(), - key = Base64.decode(remoteKey).toByteString(), - size = this.size.toInt(), - digest = this.remoteDigest.toByteString() + this.attachmentLocator = FilePointer.AttachmentLocator( + cdnKey = attachment.remoteLocation, + cdnNumber = attachment.cdn.cdnNumber, + uploadTimestamp = attachment.uploadTimestamp.takeIf { it > 0 }?.clampToValidBackupRange(), + key = Base64.decode(attachment.remoteKey).toByteString(), + size = attachment.size.toInt(), + digest = attachment.remoteDigest.toByteString() ) - return builder.build() +} + +fun DatabaseAttachment.toLocatorInfo(): FilePointer.LocatorInfo { + if (this.remoteKey.isNullOrBlank() || this.remoteDigest == null || this.size == 0L) { + return FilePointer.LocatorInfo() + } + + if (this.transferState == AttachmentTable.TRANSFER_PROGRESS_PERMANENT_FAILURE && this.archiveTransferState != AttachmentTable.ArchiveTransferState.FINISHED) { + return FilePointer.LocatorInfo() + } + + val locatorBuilder = FilePointer.LocatorInfo.Builder() + + val remoteKey = Base64.decode(this.remoteKey).toByteString() + val archiveMediaName = this.getMediaName()?.toString() + + locatorBuilder.key = remoteKey + locatorBuilder.digest = this.remoteDigest.toByteString() + locatorBuilder.size = this.size.toInt() + + if (this.remoteLocation.isNotNullOrBlank()) { + locatorBuilder.transitCdnKey = this.remoteLocation + locatorBuilder.transitCdnNumber = this.cdn.cdnNumber + locatorBuilder.transitTierUploadTimestamp = this.uploadTimestamp.takeIf { it > 0 }?.clampToValidBackupRange() + } + + locatorBuilder.mediaTierCdnNumber = this.archiveCdn?.takeIf { archiveMediaName != null } + locatorBuilder.mediaName = archiveMediaName.emptyIfNull() + + return locatorBuilder.build() } fun Long.clampToValidBackupRange(): Long { diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/AttachmentTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/AttachmentTable.kt index d9f6c358b4..da6c565015 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/AttachmentTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/AttachmentTable.kt @@ -54,6 +54,7 @@ import org.signal.core.util.readToSingleObject import org.signal.core.util.requireBlob import org.signal.core.util.requireBoolean import org.signal.core.util.requireInt +import org.signal.core.util.requireIntOrNull import org.signal.core.util.requireLong import org.signal.core.util.requireNonNullBlob import org.signal.core.util.requireNonNullString @@ -264,7 +265,7 @@ class AttachmentTable( $UPLOAD_TIMESTAMP INTEGER DEFAULT 0, $DATA_HASH_START TEXT DEFAULT NULL, $DATA_HASH_END TEXT DEFAULT NULL, - $ARCHIVE_CDN INTEGER DEFAULT 0, + $ARCHIVE_CDN INTEGER DEFAULT NULL, $ARCHIVE_TRANSFER_FILE TEXT DEFAULT NULL, $ARCHIVE_TRANSFER_STATE INTEGER DEFAULT ${ArchiveTransferState.NONE.value}, $THUMBNAIL_FILE TEXT DEFAULT NULL, @@ -705,7 +706,7 @@ class AttachmentTable( .update(TABLE_NAME) .values( ARCHIVE_TRANSFER_STATE to ArchiveTransferState.NONE.value, - ARCHIVE_CDN to 0 + ARCHIVE_CDN to null ) .where("$REMOTE_DIGEST = ?", digest) .run() @@ -1977,7 +1978,7 @@ class AttachmentTable( displayOrder = jsonObject.getInt(DISPLAY_ORDER), uploadTimestamp = jsonObject.getLong(UPLOAD_TIMESTAMP), dataHash = jsonObject.getString(DATA_HASH_END), - archiveCdn = jsonObject.getInt(ARCHIVE_CDN), + archiveCdn = if (jsonObject.isNull(ARCHIVE_CDN)) null else jsonObject.getInt(ARCHIVE_CDN), thumbnailRestoreState = ThumbnailRestoreState.deserialize(jsonObject.getInt(THUMBNAIL_RESTORE_STATE)), archiveTransferState = ArchiveTransferState.deserialize(jsonObject.getInt(ARCHIVE_TRANSFER_STATE)), uuid = UuidUtil.parseOrNull(jsonObject.getString(ATTACHMENT_UUID)) @@ -2064,7 +2065,7 @@ class AttachmentTable( writableDatabase .update(TABLE_NAME) .values( - ARCHIVE_CDN to 0 + ARCHIVE_CDN to null ) .where(query.where, query.whereArgs) .run() @@ -2075,7 +2076,7 @@ class AttachmentTable( writableDatabase .updateAll(TABLE_NAME) .values( - ARCHIVE_CDN to 0, + ARCHIVE_CDN to null, ARCHIVE_TRANSFER_STATE to ArchiveTransferState.NONE.value ) .run() @@ -2630,7 +2631,7 @@ class AttachmentTable( displayOrder = cursor.requireInt(DISPLAY_ORDER), uploadTimestamp = cursor.requireLong(UPLOAD_TIMESTAMP), dataHash = cursor.requireString(DATA_HASH_END), - archiveCdn = cursor.requireInt(ARCHIVE_CDN), + archiveCdn = cursor.requireIntOrNull(ARCHIVE_CDN), thumbnailRestoreState = ThumbnailRestoreState.deserialize(cursor.requireInt(THUMBNAIL_RESTORE_STATE)), archiveTransferState = ArchiveTransferState.deserialize(cursor.requireInt(ARCHIVE_TRANSFER_STATE)), uuid = UuidUtil.parseOrNull(cursor.requireString(ATTACHMENT_UUID)) @@ -2658,7 +2659,7 @@ class AttachmentTable( hashEnd = this.requireString(DATA_HASH_END), transformProperties = TransformProperties.parse(this.requireString(TRANSFORM_PROPERTIES)), uploadTimestamp = this.requireLong(UPLOAD_TIMESTAMP), - archiveCdn = this.requireInt(ARCHIVE_CDN), + archiveCdn = this.requireIntOrNull(ARCHIVE_CDN), archiveTransferState = this.requireInt(ARCHIVE_TRANSFER_STATE), thumbnailFile = this.requireString(THUMBNAIL_FILE), thumbnailRandom = this.requireBlob(THUMBNAIL_RANDOM), @@ -2726,7 +2727,7 @@ class AttachmentTable( val hashEnd: String?, val transformProperties: TransformProperties, val uploadTimestamp: Long, - val archiveCdn: Int, + val archiveCdn: Int?, val archiveTransferState: Int, val thumbnailFile: String?, val thumbnailRandom: ByteArray?, diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/BackupMediaSnapshotTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/BackupMediaSnapshotTable.kt index 24367aa446..d83981c590 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/BackupMediaSnapshotTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/BackupMediaSnapshotTable.kt @@ -15,6 +15,7 @@ import org.signal.core.util.readToList import org.signal.core.util.readToSet import org.signal.core.util.requireBoolean import org.signal.core.util.requireInt +import org.signal.core.util.requireIntOrNull import org.signal.core.util.requireNonNullBlob import org.signal.core.util.requireNonNullString import org.signal.core.util.select @@ -257,7 +258,7 @@ class BackupMediaSnapshotTable(context: Context, database: SignalDatabase) : Dat class ArchiveMediaItem( val mediaId: String, val thumbnailMediaId: String, - val cdn: Int, + val cdn: Int?, val digest: ByteArray ) @@ -268,7 +269,7 @@ class BackupMediaSnapshotTable(context: Context, database: SignalDatabase) : Dat class MediaEntry( val mediaId: String, - val cdn: Int, + val cdn: Int?, val digest: ByteArray, val isThumbnail: Boolean ) { @@ -276,7 +277,7 @@ class BackupMediaSnapshotTable(context: Context, database: SignalDatabase) : Dat fun fromCursor(cursor: Cursor): MediaEntry { return MediaEntry( mediaId = cursor.requireNonNullString(MEDIA_ID), - cdn = cursor.requireInt(CDN), + cdn = cursor.requireIntOrNull(CDN), digest = cursor.requireNonNullBlob(REMOTE_DIGEST), isThumbnail = cursor.requireBoolean(IS_THUMBNAIL) ) diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/helpers/SignalDatabaseMigrations.kt b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/SignalDatabaseMigrations.kt index 85170629cc..5951501449 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/helpers/SignalDatabaseMigrations.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/SignalDatabaseMigrations.kt @@ -130,6 +130,7 @@ import org.thoughtcrime.securesms.database.helpers.migration.V272_UpdateUnreadCo import org.thoughtcrime.securesms.database.helpers.migration.V273_FixUnreadOriginalMessages import org.thoughtcrime.securesms.database.helpers.migration.V274_BackupMediaSnapshotLastSeenOnRemote import org.thoughtcrime.securesms.database.helpers.migration.V275_EnsureDefaultAllChatsFolder +import org.thoughtcrime.securesms.database.helpers.migration.V276_AttachmentCdnDefaultValueMigration import org.thoughtcrime.securesms.database.SQLiteDatabase as SignalSqliteDatabase /** @@ -265,10 +266,11 @@ object SignalDatabaseMigrations { 272 to V272_UpdateUnreadCountIndices, 273 to V273_FixUnreadOriginalMessages, 274 to V274_BackupMediaSnapshotLastSeenOnRemote, - 275 to V275_EnsureDefaultAllChatsFolder + 275 to V275_EnsureDefaultAllChatsFolder, + 276 to V276_AttachmentCdnDefaultValueMigration ) - const val DATABASE_VERSION = 275 + const val DATABASE_VERSION = 276 @JvmStatic fun migrate(context: Application, db: SignalSqliteDatabase, oldVersion: Int, newVersion: Int) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/helpers/migration/V276_AttachmentCdnDefaultValueMigration.kt b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/migration/V276_AttachmentCdnDefaultValueMigration.kt new file mode 100644 index 0000000000..6adcc206a0 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/migration/V276_AttachmentCdnDefaultValueMigration.kt @@ -0,0 +1,108 @@ +/* + * Copyright 2025 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.thoughtcrime.securesms.database.helpers.migration + +import android.app.Application +import org.signal.core.util.Stopwatch +import org.signal.core.util.logging.Log +import org.thoughtcrime.securesms.database.SQLiteDatabase + +/** + * We want to be able to distinguish between an unset CDN (null) and CDN 0. But we default the current CDN values to zero. + * This migration updates things so that the CDN columns default to null. We also consider all current CDN 0's to actually be unset values. + */ +object V276_AttachmentCdnDefaultValueMigration : SignalDatabaseMigration { + + private val TAG = Log.tag(V276_AttachmentCdnDefaultValueMigration::class) + + override fun migrate(context: Application, db: SQLiteDatabase, oldVersion: Int, newVersion: Int) { + val stopwatch = Stopwatch("v276") + + db.execSQL("UPDATE attachment SET archive_cdn = NULL WHERE archive_cdn = 0") + stopwatch.split("fix-old-data") + + db.execSQL( + """ + CREATE TABLE attachment_tmp ( + _id INTEGER PRIMARY KEY AUTOINCREMENT, + message_id INTEGER, + content_type TEXT, + remote_key TEXT, + remote_location TEXT, + remote_digest BLOB, + remote_incremental_digest BLOB, + remote_incremental_digest_chunk_size INTEGER DEFAULT 0, + cdn_number INTEGER DEFAULT 0, + transfer_state INTEGER, + transfer_file TEXT DEFAULT NULL, + data_file TEXT, + data_size INTEGER, + data_random BLOB, + file_name TEXT, + fast_preflight_id TEXT, + voice_note INTEGER DEFAULT 0, + borderless INTEGER DEFAULT 0, + video_gif INTEGER DEFAULT 0, + quote INTEGER DEFAULT 0, + width INTEGER DEFAULT 0, + height INTEGER DEFAULT 0, + caption TEXT DEFAULT NULL, + sticker_pack_id TEXT DEFAULT NULL, + sticker_pack_key DEFAULT NULL, + sticker_id INTEGER DEFAULT -1, + sticker_emoji STRING DEFAULT NULL, + blur_hash TEXT DEFAULT NULL, + transform_properties TEXT DEFAULT NULL, + display_order INTEGER DEFAULT 0, + upload_timestamp INTEGER DEFAULT 0, + data_hash_start TEXT DEFAULT NULL, + data_hash_end TEXT DEFAULT NULL, + archive_cdn INTEGER DEFAULT NULL, + archive_transfer_file TEXT DEFAULT NULL, + archive_transfer_state INTEGER DEFAULT 0, + thumbnail_file TEXT DEFAULT NULL, + thumbnail_random BLOB DEFAULT NULL, + thumbnail_restore_state INTEGER DEFAULT 0, + attachment_uuid TEXT DEFAULT NULL, + remote_iv BLOB DEFAULT NULL, + offload_restored_at INTEGER DEFAULT 0 + ) + """ + ) + stopwatch.split("create-new-table") + + db.execSQL("INSERT INTO attachment_tmp SELECT * FROM attachment") + stopwatch.split("copy-data") + + db.execSQL("DROP TABLE attachment") + stopwatch.split("drop-table") + + db.execSQL("ALTER TABLE attachment_tmp RENAME TO attachment") + stopwatch.split("rename-table") + + db.execSQL("CREATE INDEX IF NOT EXISTS attachment_message_id_index ON attachment (message_id);") + db.execSQL("CREATE INDEX IF NOT EXISTS attachment_transfer_state_index ON attachment (transfer_state);") + db.execSQL("CREATE INDEX IF NOT EXISTS attachment_sticker_pack_id_index ON attachment (sticker_pack_id);") + db.execSQL("CREATE INDEX IF NOT EXISTS attachment_data_hash_start_index ON attachment (data_hash_start);") + db.execSQL("CREATE INDEX IF NOT EXISTS attachment_data_hash_end_index ON attachment (data_hash_end);") + db.execSQL("CREATE INDEX IF NOT EXISTS attachment_data_index ON attachment (data_file);") + db.execSQL("CREATE INDEX IF NOT EXISTS attachment_archive_transfer_state ON attachment (archive_transfer_state);") + db.execSQL("CREATE INDEX IF NOT EXISTS attachment_remote_digest_index ON attachment (remote_digest);") + stopwatch.split("create-indexes") + + db.execSQL( + """ + CREATE TRIGGER msl_attachment_delete AFTER DELETE ON attachment + BEGIN + DELETE FROM msl_payload WHERE _id IN (SELECT payload_id FROM msl_message WHERE msl_message.message_id = old.message_id); + END + """ + ) + stopwatch.split("create-triggers") + + stopwatch.stop(TAG) + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/ArchiveThumbnailUploadJob.kt b/app/src/main/java/org/thoughtcrime/securesms/jobs/ArchiveThumbnailUploadJob.kt index e0d878ec5d..7d1c37dfa7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/ArchiveThumbnailUploadJob.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/ArchiveThumbnailUploadJob.kt @@ -132,8 +132,6 @@ class ArchiveThumbnailUploadJob private constructor( return Result.retry(defaultBackoff()) } - val mediaSecrets = mediaRootBackupKey.deriveMediaSecrets(attachment.requireThumbnailMediaName()) - return when (val result = BackupRepository.copyThumbnailToArchive(attachmentPointer, attachment)) { is NetworkResult.Success -> { // save attachment thumbnail diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/RestoreAttachmentJob.kt b/app/src/main/java/org/thoughtcrime/securesms/jobs/RestoreAttachmentJob.kt index 07648a256c..c70ab070cc 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/RestoreAttachmentJob.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/RestoreAttachmentJob.kt @@ -241,7 +241,7 @@ class RestoreAttachmentJob private constructor( val downloadResult = if (useArchiveCdn) { archiveFile = SignalDatabase.attachments.getOrCreateArchiveTransferFile(attachmentId) - val cdnCredentials = BackupRepository.getCdnReadCredentials(BackupRepository.CredentialType.MEDIA, attachment.archiveCdn).successOrThrow().headers + val cdnCredentials = BackupRepository.getCdnReadCredentials(BackupRepository.CredentialType.MEDIA, attachment.archiveCdn ?: RemoteConfig.backupFallbackArchiveCdn).successOrThrow().headers messageReceiver .retrieveArchivedAttachment( diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/RestoreAttachmentThumbnailJob.kt b/app/src/main/java/org/thoughtcrime/securesms/jobs/RestoreAttachmentThumbnailJob.kt index 433fa8fce9..09763eb588 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/RestoreAttachmentThumbnailJob.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/RestoreAttachmentThumbnailJob.kt @@ -126,7 +126,7 @@ class RestoreAttachmentThumbnailJob private constructor( override fun shouldCancel(): Boolean = this@RestoreAttachmentThumbnailJob.isCanceled } - val cdnCredentials = BackupRepository.getCdnReadCredentials(BackupRepository.CredentialType.MEDIA, attachment.archiveCdn).successOrThrow().headers + val cdnCredentials = BackupRepository.getCdnReadCredentials(BackupRepository.CredentialType.MEDIA, attachment.archiveCdn ?: RemoteConfig.backupFallbackArchiveCdn).successOrThrow().headers val pointer = attachment.createArchiveThumbnailPointer() Log.i(TAG, "Downloading thumbnail for $attachmentId") @@ -142,7 +142,7 @@ class RestoreAttachmentThumbnailJob private constructor( progressListener ) - SignalDatabase.attachments.finalizeAttachmentThumbnailAfterDownload(attachmentId, attachment.remoteDigest!!, downloadResult.dataStream, thumbnailTransferFile) + SignalDatabase.attachments.finalizeAttachmentThumbnailAfterDownload(attachmentId, attachment.remoteDigest, downloadResult.dataStream, thumbnailTransferFile) if (!SignalDatabase.messages.isStory(messageId)) { AppDependencies.messageNotifier.updateNotification(context) diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/RemoteConfig.kt b/app/src/main/java/org/thoughtcrime/securesms/util/RemoteConfig.kt index 8f7ab5abff..ffe6c76a7a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/RemoteConfig.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/util/RemoteConfig.kt @@ -982,6 +982,13 @@ object RemoteConfig { BuildConfig.MESSAGE_BACKUP_RESTORE_ENABLED || value.asBoolean(false) } + val backupFallbackArchiveCdn: Int by remoteInt( + key = "global.backups.mediaTierFallbackCdnNumber", + hotSwappable = true, + active = true, + defaultValue = 3 + ) + /** Whether unauthenticated chat web socket is backed by libsignal-net */ @JvmStatic @get:JvmName("libSignalWebSocketEnabled") diff --git a/app/src/main/protowire/Backup.proto b/app/src/main/protowire/Backup.proto index 5ac5ceb260..b19ebe330f 100644 --- a/app/src/main/protowire/Backup.proto +++ b/app/src/main/protowire/Backup.proto @@ -87,6 +87,7 @@ message AccountData { PhoneNumberSharingMode phoneNumberSharingMode = 17; ChatStyle defaultChatStyle = 18; repeated ChatStyle.CustomChatColor customChatColors = 19; + bool optimizeOnDeviceStorage = 20; } message SubscriberData { @@ -689,6 +690,7 @@ message MessageAttachment { message FilePointer { // References attachments in the backup (media) storage tier. + // DEPRECATED; use LocatorInfo instead if available. message BackupLocator { string mediaName = 1; // If present, the cdn number of the succesful upload. @@ -698,6 +700,7 @@ message FilePointer { bytes key = 3; bytes digest = 4; uint32 size = 5; + // Fallback in case backup tier upload failed. optional string transitCdnKey = 6; optional uint32 transitCdnNumber = 7; @@ -707,6 +710,7 @@ message FilePointer { // May be downloaded or not when the backup is generated; // primarily for free-tier users who cannot copy the // attachments to the backup (media) storage tier. + // DEPRECATED; use LocatorInfo instead if available. message AttachmentLocator { string cdnKey = 1; uint32 cdnNumber = 2; @@ -721,12 +725,14 @@ message FilePointer { // CDN keys or anything else that makes download attempts impossible. // This serves as a 'tombstone' so that the UX can show that an attachment // did exist, but for whatever reason it's not retrievable. + // DEPRECATED; use LocatorInfo instead if available. message InvalidAttachmentLocator { } // References attachments in a local encrypted backup. // Importers should first attempt to read the file from the local backup, // and on failure fallback to backup and transit cdn if possible. + // DEPRECATED; use LocatorInfo instead if available. message LocalLocator { string mediaName = 1; // Separate key used to encrypt this file for the local backup. @@ -742,7 +748,45 @@ message FilePointer { optional uint32 transitCdnNumber = 8; } + message LocatorInfo { + // Must be non-empty if transitCdnKey or mediaName are set/nonempty. + // Otherwise must be empty. + bytes key = 1; + // From the sender of the attachment (incl. ourselves) + // Must be non-empty if transitCdnKey or mediaName are set/nonempty. + // Otherwise must be empty. + bytes digest = 2; + // Must be non-zero if transitCdnKey or mediaName are set/nonempty. + // Otherwise must be zero. + uint32 size = 3; + + // Either both transit cdn key and number are set or neither should be set. + // Upload timestamp is optional but should only be set if key/number are set. + optional string transitCdnKey = 4; + optional uint32 transitCdnNumber = 5; + optional uint64 transitTierUploadTimestamp = 6; + + // If present, the cdn number of the succesful upload to media tier. + // If unset, may still have been uploaded, and clients + // can discover the cdn number via the list endpoint. + // Exporting clients should set this as long as their subscription + // has not rotated since last upload; even if currently free tier. + optional uint32 mediaTierCdnNumber = 7; + + // Nonempty any time the attachment was downloaded and its + // digest validated, whether free tier or paid subscription. + string mediaName = 8; + + // Separate key used to encrypt this file for the local backup. + // Generally required for local backups. + // Missing field indicates attachment was not available locally + // when the backup was generated, but remote backup or transit + // info was available. + optional bytes localKey = 9; + } + // If unset, importers should consider it to be an InvalidAttachmentLocator without throwing an error. + // DEPRECATED; use locatorInfo instead. oneof locator { BackupLocator backupLocator = 1; AttachmentLocator attachmentLocator = 2; @@ -758,6 +802,7 @@ message FilePointer { optional uint32 height = 9; optional string caption = 10; optional string blurHash = 11; + LocatorInfo locatorInfo = 13; } message Quote { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index f5b5c06e4d..5c603876ed 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -13,7 +13,7 @@ androidx-window = "1.3.0" glide = "4.15.1" gradle = "8.9.0" kotlin = "2.1.0" -libsignal-client = "0.73.0" +libsignal-client = "0.73.1" mp4parser = "1.9.39" android-gradle-plugin = "8.7.2" accompanist = "0.28.0" diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index fa719a3fd2..cf642fd505 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -7180,20 +7180,20 @@ https://docs.gradle.org/current/userguide/dependency_verification.html - - - + + + - - + + - - - + + + - - + +