From 57f86008d1d6eb39fc14bbff55098b13610ce7a9 Mon Sep 17 00:00:00 2001 From: Frederic Jacobs Date: Sat, 23 May 2015 15:54:50 +0200 Subject: [PATCH] UX and Notifications fixes - Removes large confusing UX bar and related assets. Replaced with UISwitch. - Enhanced user experience for missed calls. - Fixes issue where missed call would appear as incoming call in call log. - Fixing issues where PushKit handler not called on launch. --- Signal.xcodeproj/project.pbxproj | 18 +- .../xcshareddata/xcschemes/Signal.xcscheme | 6 +- .../AppIcon.appiconset/Contents.json | 3 + .../archive-active@1x.imageset/Contents.json | 12 - .../archive_active.pdf | 587 ----------------- .../Contents.json | 12 - .../archive_inactive.pdf | 589 ----------------- .../inbox-active@1x.imageset/Contents.json | 12 - .../inbox-active@1x.imageset/inbox_active.pdf | 587 ----------------- .../inbox-inactive@1x.imageset/Contents.json | 12 - .../inbox_inactive.pdf | 590 ------------------ Signal/Signal-Info.plist | 2 +- Signal/src/AppDelegate.m | 11 +- Signal/src/Storyboard/Storyboard.storyboard | 304 +-------- Signal/src/call/RecentCallManager.m | 23 +- Signal/src/environment/Environment.m | 18 +- Signal/src/environment/VersionMigrations.m | 1 + Signal/src/network/PushManager.h | 5 + Signal/src/network/PushManager.m | 61 +- Signal/src/phone/PhoneManager.h | 2 + Signal/src/phone/PhoneManager.m | 10 +- Signal/src/phone/callstate/CallController.h | 1 + Signal/src/phone/callstate/CallController.m | 7 + Signal/src/phone/callstate/CallTermination.h | 1 + Signal/src/textsecure/Messages/TSCall.m | 2 +- .../src/textsecure/Messages/TSErrorMessage.m | 4 + Signal/src/textsecure/Messages/TSMessage.m | 4 +- .../textsecure/Messages/TSMessagesManager.h | 4 + .../textsecure/Messages/TSMessagesManager.m | 72 ++- .../API/Requests/TSRecipientPrekeyRequest.m | 3 +- .../Network/WebSockets/TSSocketManager.h | 2 +- .../Network/WebSockets/TSSocketManager.m | 60 +- Signal/src/textsecure/TSConstants.h | 8 +- .../view controllers/MessagesViewController.h | 4 + .../view controllers/MessagesViewController.m | 81 ++- ...otificationSettingsOptionsViewController.m | 14 +- .../UITests/SignalsViewController.h | 4 +- .../UITests/SignalsViewController.m | 36 +- .../translations/ar.lproj/Localizable.strings | Bin 26154 -> 26606 bytes .../az_AZ.lproj/Localizable.strings | Bin 26380 -> 26832 bytes .../bg_BG.lproj/Localizable.strings | Bin 26276 -> 26728 bytes .../translations/bs.lproj/Localizable.strings | Bin 26374 -> 26826 bytes .../translations/ca.lproj/Localizable.strings | Bin 26434 -> 26886 bytes .../translations/cs.lproj/Localizable.strings | Bin 26128 -> 26580 bytes .../translations/da.lproj/Localizable.strings | Bin 27196 -> 27648 bytes .../translations/de.lproj/Localizable.strings | Bin 29086 -> 29608 bytes .../el_GR.lproj/Localizable.strings | Bin 26640 -> 27092 bytes .../translations/en.lproj/Localizable.strings | Bin 26364 -> 26766 bytes .../translations/es.lproj/Localizable.strings | Bin 28384 -> 28784 bytes .../et_EE.lproj/Localizable.strings | Bin 26252 -> 0 bytes .../translations/fa.lproj/Localizable.strings | Bin 26252 -> 0 bytes .../translations/fi.lproj/Localizable.strings | Bin 28022 -> 28540 bytes .../fil.lproj/Localizable.strings | Bin 26538 -> 26990 bytes .../translations/fr.lproj/Localizable.strings | Bin 28750 -> 29208 bytes .../translations/he.lproj/Localizable.strings | Bin 25140 -> 25592 bytes .../hi_IN.lproj/Localizable.strings | Bin 26250 -> 0 bytes .../translations/hr.lproj/Localizable.strings | Bin 26502 -> 26954 bytes .../translations/hu.lproj/Localizable.strings | Bin 27790 -> 28250 bytes .../id_ID.lproj/Localizable.strings | Bin 26252 -> 26398 bytes .../it_IT.lproj/Localizable.strings | Bin 28034 -> 28486 bytes .../ja_JP.lproj/Localizable.strings | Bin 23740 -> 24192 bytes .../ko_KR.lproj/Localizable.strings | Bin 21474 -> 21926 bytes .../translations/lv.lproj/Localizable.strings | Bin 26260 -> 26712 bytes .../nb_NO.lproj/Localizable.strings | Bin 26574 -> 27016 bytes .../translations/nl.lproj/Localizable.strings | Bin 27972 -> 28424 bytes .../translations/pl.lproj/Localizable.strings | Bin 27452 -> 27904 bytes .../pt_BR.lproj/Localizable.strings | Bin 27816 -> 28268 bytes .../pt_PT.lproj/Localizable.strings | Bin 27550 -> 28052 bytes .../translations/ro.lproj/Localizable.strings | Bin 26336 -> 26788 bytes .../translations/ru.lproj/Localizable.strings | Bin 27850 -> 28302 bytes .../translations/sl.lproj/Localizable.strings | Bin 27310 -> 27772 bytes .../sv_SE.lproj/Localizable.strings | Bin 26920 -> 27390 bytes .../th_TH.lproj/Localizable.strings | Bin 26298 -> 26750 bytes .../tr_TR.lproj/Localizable.strings | Bin 26934 -> 27386 bytes .../translations/uk.lproj/Localizable.strings | Bin 26252 -> 0 bytes .../zh_CN.lproj/Localizable.strings | Bin 19960 -> 19518 bytes 76 files changed, 404 insertions(+), 2768 deletions(-) delete mode 100644 Signal/Images.xcassets/archive-active@1x.imageset/Contents.json delete mode 100644 Signal/Images.xcassets/archive-active@1x.imageset/archive_active.pdf delete mode 100644 Signal/Images.xcassets/archive-inactive@1x.imageset/Contents.json delete mode 100644 Signal/Images.xcassets/archive-inactive@1x.imageset/archive_inactive.pdf delete mode 100644 Signal/Images.xcassets/inbox-active@1x.imageset/Contents.json delete mode 100644 Signal/Images.xcassets/inbox-active@1x.imageset/inbox_active.pdf delete mode 100644 Signal/Images.xcassets/inbox-inactive@1x.imageset/Contents.json delete mode 100644 Signal/Images.xcassets/inbox-inactive@1x.imageset/inbox_inactive.pdf delete mode 100644 Signal/translations/et_EE.lproj/Localizable.strings delete mode 100644 Signal/translations/fa.lproj/Localizable.strings delete mode 100644 Signal/translations/hi_IN.lproj/Localizable.strings delete mode 100644 Signal/translations/uk.lproj/Localizable.strings diff --git a/Signal.xcodeproj/project.pbxproj b/Signal.xcodeproj/project.pbxproj index 310435b7d..6d414c758 100644 --- a/Signal.xcodeproj/project.pbxproj +++ b/Signal.xcodeproj/project.pbxproj @@ -898,7 +898,6 @@ B633C54C1A1D190B0059AC12 /* quit@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "quit@2x.png"; sourceTree = ""; }; B633C5501A1D190B0059AC12 /* savephoto@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "savephoto@2x.png"; sourceTree = ""; }; B634CBB31AB10D2300C49B99 /* hr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hr; path = translations/hr.lproj/Localizable.strings; sourceTree = ""; }; - B634CBB41AB10D3700C49B99 /* fa */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fa; path = translations/fa.lproj/Localizable.strings; sourceTree = ""; }; B634CBB51AB10D5400C49B99 /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = translations/ro.lproj/Localizable.strings; sourceTree = ""; }; B63761E119E1F487005735D1 /* AFHTTPSessionManager+SignalMethods.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "AFHTTPSessionManager+SignalMethods.h"; sourceTree = ""; }; B63761E219E1F487005735D1 /* AFHTTPSessionManager+SignalMethods.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "AFHTTPSessionManager+SignalMethods.m"; sourceTree = ""; }; @@ -942,7 +941,6 @@ B640C4761A477B0F005C7C8A /* TSAttachementsTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TSAttachementsTest.m; sourceTree = ""; }; B646D10E1AA5461A004133BA /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = translations/fr.lproj/Localizable.strings; sourceTree = ""; }; B646D10F1AA54626004133BA /* fil */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fil; path = translations/fil.lproj/Localizable.strings; sourceTree = ""; }; - B646D1131AA54667004133BA /* hi_IN */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hi_IN; path = translations/hi_IN.lproj/Localizable.strings; sourceTree = ""; }; B646D1141AA54674004133BA /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = translations/hu.lproj/Localizable.strings; sourceTree = ""; }; B646D1151AA5467E004133BA /* it_IT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it_IT; path = translations/it_IT.lproj/Localizable.strings; sourceTree = ""; }; B65031CE1A7862AA002EBBBD /* SignedPreKeyDeletionTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SignedPreKeyDeletionTests.m; sourceTree = ""; }; @@ -982,7 +980,6 @@ B68CB7E21AA5485B0065AC3F /* sv_SE */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv_SE; path = translations/sv_SE.lproj/Localizable.strings; sourceTree = ""; }; B68CB7E31AA548660065AC3F /* th_TH */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = th_TH; path = translations/th_TH.lproj/Localizable.strings; sourceTree = ""; }; B68CB7E41AA548700065AC3F /* tr_TR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr_TR; path = translations/tr_TR.lproj/Localizable.strings; sourceTree = ""; }; - B68CB7E51AA5487D0065AC3F /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = translations/uk.lproj/Localizable.strings; sourceTree = ""; }; B68CB7E61AA548870065AC3F /* zh_CN */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = zh_CN; path = translations/zh_CN.lproj/Localizable.strings; sourceTree = ""; }; B692BF051A76EF0F002786DA /* TSDatabaseSecondaryIndexes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TSDatabaseSecondaryIndexes.h; sourceTree = ""; }; B692BF061A76EF0F002786DA /* TSDatabaseSecondaryIndexes.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TSDatabaseSecondaryIndexes.m; sourceTree = ""; }; @@ -1090,7 +1087,6 @@ B6C93C4D199567AD00EDF894 /* DebugLogger.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DebugLogger.m; sourceTree = ""; }; B6E314C71A38FAAF00A41AFB /* TSFingerprintGenerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TSFingerprintGenerator.h; sourceTree = ""; }; B6E314C81A38FAAF00A41AFB /* TSFingerprintGenerator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TSFingerprintGenerator.m; sourceTree = ""; }; - B6E80FA61AA5453C0000253B /* et_EE */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = et_EE; path = translations/et_EE.lproj/Localizable.strings; sourceTree = ""; }; B6F509961AA53F760068F56A /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = translations/en.lproj/Localizable.strings; sourceTree = ""; }; B6FAAAE61A41BC6C007FEC1D /* TSAttachmentPointer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TSAttachmentPointer.h; path = Attachements/TSAttachmentPointer.h; sourceTree = ""; }; B6FAAAE71A41BC6C007FEC1D /* TSAttachmentPointer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TSAttachmentPointer.m; path = Attachements/TSAttachmentPointer.m; sourceTree = ""; }; @@ -2793,10 +2789,8 @@ sv_SE, th_TH, tr_TR, - uk, zh_CN, hr, - fa, ro, ); mainGroup = D221A07E169C9E5E00537ABF; @@ -3435,11 +3429,9 @@ B676BCEF1AA544E7009637B8 /* de */, B676BCF01AA544F5009637B8 /* el_GR */, B676BCF11AA5451E009637B8 /* es */, - B6E80FA61AA5453C0000253B /* et_EE */, B63FBC9E1AA545CB00548746 /* fi */, B646D10E1AA5461A004133BA /* fr */, B646D10F1AA54626004133BA /* fil */, - B646D1131AA54667004133BA /* hi_IN */, B646D1141AA54674004133BA /* hu */, B646D1151AA5467E004133BA /* it_IT */, B60341CD1AA5469800A01E42 /* ja_JP */, @@ -3455,10 +3447,8 @@ B68CB7E21AA5485B0065AC3F /* sv_SE */, B68CB7E31AA548660065AC3F /* th_TH */, B68CB7E41AA548700065AC3F /* tr_TR */, - B68CB7E51AA5487D0065AC3F /* uk */, B68CB7E61AA548870065AC3F /* zh_CN */, B634CBB31AB10D2300C49B99 /* hr */, - B634CBB41AB10D3700C49B99 /* fa */, B634CBB51AB10D5400C49B99 /* ro */, ); name = Localizable.strings; @@ -3607,8 +3597,8 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; CLANG_ENABLE_MODULES = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; CURRENT_PROJECT_VERSION = 1; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -3662,8 +3652,8 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; CLANG_ENABLE_MODULES = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; CURRENT_PROJECT_VERSION = 1; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", diff --git a/Signal.xcodeproj/xcshareddata/xcschemes/Signal.xcscheme b/Signal.xcodeproj/xcshareddata/xcschemes/Signal.xcscheme index 002632c70..5abdfd2e9 100644 --- a/Signal.xcodeproj/xcshareddata/xcschemes/Signal.xcscheme +++ b/Signal.xcodeproj/xcshareddata/xcschemes/Signal.xcscheme @@ -65,7 +65,8 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" allowLocationSimulation = "YES"> - + - + > endobj 2 0 obj <>stream - - - - - application/pdf - - - archive_active - - - - - Adobe Illustrator CS6 (Macintosh) - 2015-02-07T01:23:55-05:00 - 2015-02-07T01:23:55-05:00 - 2015-02-07T01:23:55-05:00 - - - - 256 - 256 - JPEG - /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FUHqetaTpcXq6jdxWqH7PqMFLf6q9W+jLcWCeQ1EEtWXPDGLkQGFat+dHly2LLp8E1+46NT 0Yz/ALJgX/4TNrh7Eyy+oiP2/j5urzdt4o/SDL7Px8mJaj+dHmeckWcNvZp2IUyuPpc8f+FzZY+x MI+omX2Otydt5T9IEWP3fn7zld19XV7ha9fSb0f+TQTMyHZ+CPKA+/73Dn2hnlzmfu+5KZ9U1Oc1 nu5pT4vI7e3c5kxxQHIAfBxpZZnmT80LljB2KoqDVNTgNYLuaI+KSOvt2OVyxQPMA/BnHLMcifmm 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 XYq//9k= - - - - - - uuid:C1BCCE1871B8DB11993190FCD52B4E9F - xmp.did:4AD73C7B20206811822AE763568782DB - uuid:734ef318-44dd-e747-b77b-3d43bbff4098 - proof:pdf - - xmp.iid:46D73C7B20206811822AE763568782DB - xmp.did:46D73C7B20206811822AE763568782DB - uuid:C1BCCE1871B8DB11993190FCD52B4E9F - proof:pdf - - - - - saved - xmp.iid:46D73C7B20206811822AE763568782DB - 2015-02-07T01:19:30-05:00 - Adobe Illustrator CS6 (Macintosh) - / - - - saved - xmp.iid:4AD73C7B20206811822AE763568782DB - 2015-02-07T01:23:53-05:00 - Adobe Illustrator CS6 (Macintosh) - / - - - - - - Mobile - - - 1 - False - False - - 66.000000 - 66.000000 - Points - - - - Cyan - Magenta - - - - - - Default Swatch Group - 0 - - - - White - RGB - PROCESS - 255 - 255 - 255 - - - Black - RGB - PROCESS - 0 - 0 - 0 - - - RGB Red - RGB - PROCESS - 255 - 0 - 0 - - - RGB Yellow - RGB - PROCESS - 255 - 255 - 0 - - - RGB Green - RGB - PROCESS - 0 - 255 - 0 - - - RGB Cyan - RGB - PROCESS - 0 - 255 - 255 - - - RGB Blue - RGB - PROCESS - 0 - 0 - 255 - - - RGB Magenta - RGB - PROCESS - 255 - 0 - 255 - - - R=193 G=39 B=45 - RGB - PROCESS - 193 - 39 - 45 - - - R=237 G=28 B=36 - RGB - PROCESS - 237 - 28 - 36 - - - R=241 G=90 B=36 - RGB - PROCESS - 241 - 90 - 36 - - - R=247 G=147 B=30 - RGB - PROCESS - 247 - 147 - 30 - - - R=251 G=176 B=59 - RGB - PROCESS - 251 - 176 - 59 - - - R=252 G=238 B=33 - RGB - PROCESS - 252 - 238 - 33 - - - R=217 G=224 B=33 - RGB - PROCESS - 217 - 224 - 33 - - - R=140 G=198 B=63 - RGB - PROCESS - 140 - 198 - 63 - - - R=57 G=181 B=74 - RGB - PROCESS - 57 - 181 - 74 - - - R=0 G=146 B=69 - RGB - PROCESS - 0 - 146 - 69 - - - R=0 G=104 B=55 - RGB - PROCESS - 0 - 104 - 55 - - - R=34 G=181 B=115 - RGB - PROCESS - 34 - 181 - 115 - - - R=0 G=169 B=157 - RGB - PROCESS - 0 - 169 - 157 - - - R=41 G=171 B=226 - RGB - PROCESS - 41 - 171 - 226 - - - R=0 G=113 B=188 - RGB - PROCESS - 0 - 113 - 188 - - - R=46 G=49 B=146 - RGB - PROCESS - 46 - 49 - 146 - - - R=27 G=20 B=100 - RGB - PROCESS - 27 - 20 - 100 - - - R=102 G=45 B=145 - RGB - PROCESS - 102 - 45 - 145 - - - R=147 G=39 B=143 - RGB - PROCESS - 147 - 39 - 143 - - - R=158 G=0 B=93 - RGB - PROCESS - 158 - 0 - 93 - - - R=212 G=20 B=90 - RGB - PROCESS - 212 - 20 - 90 - - - R=237 G=30 B=121 - RGB - PROCESS - 237 - 30 - 121 - - - R=199 G=178 B=153 - RGB - PROCESS - 199 - 178 - 153 - - - R=153 G=134 B=117 - RGB - PROCESS - 153 - 134 - 117 - - - R=115 G=99 B=87 - RGB - PROCESS - 115 - 99 - 87 - - - R=83 G=71 B=65 - RGB - PROCESS - 83 - 71 - 65 - - - R=198 G=156 B=109 - RGB - PROCESS - 198 - 156 - 109 - - - R=166 G=124 B=82 - RGB - PROCESS - 166 - 124 - 82 - - - R=140 G=98 B=57 - RGB - PROCESS - 140 - 98 - 57 - - - R=117 G=76 B=36 - RGB - PROCESS - 117 - 76 - 36 - - - R=96 G=56 B=19 - RGB - PROCESS - 96 - 56 - 19 - - - R=66 G=33 B=11 - RGB - PROCESS - 66 - 33 - 11 - - - - - - Grays - 1 - - - - R=0 G=0 B=0 - RGB - PROCESS - 0 - 0 - 0 - - - R=26 G=26 B=26 - RGB - PROCESS - 26 - 26 - 26 - - - R=51 G=51 B=51 - RGB - PROCESS - 51 - 51 - 51 - - - R=77 G=77 B=77 - RGB - PROCESS - 77 - 77 - 77 - - - R=102 G=102 B=102 - RGB - PROCESS - 102 - 102 - 102 - - - R=128 G=128 B=128 - RGB - PROCESS - 128 - 128 - 128 - - - R=153 G=153 B=153 - RGB - PROCESS - 153 - 153 - 153 - - - R=179 G=179 B=179 - RGB - PROCESS - 179 - 179 - 179 - - - R=204 G=204 B=204 - RGB - PROCESS - 204 - 204 - 204 - - - R=230 G=230 B=230 - RGB - PROCESS - 230 - 230 - 230 - - - R=242 G=242 B=242 - RGB - PROCESS - 242 - 242 - 242 - - - - - - Mobile Color Group - 1 - - - - R=136 G=168 B=13 - RGB - PROCESS - 136 - 168 - 13 - - - R=127 G=71 B=221 - RGB - PROCESS - 127 - 71 - 221 - - - R=251 G=174 B=23 - RGB - PROCESS - 251 - 174 - 23 - - - - - - - - - Adobe PDF library 10.01 - - - - - - - - - - - - - - - - - - - - - - - - - endstream endobj 3 0 obj <> endobj 5 0 obj <>/Properties<>>>/TrimBox[0.0 0.0 66.0 66.0]/Type/Page>> endobj 6 0 obj <>stream -HLP0 )hdžp 9 φ 5Ʒw km~BR2Um'6d 1 T-cxG4E }7"6La= [#VpY1K ty 5$P9Wˆ^专FⱎWò6J endstream endobj 8 0 obj <> endobj 7 0 obj <> endobj 9 0 obj <> endobj xref 0 10 0000000000 65535 f -0000000016 00000 n -0000000076 00000 n -0000046160 00000 n -0000000000 00000 f -0000046211 00000 n -0000046443 00000 n -0000046810 00000 n -0000046684 00000 n -0000046922 00000 n -trailer <]>> startxref 47114 %%EOF \ No newline at end of file diff --git a/Signal/Images.xcassets/archive-inactive@1x.imageset/Contents.json b/Signal/Images.xcassets/archive-inactive@1x.imageset/Contents.json deleted file mode 100644 index 71367dec9..000000000 --- a/Signal/Images.xcassets/archive-inactive@1x.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "archive_inactive.pdf" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/Signal/Images.xcassets/archive-inactive@1x.imageset/archive_inactive.pdf b/Signal/Images.xcassets/archive-inactive@1x.imageset/archive_inactive.pdf deleted file mode 100644 index 0a334ae79..000000000 --- a/Signal/Images.xcassets/archive-inactive@1x.imageset/archive_inactive.pdf +++ /dev/null @@ -1,589 +0,0 @@ -%PDF-1.5 % -1 0 obj <> endobj 2 0 obj <>stream - - - - - application/pdf - - - archive_inactive - - - - - Adobe Illustrator CS6 (Macintosh) - 2015-02-07T01:23:17-05:00 - 2015-02-07T01:23:17-05:00 - 2015-02-07T01:23:17-05:00 - - - - 244 - 256 - JPEG - /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAD0AwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FUFfa1pFhX65eQwEfsO4Df8D1xVIrr8y/K8BIjkluSP99Rkf8nCmKpXP+bVoP7jTpH/ ANeRU/Ur4qhH/Nq7P2NOjX/WkZtvoUYqs/5WzqH/ACwQ/wDBtiqvH+bb1/eaWCPFZqfrQ4qj7f8A NbRnoLi1uIiepXg4H4qfwxVOLPzz5WuqBb9ImP7MwaKn0sAv44qncU0M0YkhdZIz0dCGB+kYqvxV 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 xV//2Q== - - - - - - uuid:C1BCCE1871B8DB11993190FCD52B4E9F - xmp.did:49D73C7B20206811822AE763568782DB - uuid:1393148b-027b-0246-8da3-b5a2d2bcb96e - proof:pdf - - xmp.iid:46D73C7B20206811822AE763568782DB - xmp.did:46D73C7B20206811822AE763568782DB - uuid:C1BCCE1871B8DB11993190FCD52B4E9F - proof:pdf - - - - - saved - xmp.iid:46D73C7B20206811822AE763568782DB - 2015-02-07T01:19:30-05:00 - Adobe Illustrator CS6 (Macintosh) - / - - - saved - xmp.iid:49D73C7B20206811822AE763568782DB - 2015-02-07T01:23:13-05:00 - Adobe Illustrator CS6 (Macintosh) - / - - - - - - Mobile - - - 1 - False - False - - 66.000000 - 66.000000 - Points - - - - Cyan - Magenta - Yellow - Black - - - - - - Default Swatch Group - 0 - - - - White - RGB - PROCESS - 255 - 255 - 255 - - - Black - RGB - PROCESS - 0 - 0 - 0 - - - RGB Red - RGB - PROCESS - 255 - 0 - 0 - - - RGB Yellow - RGB - PROCESS - 255 - 255 - 0 - - - RGB Green - RGB - PROCESS - 0 - 255 - 0 - - - RGB Cyan - RGB - PROCESS - 0 - 255 - 255 - - - RGB Blue - RGB - PROCESS - 0 - 0 - 255 - - - RGB Magenta - RGB - PROCESS - 255 - 0 - 255 - - - R=193 G=39 B=45 - RGB - PROCESS - 193 - 39 - 45 - - - R=237 G=28 B=36 - RGB - PROCESS - 237 - 28 - 36 - - - R=241 G=90 B=36 - RGB - PROCESS - 241 - 90 - 36 - - - R=247 G=147 B=30 - RGB - PROCESS - 247 - 147 - 30 - - - R=251 G=176 B=59 - RGB - PROCESS - 251 - 176 - 59 - - - R=252 G=238 B=33 - RGB - PROCESS - 252 - 238 - 33 - - - R=217 G=224 B=33 - RGB - PROCESS - 217 - 224 - 33 - - - R=140 G=198 B=63 - RGB - PROCESS - 140 - 198 - 63 - - - R=57 G=181 B=74 - RGB - PROCESS - 57 - 181 - 74 - - - R=0 G=146 B=69 - RGB - PROCESS - 0 - 146 - 69 - - - R=0 G=104 B=55 - RGB - PROCESS - 0 - 104 - 55 - - - R=34 G=181 B=115 - RGB - PROCESS - 34 - 181 - 115 - - - R=0 G=169 B=157 - RGB - PROCESS - 0 - 169 - 157 - - - R=41 G=171 B=226 - RGB - PROCESS - 41 - 171 - 226 - - - R=0 G=113 B=188 - RGB - PROCESS - 0 - 113 - 188 - - - R=46 G=49 B=146 - RGB - PROCESS - 46 - 49 - 146 - - - R=27 G=20 B=100 - RGB - PROCESS - 27 - 20 - 100 - - - R=102 G=45 B=145 - RGB - PROCESS - 102 - 45 - 145 - - - R=147 G=39 B=143 - RGB - PROCESS - 147 - 39 - 143 - - - R=158 G=0 B=93 - RGB - PROCESS - 158 - 0 - 93 - - - R=212 G=20 B=90 - RGB - PROCESS - 212 - 20 - 90 - - - R=237 G=30 B=121 - RGB - PROCESS - 237 - 30 - 121 - - - R=199 G=178 B=153 - RGB - PROCESS - 199 - 178 - 153 - - - R=153 G=134 B=117 - RGB - PROCESS - 153 - 134 - 117 - - - R=115 G=99 B=87 - RGB - PROCESS - 115 - 99 - 87 - - - R=83 G=71 B=65 - RGB - PROCESS - 83 - 71 - 65 - - - R=198 G=156 B=109 - RGB - PROCESS - 198 - 156 - 109 - - - R=166 G=124 B=82 - RGB - PROCESS - 166 - 124 - 82 - - - R=140 G=98 B=57 - RGB - PROCESS - 140 - 98 - 57 - - - R=117 G=76 B=36 - RGB - PROCESS - 117 - 76 - 36 - - - R=96 G=56 B=19 - RGB - PROCESS - 96 - 56 - 19 - - - R=66 G=33 B=11 - RGB - PROCESS - 66 - 33 - 11 - - - - - - Grays - 1 - - - - R=0 G=0 B=0 - RGB - PROCESS - 0 - 0 - 0 - - - R=26 G=26 B=26 - RGB - PROCESS - 26 - 26 - 26 - - - R=51 G=51 B=51 - RGB - PROCESS - 51 - 51 - 51 - - - R=77 G=77 B=77 - RGB - PROCESS - 77 - 77 - 77 - - - R=102 G=102 B=102 - RGB - PROCESS - 102 - 102 - 102 - - - R=128 G=128 B=128 - RGB - PROCESS - 128 - 128 - 128 - - - R=153 G=153 B=153 - RGB - PROCESS - 153 - 153 - 153 - - - R=179 G=179 B=179 - RGB - PROCESS - 179 - 179 - 179 - - - R=204 G=204 B=204 - RGB - PROCESS - 204 - 204 - 204 - - - R=230 G=230 B=230 - RGB - PROCESS - 230 - 230 - 230 - - - R=242 G=242 B=242 - RGB - PROCESS - 242 - 242 - 242 - - - - - - Mobile Color Group - 1 - - - - R=136 G=168 B=13 - RGB - PROCESS - 136 - 168 - 13 - - - R=127 G=71 B=221 - RGB - PROCESS - 127 - 71 - 221 - - - R=251 G=174 B=23 - RGB - PROCESS - 251 - 174 - 23 - - - - - - - - - Adobe PDF library 10.01 - - - - - - - - - - - - - - - - - - - - - - - - - endstream endobj 3 0 obj <> endobj 5 0 obj <>/Properties<>>>/TrimBox[0.0 0.0 66.0 66.0]/Type/Page>> endobj 6 0 obj <>stream -HLO0 + 1"&2i_u]|q]24#ԍ`qa> endobj 7 0 obj <> endobj 9 0 obj <> endobj xref 0 10 0000000000 65535 f -0000000016 00000 n -0000000076 00000 n -0000040569 00000 n -0000000000 00000 f -0000040620 00000 n -0000040852 00000 n -0000041213 00000 n -0000041087 00000 n -0000041325 00000 n -trailer <]>> startxref 41519 %%EOF \ No newline at end of file diff --git a/Signal/Images.xcassets/inbox-active@1x.imageset/Contents.json b/Signal/Images.xcassets/inbox-active@1x.imageset/Contents.json deleted file mode 100644 index 2be2392a1..000000000 --- a/Signal/Images.xcassets/inbox-active@1x.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "inbox_active.pdf" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/Signal/Images.xcassets/inbox-active@1x.imageset/inbox_active.pdf b/Signal/Images.xcassets/inbox-active@1x.imageset/inbox_active.pdf deleted file mode 100644 index c9c240b43..000000000 --- a/Signal/Images.xcassets/inbox-active@1x.imageset/inbox_active.pdf +++ /dev/null @@ -1,587 +0,0 @@ -%PDF-1.5 % -1 0 obj <> endobj 2 0 obj <>stream - - - - - application/pdf - - - inbox_active - - - - - Adobe Illustrator CS6 (Macintosh) - 2015-02-07T01:27:59-05:00 - 2015-02-07T01:27:59-05:00 - 2015-02-07T01:27:59-05:00 - - - - 256 - 256 - JPEG - /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FUHqetaTpcXq6jdxWqH7PqMFLf6q9W+jLcWCeQ1EEtWXPDGLkQGFat+dHly2LLp8E1+46NT 0Yz/ALJgX/4TNrh7Eyy+oiP2/j5urzdt4o/SDL7Px8mJaj+dHmeckWcNvZp2IUyuPpc8f+FzZY+x MI+omX2Otydt5T9IEWP3fn7zld19XV7ha9fSb0f+TQTMyHZ+CPKA+/73Dn2hnlzmfu+5KZ9U1Oc1 nu5pT4vI7e3c5kxxQHIAfBxpZZnmT80LljB2KoqDVNTgNYLuaI+KSOvt2OVyxQPMA/BnHLMcifmm 1p5+85WlPS1e4anT1W9b/k6HzGn2fglzgPu+5yYdoZ48pn7/AL2Qad+dHmeAgXkNveJ3JUxOfpQ8 f+FzDydiYT9JMftczH23lH1ASZbpP50eXLkquoQTWDnq1PWjH+yUB/8AhM1ubsTLH6SJfZ+Pm7LD 23il9QMft/HyZrpmtaTqkXq6ddxXSD7XpsGK/wCsvVfpzVZcE8ZqQIdpizwyC4kFGZU2uxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVIvMnnby95fQ/XrgNc0+G0io8x/wBjX4R7sRmZptDl zfSNu/o4ep12LD9R37ury3zD+cPmC/LRaYq6bbHYMtHmI93Iov8AsRX3zoNN2NihvP1H7HQantnJ PaHpH2sFuLm5uZmnuZXnmfd5ZGLsT7s1Tm3jERFAUHUSkZGybKlkkOxV2KuxV2KuxV2KuxV2KuxV Vt7m5tplntpXgmTdJY2KMD7MtDkZREhRFhMZGJsGizry9+cPmCwKxamq6lbDYs1EmA9nAo3+yFff NRqexsU94ek/Y7fTds5IbT9Q+16l5b87eXvMCD6jcBbmnxWktEmH+xr8Q91Jzn9TocuH6ht39Hf6 bXYs30nfu6p7mG5jsVdirsVdirsVdirsVdirsVdirsVdirsVQ+oajY6daSXd9OlvbRCryOaD5e5P YDJ48cpy4YiywyZIwjxSNB5H5u/OC+uy9poANpbbhrxv75x/kD9gfj8s6XR9jRj6sm57un7Xm9Z2 zKXpx7Dv6/sebySSSyNJIxeRzVnYkkk9yTm8AAFB0ZJJsrcKuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxVdHJJFIskbFJENVdSQQR3BGAgEUVBINh6R5R/OC+tClpr4N3bbBbxf75B/lj9sfj880es7Gj L1Y9j3dP2O80fbMo+nJuO/r+165p+o2Oo2kd3YzpcW0oqkiGo+XsR3BzmsmOUJcMhRekx5IzjxRN hEZBm7FXYq7FXYq7FXYq7FXYq7FXYqkfmvzfpPluy9e8bncOD9XtEI5yEfqXxbMvSaOeeVR5dS4m r1kMEblz6B4P5n826x5jvPXvpKRKf3FqlRHGPYdz4k751+l0cMEajz7+ryOq1k88rly7klzLcV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kp15Y826x5dvBPYyViYj17V6mOQe47HwI3zE1 WjhnjUhv3uVpdZPDK4nbue8eVPOGleZLL17NuFxGB9YtHI9SMn9ans2chq9FPBKpcuheu0mshnjc efUJ5mI5bsVdirsVdirsVdirsVdirGvO/ney8sWSkqJ9QnB+q2tadOrueyj8f1Z+h0Ms8u6I5lwN dro4I98jyDwLVtWv9Wv5b6/mM1zKasx6AdlUdlHYZ2OHDHHERiKAePzZpZJGUjZQeWtbsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVRmk6tf6TfxX1hMYbmI1Vh0I7qw7qe4yrNhjki YyFgtmHNLHISiaL33yR53svM9kxCiDUIAPrVrWvXo6Hup/D9fHa7QywS74nkXsNDro5490hzDJcw HPdirsVdirsVdirsVSPzf5rsvLekteT0e4eqWlvWhken/ER+0cy9HpJZ58I5dS4ms1ccEOI8+gfP Oratf6tfzX99KZbmY1Zj0A7Ko7KOwztcOGOOIjEUA8XmzSySMpHcoPLWt2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KozSdWv9Jv4b+xlMVzCaqw6Ed1Yd1PcZVmwxyRMZCwWz DmljkJRO4fQ3k/zXZeZNKW8gpHcJRLu3rUxyU/FT+yc4rW6SWCfCeXQvaaPVxzw4hz6hPMxHLdir sVdirsVQ+o6haadYz313IIra3QvI58B4eJPQDJ48cpyEY8ywyZIwiZS5B85+bfM955j1iS+nqsQ+ C1g7Rxg7D5nqT452+j0scEOEc+vveJ1mqlnnxHl0SXMtxXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYqnXlLzPeeXdYjvoCWiPwXUFdpIydx8x1B8cxNZpY54GJ59HK0e qlhmJDl1fRmnahaajYwX1pIJba4QPG48D4+BHQjOIyY5QkYy5h7bHkjOIlHkURkGbsVdirsVeN/n B5uN3fDQLR/9GtDyvGB2ebsnyT9fyzqOxtHwx8SXM8vd+15jtnWcUvDjyHP3/sea5vXRuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV6V+T/AJuNpfHQLt/9Guzy s2J2Sbunyf8AX880XbOj4o+JHmOfu/Y7zsbWcMvDlyPL3/teyZy707sVdiqRedvMieX/AC9cX1R9 ZYelaL4zODx+hd2PyzM0Om8bKI9OvucPXanwcRl16e984SSSSyNJIxeRyWdjuSSaknO4AAFB4gkk 2VuFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqujkkikWSN ikiEMjDYgg1BGAgEUVBINh9H+SfMieYPL1vfVH1lR6V2vhMgHL6G2YfPOH12m8HKY9Onue30Op8b EJdevvT3MNzHYq8Q/OHzCb/zAumRNW201eLAdDM4Bc/7EUX51zrOxtNwYuM85fc8p2zqePJwDlH7 2AZuXTuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVn/ AOT3mE2HmBtMlaltqS8VB6CZASh/2Qqvzpmm7Z03Hi4xzj9zuOxtTwZOA8pfe9vzk3q0HrWpxaXp N3qMu6WsTScf5io+Ff8AZHbLcGI5JiI6lqz5RjgZHoHzFc3E1zcy3M7c5p3aSVz1LOeTH7znfRiI gAcg8FKRkSTzKlkkOxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxVVtria2uYrmBuE0DrJE46hkPJT94yMoiQIPIpjIxII5h9O6LqcWqaTaajFsl1EsnH+UsP iX/YnbOBz4jjmYnoXvcGUZICQ6hhX50asbby5Bp6tR7+Ych4xw0Zv+HKZtexMPFlMv5o+/8ABdX2 3m4cQj/OP3fgPEs6t5V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KvbfyX1Y3PlyfT2ar2Ex4jwjmqy/8ADh85TtvDw5RL+cPu/Aeq7EzcWIx/mn7/ AMFiX50aiZ/M8NmD8FnbqCPB5SXP/C8c2XYmOsJl/OP3Ot7byXlEf5oef5uXTuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV6B+S+omDzPNZk/BeW7 ADxeIhx/wvLNN23jvCJfzT97uOxMlZTH+cGP+frv635y1eWteNw0Vf8AjDSL/jTMzs+HDggPL793 D7QnxZ5nz+7Zj+ZrhuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxVkHkG7+qectIlrTlcLFX/jNWL/jfMLtCHFgmPL7t3M7Pnw54Hz+/ZKdUnM+p3c5 6yzSOf8AZOT2zJxRqAHcA42WVzJ8yhcsYOxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVFaXOYNTtJx1imjcf7Fwe+V5Y3AjvBZ4pVMHzCFyxg7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F UVqkBg1O7gPWKaRD/sXI7ZXilcAe8BnljUyPMoXLGDsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVRWlwGfU7SAdZZo0H+ycDvleWVQJ7gWeKNzA8wm 3n60+qectXipTlcNLT/jNSX/AI3zG7PnxYIHy+7Zye0IcOeY8/v3Y/ma4bsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVZB5BtPrfnLSIqV43Cy0/4w 1l/40zC7Qnw4Jny+/ZzOz4cWeA8/u3ZB+dGnGDzPDeAfBeW6knxeIlD/AMLxzD7EyXhMf5p+9zO2 8dZRL+cHn+bl07sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVegfkvpxn8zzXhHwWduxB8HlIQf8LyzTdt5KwiP84/c7jsTHeUy/mhlv50aSbny5BqC rV7CYcj4RzUVv+HCZrexM3DlMf5w+78F2XbeHixCX80/f+A8Szq3lXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq9t/JfSTbeXJ9QZaPfzHifGOGqr /wAOXzlO283FlEf5o+/8B6rsTDw4jL+cfu/BZrrWmRappN3p0uyXUTR8v5Sw+Fv9id81WDKccxId C7TPiGSBieofMVzbzW1zLbTrwmgdo5UPUMh4sPvGd9GQkARyLwUomJIPMKWSQ7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FVW2t5rm5itoF5zTuscSDqWc8 VH3nIykIgk8gmMTIgDmX07oumRaXpNpp0W6WsSx8v5io+Jv9kd84HPlOSZkepe9wYhjgIjoEZlTa 8Q/OHy8bDzAupxLS21JeTEdBMgAcf7IUb51zrOxtTx4uA84/c8p2zpuDJxjlL72AZuXTuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVn/5PeXjf+YG1OVa2 2mryUnoZnBCD/YirfOmabtnU8GLgHOX3O47G03Hk4zyj972/OTerdiqRedvLcfmDy9cWNB9ZUera Me0yA8f+C+yfnmZodScOUS6dfc4mu0wzYjHr0975wkjkikaORSkiEq6nYgg0IOdwCCLDw5BBorcK uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVdHHJLIscal5HI VFG5JJoAMBIAsqASaD6P8k+W08v+XrexoPrLD1btvGZwOX0Lso+WcPrtT42Uy6dPc9vodN4OIR69 fenuYbmOxV2KvG/zg8om0vhr9on+jXZ43igbJN2f5P8Ar+edR2NrOKPhy5jl7v2PMds6Phl4keR5 +/8Aa81zeujdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir0r 8n/KJu746/dp/o1oeNmpGzzd3+Sfr+WaLtnWcMfDjzPP3ftd52No+KXiS5Dl7/2PZM5d6d2KuxV2 KofUdPtNRsZ7G7jEttcIUkQ+B8PAjqDk8eSUJCUeYYZMcZxMZci+c/Nvli88uaxJYz1aI/Haz9pI ydj8x0I8c7fR6qOeHEOfX3vE6zSywT4Ty6JLmW4rsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVTryl5YvPMesR2MFViHx3U/aOMHc/M9APHMTWaqOCHEefT3uVo9LLPPh HLq+jNO0+006xgsbSMRW1ugSNB4Dx8SepOcRkySnIylzL22PHGERGPIIjIM3Yq7FXYq7FUj83+VL LzJpLWc9EuEq9pcUqY3p/wARP7QzL0erlgnxDl1DiazSRzw4Tz6F886tpN/pN/NYX0RiuYTRlPQj synup7HO1w5o5IiUTYLxebDLHIxkNwg8ta3Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYqjNJ0m/wBWv4bCxiMtzMaKo6Ad2Y9lHc5VmzRxxMpGgGzDhlkkIxG5fQ3lDypZeW9J Wzgo9w9Hu7ilDI9P+Ij9kZxWs1cs8+I8uge00ekjghwjn1KeZiOW7FXYq7FXYq7FXYqxrzv5IsvM 9iFLCDUIAfqt1SvX9h/FT+HX55+h10sEu+J5hwddoY5490hyLwLVtJv9Jv5bG/hMNzEaMp6EdmU9 1PY52OHNHJESibBeOzYZY5GMhRQeWtbsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVRmk6Tf6tfxWNhCZrmU0VR0A7sx7KO5yrNmjjiZSNANmHDLJIRiLL33yR5IsvLFkwDCfUJwPrV1 SnToiDso/H9XHa7XSzy7ojkHsNDoY4I98jzLJcwHPdirsVdirsVdirsVdirsVSPzX5Q0nzJZeheL wuEB+r3aAc4yf1r4rmXpNZPBK48uocTV6OGeNS59C8H8z+UtY8uXnoX0dYmP7i6SpjkHsex8Qd86 /S6yGeNx593V5HVaOeCVS5d6S5luK7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FU68se UtY8x3noWMdIlP7+6eojjHue58AN8xNVrIYI3Ln3dXK0ujnnlUeXe948qeUNJ8t2XoWa87hwPrF2 4HOQj9S+C5yGr1k88rly6B67SaOGCNR59SnmYjluxV2KuxV2KuxV2KuxV2KuxV2KofUNOsdRtJLS +gS4tpRR43FR8/YjsRk8eSUJcUTRYZMcZx4ZCw8j83fk/fWhe70Am7tty1m398g/yD+2Px+edLo+ 2Yy9OTY9/T9jzes7GlH1Y9x3df2vN5I5IpGjkUpIhoyMCCCOxBzeAgiw6Mgg0VuFXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYqujjklkWONS8jmiooJJJ7ADASALKgEmg9I8o/k/fXZS718m0ttitmv8A fOP8s/sD8flmj1nbMY+nHue/p+13mj7GlL1ZNh3df2PXNP06x060jtLGBLe2iFEjQUHz9ye5Oc1k ySnLikbL0mPHGEeGIoIjIM3Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqkXmTyT5e8wRn69bhbmlFu 4qJMP9lT4vk1czNNrsuE+k7d3RxNTocWYeob9/V5b5h/J7zBYFpdMZdSthuFWiTAe6E0b/YmvtnQ abtnFPafpP2PP6nsbJDeHqH2sFuLa5tpmguYngmTZ4pFKMD7q1Dm3jISFg2HUSiYmiKKlkkOxV2K uxV2KuxV2KuxV2KuxVVt7a5uZlgtonnmfZIo1LsT7KtTkZSERZNBMYmRoCyzry9+T3mC/Ky6my6b bHcq1HmI9kBov+yNfbNRqe2cUNoeo/Y7fTdjZJ7z9I+16l5b8k+XvL8Y+o24a5pRruWjzH/ZU+H5 LTOf1Ouy5j6jt3dHoNNocWEekb9/VPcw3LdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi qD1PRdJ1SL0tRtIrpB9n1FDFf9Vuq/RluLPPGbiSGrLghkFSALCtW/Jfy5clm0+eawc9Fr60Y/2L EP8A8Pm1w9t5Y/UBL7Px8nV5uxMUvpJj9v4+bEtR/JfzPASbOa3vE7AMYnP0OOP/AA2bLH23hP1A x+11uTsTKPpIkx+78g+crSvq6RcNTr6S+t/yaL5mQ7QwS5TH3fe4c+z88ecD9/3JTPpepwGk9pNE fB43X37jMmOWB5EH4uNLFMcwfkhcsYOxVFQaXqc5pBaTSnwSN29+wyuWWA5kD4s44pnkD8k2tPIP nK7p6WkXC16eqvo/8nSmY0+0MEecx9/3OTDs/PLlA/d97INO/JfzPOQbya3s07gsZXH0IOP/AA2Y eTtvCPpBl9jmY+xMp+oiLLdJ/Jfy5bFW1Cea/cdVr6MZ/wBipL/8Pmtzdt5ZfSBH7fx8nZYexMUf qJl9n4+bNdM0XSdLi9LTrSK1Q/a9NQpb/Wbq305qsueeQ3Iku0xYIYxUQAjMqbXYq7FXYq7FXYq7 FXYq7FXYq//Z - - - - - - uuid:C1BCCE1871B8DB11993190FCD52B4E9F - xmp.did:4DD73C7B20206811822AE763568782DB - uuid:9a6a0eee-3f7b-174a-8bde-10d8faddf552 - proof:pdf - - xmp.iid:4BD73C7B20206811822AE763568782DB - xmp.did:4BD73C7B20206811822AE763568782DB - uuid:C1BCCE1871B8DB11993190FCD52B4E9F - proof:pdf - - - - - saved - xmp.iid:46D73C7B20206811822AE763568782DB - 2015-02-07T01:19:30-05:00 - Adobe Illustrator CS6 (Macintosh) - / - - - saved - xmp.iid:4DD73C7B20206811822AE763568782DB - 2015-02-07T01:27:56-05:00 - Adobe Illustrator CS6 (Macintosh) - / - - - - - - Mobile - - - 1 - False - False - - 66.000000 - 66.000000 - Points - - - - Cyan - Magenta - - - - - - Default Swatch Group - 0 - - - - White - RGB - PROCESS - 255 - 255 - 255 - - - Black - RGB - PROCESS - 0 - 0 - 0 - - - RGB Red - RGB - PROCESS - 255 - 0 - 0 - - - RGB Yellow - RGB - PROCESS - 255 - 255 - 0 - - - RGB Green - RGB - PROCESS - 0 - 255 - 0 - - - RGB Cyan - RGB - PROCESS - 0 - 255 - 255 - - - RGB Blue - RGB - PROCESS - 0 - 0 - 255 - - - RGB Magenta - RGB - PROCESS - 255 - 0 - 255 - - - R=193 G=39 B=45 - RGB - PROCESS - 193 - 39 - 45 - - - R=237 G=28 B=36 - RGB - PROCESS - 237 - 28 - 36 - - - R=241 G=90 B=36 - RGB - PROCESS - 241 - 90 - 36 - - - R=247 G=147 B=30 - RGB - PROCESS - 247 - 147 - 30 - - - R=251 G=176 B=59 - RGB - PROCESS - 251 - 176 - 59 - - - R=252 G=238 B=33 - RGB - PROCESS - 252 - 238 - 33 - - - R=217 G=224 B=33 - RGB - PROCESS - 217 - 224 - 33 - - - R=140 G=198 B=63 - RGB - PROCESS - 140 - 198 - 63 - - - R=57 G=181 B=74 - RGB - PROCESS - 57 - 181 - 74 - - - R=0 G=146 B=69 - RGB - PROCESS - 0 - 146 - 69 - - - R=0 G=104 B=55 - RGB - PROCESS - 0 - 104 - 55 - - - R=34 G=181 B=115 - RGB - PROCESS - 34 - 181 - 115 - - - R=0 G=169 B=157 - RGB - PROCESS - 0 - 169 - 157 - - - R=41 G=171 B=226 - RGB - PROCESS - 41 - 171 - 226 - - - R=0 G=113 B=188 - RGB - PROCESS - 0 - 113 - 188 - - - R=46 G=49 B=146 - RGB - PROCESS - 46 - 49 - 146 - - - R=27 G=20 B=100 - RGB - PROCESS - 27 - 20 - 100 - - - R=102 G=45 B=145 - RGB - PROCESS - 102 - 45 - 145 - - - R=147 G=39 B=143 - RGB - PROCESS - 147 - 39 - 143 - - - R=158 G=0 B=93 - RGB - PROCESS - 158 - 0 - 93 - - - R=212 G=20 B=90 - RGB - PROCESS - 212 - 20 - 90 - - - R=237 G=30 B=121 - RGB - PROCESS - 237 - 30 - 121 - - - R=199 G=178 B=153 - RGB - PROCESS - 199 - 178 - 153 - - - R=153 G=134 B=117 - RGB - PROCESS - 153 - 134 - 117 - - - R=115 G=99 B=87 - RGB - PROCESS - 115 - 99 - 87 - - - R=83 G=71 B=65 - RGB - PROCESS - 83 - 71 - 65 - - - R=198 G=156 B=109 - RGB - PROCESS - 198 - 156 - 109 - - - R=166 G=124 B=82 - RGB - PROCESS - 166 - 124 - 82 - - - R=140 G=98 B=57 - RGB - PROCESS - 140 - 98 - 57 - - - R=117 G=76 B=36 - RGB - PROCESS - 117 - 76 - 36 - - - R=96 G=56 B=19 - RGB - PROCESS - 96 - 56 - 19 - - - R=66 G=33 B=11 - RGB - PROCESS - 66 - 33 - 11 - - - - - - Grays - 1 - - - - R=0 G=0 B=0 - RGB - PROCESS - 0 - 0 - 0 - - - R=26 G=26 B=26 - RGB - PROCESS - 26 - 26 - 26 - - - R=51 G=51 B=51 - RGB - PROCESS - 51 - 51 - 51 - - - R=77 G=77 B=77 - RGB - PROCESS - 77 - 77 - 77 - - - R=102 G=102 B=102 - RGB - PROCESS - 102 - 102 - 102 - - - R=128 G=128 B=128 - RGB - PROCESS - 128 - 128 - 128 - - - R=153 G=153 B=153 - RGB - PROCESS - 153 - 153 - 153 - - - R=179 G=179 B=179 - RGB - PROCESS - 179 - 179 - 179 - - - R=204 G=204 B=204 - RGB - PROCESS - 204 - 204 - 204 - - - R=230 G=230 B=230 - RGB - PROCESS - 230 - 230 - 230 - - - R=242 G=242 B=242 - RGB - PROCESS - 242 - 242 - 242 - - - - - - Mobile Color Group - 1 - - - - R=136 G=168 B=13 - RGB - PROCESS - 136 - 168 - 13 - - - R=127 G=71 B=221 - RGB - PROCESS - 127 - 71 - 221 - - - R=251 G=174 B=23 - RGB - PROCESS - 251 - 174 - 23 - - - - - - - - - Adobe PDF library 10.01 - - - - - - - - - - - - - - - - - - - - - - - - - endstream endobj 3 0 obj <> endobj 5 0 obj <>/Properties<>>>/TrimBox[0.0 0.0 66.0 66.0]/Type/Page>> endobj 6 0 obj <>stream -HDO;0 }w$vDd :T ̨*@j:q{bRTogLSZ)'Ml Q}Lrc+-pAh4_z#bCJ0ɶ,0~LP;%gomЍ[u' t+}3+ endstream endobj 8 0 obj <> endobj 7 0 obj <> endobj 9 0 obj <> endobj xref 0 10 0000000000 65535 f -0000000016 00000 n -0000000076 00000 n -0000041869 00000 n -0000000000 00000 f -0000041920 00000 n -0000042152 00000 n -0000042493 00000 n -0000042367 00000 n -0000042605 00000 n -trailer <<3B926537928B4523BA0C8DC24918EDD6>]>> startxref 42795 %%EOF \ No newline at end of file diff --git a/Signal/Images.xcassets/inbox-inactive@1x.imageset/Contents.json b/Signal/Images.xcassets/inbox-inactive@1x.imageset/Contents.json deleted file mode 100644 index 71f1c95c8..000000000 --- a/Signal/Images.xcassets/inbox-inactive@1x.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "inbox_inactive.pdf" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/Signal/Images.xcassets/inbox-inactive@1x.imageset/inbox_inactive.pdf b/Signal/Images.xcassets/inbox-inactive@1x.imageset/inbox_inactive.pdf deleted file mode 100644 index f8661d705..000000000 --- a/Signal/Images.xcassets/inbox-inactive@1x.imageset/inbox_inactive.pdf +++ /dev/null @@ -1,590 +0,0 @@ -%PDF-1.5 % -1 0 obj <> endobj 2 0 obj <>stream - - - - - application/pdf - - - inbox_inactive - - - - - Adobe Illustrator CS6 (Macintosh) - 2015-02-07T01:28:15-05:00 - 2015-02-07T01:28:15-05:00 - 2015-02-07T01:28:15-05:00 - - - - 256 - 256 - JPEG - /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FULf6pp2nx+pe3Mdup6c2AJ+Q6n6MVYtqP5paJBVbOGW8YdG/ukP0tVv+FxVjl7+aWvzEi2 ihtV7EKZH+9jx/4XFUmufOHme5r6mpTCv++29L/k3xxVLpdQv5jWW5lkPi7s36ziqHxV2KoiLUL+ E1iuZYz4o7L+o4qmNt5w8z21PT1KY0/343q/8nOWKpzZfmlr8JAuYobpe5KmN/vU8f8AhcVZHp35 paJPRbyGWzY9W/vUH0rRv+FxVlNhqmnahH6llcx3CjrwYEj5jqPpxVFYq7FXYq7FXYq7FXYq7FXY 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 - - - - - - uuid:C1BCCE1871B8DB11993190FCD52B4E9F - xmp.did:4ED73C7B20206811822AE763568782DB - uuid:4a30f144-e471-3142-9dc8-c66ed403eef0 - proof:pdf - - xmp.iid:4BD73C7B20206811822AE763568782DB - xmp.did:4BD73C7B20206811822AE763568782DB - uuid:C1BCCE1871B8DB11993190FCD52B4E9F - proof:pdf - - - - - saved - xmp.iid:46D73C7B20206811822AE763568782DB - 2015-02-07T01:19:30-05:00 - Adobe Illustrator CS6 (Macintosh) - / - - - saved - xmp.iid:4ED73C7B20206811822AE763568782DB - 2015-02-07T01:28:13-05:00 - Adobe Illustrator CS6 (Macintosh) - / - - - - - - Mobile - - - 1 - False - False - - 66.000000 - 66.000000 - Points - - - - Cyan - Magenta - Yellow - Black - - - - - - Default Swatch Group - 0 - - - - White - RGB - PROCESS - 255 - 255 - 255 - - - Black - RGB - PROCESS - 0 - 0 - 0 - - - RGB Red - RGB - PROCESS - 255 - 0 - 0 - - - RGB Yellow - RGB - PROCESS - 255 - 255 - 0 - - - RGB Green - RGB - PROCESS - 0 - 255 - 0 - - - RGB Cyan - RGB - PROCESS - 0 - 255 - 255 - - - RGB Blue - RGB - PROCESS - 0 - 0 - 255 - - - RGB Magenta - RGB - PROCESS - 255 - 0 - 255 - - - R=193 G=39 B=45 - RGB - PROCESS - 193 - 39 - 45 - - - R=237 G=28 B=36 - RGB - PROCESS - 237 - 28 - 36 - - - R=241 G=90 B=36 - RGB - PROCESS - 241 - 90 - 36 - - - R=247 G=147 B=30 - RGB - PROCESS - 247 - 147 - 30 - - - R=251 G=176 B=59 - RGB - PROCESS - 251 - 176 - 59 - - - R=252 G=238 B=33 - RGB - PROCESS - 252 - 238 - 33 - - - R=217 G=224 B=33 - RGB - PROCESS - 217 - 224 - 33 - - - R=140 G=198 B=63 - RGB - PROCESS - 140 - 198 - 63 - - - R=57 G=181 B=74 - RGB - PROCESS - 57 - 181 - 74 - - - R=0 G=146 B=69 - RGB - PROCESS - 0 - 146 - 69 - - - R=0 G=104 B=55 - RGB - PROCESS - 0 - 104 - 55 - - - R=34 G=181 B=115 - RGB - PROCESS - 34 - 181 - 115 - - - R=0 G=169 B=157 - RGB - PROCESS - 0 - 169 - 157 - - - R=41 G=171 B=226 - RGB - PROCESS - 41 - 171 - 226 - - - R=0 G=113 B=188 - RGB - PROCESS - 0 - 113 - 188 - - - R=46 G=49 B=146 - RGB - PROCESS - 46 - 49 - 146 - - - R=27 G=20 B=100 - RGB - PROCESS - 27 - 20 - 100 - - - R=102 G=45 B=145 - RGB - PROCESS - 102 - 45 - 145 - - - R=147 G=39 B=143 - RGB - PROCESS - 147 - 39 - 143 - - - R=158 G=0 B=93 - RGB - PROCESS - 158 - 0 - 93 - - - R=212 G=20 B=90 - RGB - PROCESS - 212 - 20 - 90 - - - R=237 G=30 B=121 - RGB - PROCESS - 237 - 30 - 121 - - - R=199 G=178 B=153 - RGB - PROCESS - 199 - 178 - 153 - - - R=153 G=134 B=117 - RGB - PROCESS - 153 - 134 - 117 - - - R=115 G=99 B=87 - RGB - PROCESS - 115 - 99 - 87 - - - R=83 G=71 B=65 - RGB - PROCESS - 83 - 71 - 65 - - - R=198 G=156 B=109 - RGB - PROCESS - 198 - 156 - 109 - - - R=166 G=124 B=82 - RGB - PROCESS - 166 - 124 - 82 - - - R=140 G=98 B=57 - RGB - PROCESS - 140 - 98 - 57 - - - R=117 G=76 B=36 - RGB - PROCESS - 117 - 76 - 36 - - - R=96 G=56 B=19 - RGB - PROCESS - 96 - 56 - 19 - - - R=66 G=33 B=11 - RGB - PROCESS - 66 - 33 - 11 - - - - - - Grays - 1 - - - - R=0 G=0 B=0 - RGB - PROCESS - 0 - 0 - 0 - - - R=26 G=26 B=26 - RGB - PROCESS - 26 - 26 - 26 - - - R=51 G=51 B=51 - RGB - PROCESS - 51 - 51 - 51 - - - R=77 G=77 B=77 - RGB - PROCESS - 77 - 77 - 77 - - - R=102 G=102 B=102 - RGB - PROCESS - 102 - 102 - 102 - - - R=128 G=128 B=128 - RGB - PROCESS - 128 - 128 - 128 - - - R=153 G=153 B=153 - RGB - PROCESS - 153 - 153 - 153 - - - R=179 G=179 B=179 - RGB - PROCESS - 179 - 179 - 179 - - - R=204 G=204 B=204 - RGB - PROCESS - 204 - 204 - 204 - - - R=230 G=230 B=230 - RGB - PROCESS - 230 - 230 - 230 - - - R=242 G=242 B=242 - RGB - PROCESS - 242 - 242 - 242 - - - - - - Mobile Color Group - 1 - - - - R=136 G=168 B=13 - RGB - PROCESS - 136 - 168 - 13 - - - R=127 G=71 B=221 - RGB - PROCESS - 127 - 71 - 221 - - - R=251 G=174 B=23 - RGB - PROCESS - 251 - 174 - 23 - - - - - - - - - Adobe PDF library 10.01 - - - - - - - - - - - - - - - - - - - - - - - - - endstream endobj 3 0 obj <> endobj 5 0 obj <>/Properties<>>>/TrimBox[0.0 0.0 66.0 66.0]/Type/Page>> endobj 6 0 obj <>stream -HDO0 IG#e :T ̨*@j:$Uwlnaq:1<b#/dwƲ - .Ϣ ӛ+^Yl܁w)rY%Fm*3,o4^4e(G`ʫ*[ endstream endobj 8 0 obj <> endobj 7 0 obj <> endobj 9 0 obj <> endobj xref 0 10 0000000000 65535 f -0000000016 00000 n -0000000076 00000 n -0000038853 00000 n -0000000000 00000 f -0000038904 00000 n -0000039136 00000 n -0000039472 00000 n -0000039346 00000 n -0000039584 00000 n -trailer <]>> startxref 39776 %%EOF \ No newline at end of file diff --git a/Signal/Signal-Info.plist b/Signal/Signal-Info.plist index 2aa65ad9e..05153bf9e 100644 --- a/Signal/Signal-Info.plist +++ b/Signal/Signal-Info.plist @@ -40,7 +40,7 @@ CFBundleVersion - 2.1.0 + 2.1.35 LOGS_EMAIL support@whispersystems.org LOGS_URL diff --git a/Signal/src/AppDelegate.m b/Signal/src/AppDelegate.m index d91a2e887..e181c5fa5 100644 --- a/Signal/src/AppDelegate.m +++ b/Signal/src/AppDelegate.m @@ -37,7 +37,6 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [self setupAppearance]; - [[PushManager sharedManager] registerPushKitNotificationFuture]; if (getenv("runningTests_dontStartApp")) { @@ -89,9 +88,14 @@ [self prepareScreenshotProtection]; if ([TSAccountManager isRegistered]) { - if ([self applicationIsActive]) { + if (application.applicationState == UIApplicationStateInactive) { [TSSocketManager becomeActiveFromForeground]; + } else if (application.applicationState == UIApplicationStateBackground) { + [TSSocketManager becomeActiveFromBackgroundExpectMessage:NO]; + } else { + DDLogWarn(@"The app was launched in an unknown way"); } + [[PushManager sharedManager] validateUserNotificationSettings]; [self refreshContacts]; [TSPreKeyManager refreshPreKeys]; @@ -157,7 +161,6 @@ [self protectScreen]; if ([TSAccountManager isRegistered]) { - [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0]; [self updateBadge]; [TSSocketManager resignActivity]; } @@ -165,6 +168,8 @@ - (void)updateBadge { if ([TSAccountManager isRegistered]) { + [[UIApplication sharedApplication] setApplicationIconBadgeNumber:1]; + [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0]; [[UIApplication sharedApplication] setApplicationIconBadgeNumber:(NSInteger)[[TSMessagesManager sharedManager] unreadMessagesCount]]; } } diff --git a/Signal/src/Storyboard/Storyboard.storyboard b/Signal/src/Storyboard/Storyboard.storyboard index 326cb8c70..de99ce76c 100755 --- a/Signal/src/Storyboard/Storyboard.storyboard +++ b/Signal/src/Storyboard/Storyboard.storyboard @@ -1,7 +1,7 @@ - + - + @@ -19,219 +19,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -261,7 +48,7 @@ - + @@ -269,7 +56,7 @@ - + @@ -278,7 +65,7 @@ - + @@ -304,94 +91,63 @@ - - - + - - - - - - - - - - + + + + + - - - - - - - - - - - - - - + - - + + + + + - - - - - - - - - - - - + - - + + + + + - - - - - - @@ -413,10 +169,7 @@ - - - @@ -4798,6 +4551,9 @@ A0 09 9A FF A8 8A 09 99 + + + @@ -4950,8 +4706,6 @@ A0 09 9A FF A8 8A 09 99 - - @@ -4962,8 +4716,6 @@ A0 09 9A FF A8 8A 09 99 - - @@ -4973,8 +4725,8 @@ A0 09 9A FF A8 8A 09 99 - - + + diff --git a/Signal/src/call/RecentCallManager.m b/Signal/src/call/RecentCallManager.m index 11135a49b..f6a9eed05 100644 --- a/Signal/src/call/RecentCallManager.m +++ b/Signal/src/call/RecentCallManager.m @@ -3,11 +3,12 @@ #import "FunctionalUtil.h" #import "ObservableValue.h" #import "PreferencesUtil.h" +#import "PushManager.h" #import "NSDate+millisecondTimeStamp.h" #import "TSCall.h" -#import "TSStorageManager.h" #import "TSContactThread.h" - +#import "TSMessagesManager.h" +#import "TSStorageManager.h" @interface RecentCallManager () @property YapDatabaseConnection *dbConnection; @@ -41,7 +42,8 @@ [call.futureTermination finallyDo:^(TOCFuture* interactionCompletion) { bool isOutgoingCall = call.initiatedLocally; - bool isMissedCall = interactionCompletion.hasFailed; + bool isMissedCall = [self isMissedCall:interactionCompletion]; + Contact* contact = [self tryGetContactForCall:call]; RPRecentCallType callType = isOutgoingCall ? RPRecentCallTypeOutgoing @@ -54,6 +56,18 @@ }]; } +- (BOOL)isMissedCall:(TOCFuture*)interactionCompletion { + if ([interactionCompletion hasResult]) { + if ([[interactionCompletion forceGetResult] isKindOfClass:[CallTermination class]]) { + CallTermination *termination = (CallTermination*)interactionCompletion.forceGetResult; + if (termination.type == CallTerminationType_HangupRemote) { + return YES; + } + } + } + return NO; +} + - (Contact*)tryGetContactForCall:(CallState*)call { if (call.potentiallySpecifiedContact != nil) return call.potentiallySpecifiedContact; return [self tryGetContactForNumber:call.remoteNumber]; @@ -82,7 +96,10 @@ NSDate *date = [NSDate dateWithTimeIntervalSince1970:(callDateSeconds+60)]; // archive has to happen in the future of the original call [thread archiveThreadWithTransaction:transaction referenceDate:date]; } + [call saveWithTransaction:transaction]; + + [[TSMessagesManager sharedManager] notifyUserForCall:call inThread:thread]; }]; } diff --git a/Signal/src/environment/Environment.m b/Signal/src/environment/Environment.m index f226f7175..4b7d804b2 100644 --- a/Signal/src/environment/Environment.m +++ b/Signal/src/environment/Environment.m @@ -7,6 +7,7 @@ #import "HostNameEndPoint.h" #import "RecentCallManager.h" #import "ContactsManager.h" +#import "MessagesViewController.h" #import "PreferencesUtil.h" #import "PhoneNumberDirectoryFilterManager.h" #import "SignalKeyingStorage.h" @@ -197,6 +198,17 @@ phoneDirectoryManager; if ([thread isGroupThread]) { [self messageGroup:(TSGroupThread*)thread]; } else { + Environment *env = [self getCurrent]; + SignalsViewController *vc = env.signalsViewController; + UIViewController *topvc = vc.navigationController.topViewController; + + if ([topvc isKindOfClass:[MessagesViewController class]]) { + MessagesViewController *mvc = (MessagesViewController*)topvc; + if ([mvc.thread.uniqueId isEqualToString:threadId]) { + [mvc popKeyBoard]; + return; + } + } [self messageIdentifier:((TSContactThread*)thread).contactIdentifier withCompose:YES]; } } @@ -209,7 +221,7 @@ phoneDirectoryManager; [vc.presentedViewController dismissViewControllerAnimated:YES completion:nil]; } - [vc.navigationController popToRootViewControllerAnimated:YES]; + [vc.navigationController popToRootViewControllerAnimated:NO]; vc.contactIdentifierFromCompose = identifier; vc.composeMessage = compose; [vc performSegueWithIdentifier:@"showSegue" sender:nil]; @@ -223,7 +235,7 @@ phoneDirectoryManager; [vc.presentedViewController dismissViewControllerAnimated:YES completion:nil]; } - [vc.navigationController popToRootViewControllerAnimated:YES]; + [vc.navigationController popToRootViewControllerAnimated:NO]; [vc performSegueWithIdentifier:@"showSegue" sender:groupThread]; } @@ -235,7 +247,7 @@ phoneDirectoryManager; [vc.presentedViewController dismissViewControllerAnimated:YES completion:nil]; } - [vc.navigationController popToRootViewControllerAnimated:YES]; + [vc.navigationController popToRootViewControllerAnimated:NO]; vc.groupFromCompose = model; vc.composeMessage = compose; [vc performSegueWithIdentifier:@"showSegue" sender:nil]; diff --git a/Signal/src/environment/VersionMigrations.m b/Signal/src/environment/VersionMigrations.m index 61ac19aa3..155530ae1 100644 --- a/Signal/src/environment/VersionMigrations.m +++ b/Signal/src/environment/VersionMigrations.m @@ -257,6 +257,7 @@ [[PushManager sharedManager] requestPushTokenWithSuccess:^(NSData *pushToken, NSData *voipToken) { [TSAccountManager registerForPushNotifications:pushToken voipToken:voipToken success:^{ + [UIApplication.sharedApplication setNetworkActivityIndicatorVisible:NO]; [[NSUserDefaults standardUserDefaults] removeObjectForKey:NEEDS_TO_REGISTER_PUSH_KEY]; [waitingController dismissViewControllerAnimated:YES completion:nil]; } failure:failure]; diff --git a/Signal/src/network/PushManager.h b/Signal/src/network/PushManager.h index 7e514bed8..fa094ef32 100644 --- a/Signal/src/network/PushManager.h +++ b/Signal/src/network/PushManager.h @@ -10,12 +10,16 @@ #import #define Signal_Thread_UserInfo_Key @"Signal_Thread_Id" +#define Signal_Call_UserInfo_Key @"Signal_Call_Id" #define Signal_Call_Accept_Identifier @"Signal_Call_Accept" #define Signal_Call_Decline_Identifier @"Signal_Call_Decline" +#define Signal_CallBack_Identifier @"Signal_CallBack" + #define Signal_Call_Category @"Signal_IncomingCall" #define Signal_Message_Category @"Signal_Message" +#define Signal_CallBack_Category @"Signal_CallBack" #define Signal_Message_View_Identifier @"Signal_Message_Read" #define Signal_Message_MarkAsRead_Identifier @"Signal_Message_MarkAsRead" @@ -66,6 +70,7 @@ typedef void (^registrationTokensSuccessBlock)(NSData *pushToken, NSData *voipTo -(TOCFuture*)registerPushKitNotificationFuture; - (BOOL)supportsVOIPPush; +- (UILocalNotification*)closeVOIPBackgroundTask; #pragma mark Push Notifications Delegate Methods diff --git a/Signal/src/network/PushManager.m b/Signal/src/network/PushManager.m index 55213ef3f..f0543b44d 100644 --- a/Signal/src/network/PushManager.m +++ b/Signal/src/network/PushManager.m @@ -15,6 +15,7 @@ #import "PreferencesUtil.h" #import "PushManager.h" #import "Environment.h" +#import "PreferencesUtil.h" #import "RPServerRequestsManager.h" #import "TSAccountManager.h" #import "TSSocketManager.h" @@ -26,6 +27,7 @@ @property TOCFutureSource *registerWithServerFutureSource; @property UIAlertView *missingPermissionsAlertView; @property (nonatomic, strong) NotificationTracker *notificationTracker; +@property UILocalNotification *lastCallNotification; @property (nonatomic) UIBackgroundTaskIdentifier callBackgroundTask; @end @@ -53,6 +55,7 @@ delegate:nil cancelButtonTitle:NSLocalizedString(@"OK", @"") otherButtonTitles:nil, nil]; + _callBackgroundTask = UIBackgroundTaskInvalid; } return self; } @@ -60,7 +63,6 @@ #pragma mark Manage Incoming Push -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { - if ([self isRedPhonePush:userInfo]) { ResponderSessionDescriptor* call; if (![self.notificationTracker shouldProcessNotification:userInfo]){ @@ -82,35 +84,51 @@ [Environment.phoneManager incomingCallWithSession:call]; - if (![self applicationIsActive]) { UILocalNotification *notification = [[UILocalNotification alloc] init]; NSString *callerId = call.initiatorNumber.toE164; NSString *nameString = [[Environment getCurrent].contactsManager nameStringForPhoneIdentifier:callerId]; - NSString *displayName = nameString?nameString:callerId; + NSString *displayName = nameString?nameString:callerId; + PropertyListPreferences *prefs = [Environment preferences]; + + if ([prefs notificationPreviewType] == NotificationNoNameNoPreview) { + notification.alertBody = NSLocalizedString(@"INCOMING_CALL", nil); + } else { + notification.alertBody = [NSString stringWithFormat:NSLocalizedString(@"INCOMING_CALL_FROM", nil), displayName]; + } - notification.alertBody = [NSString stringWithFormat:@"Incoming call from %@", displayName]; notification.category = Signal_Call_Category; notification.soundName = @"r.caf"; [[UIApplication sharedApplication] presentLocalNotificationNow:notification]; + _lastCallNotification = notification; - if (_callBackgroundTask == 0) { + if (_callBackgroundTask == UIBackgroundTaskInvalid) { _callBackgroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ - _callBackgroundTask = 0; - [Environment.phoneManager hangupOrDenyCall]; + [Environment.phoneManager backgroundTimeExpired]; + [self closeVOIPBackgroundTask]; }]; } } } else { if (![self applicationIsActive]) { - [TSSocketManager becomeActiveFromBackground]; + [TSSocketManager becomeActiveFromBackgroundExpectMessage:YES]; } } } +- (UILocalNotification*)closeVOIPBackgroundTask { + [[UIApplication sharedApplication] endBackgroundTask:_callBackgroundTask]; + _callBackgroundTask = UIBackgroundTaskInvalid; + + UILocalNotification *notif = _lastCallNotification; + _lastCallNotification = nil; + + return notif; +} + /** * This code should in principle never be called. The only cases where it would be called are with the old-style "content-available:1" pushes if there is no "voip" token registered * @@ -147,6 +165,11 @@ dispatch_get_main_queue(), ^{ completionHandler(); }); + } else if([identifier isEqualToString:Signal_CallBack_Identifier]){ + NSString * contactId = [notification.userInfo objectForKeyedSubscript:Signal_Call_UserInfo_Key]; + PhoneNumber *number = [PhoneNumber tryParsePhoneNumberFromUserSpecifiedText:contactId]; + Contact *contact = [[Environment.getCurrent contactsManager] latestContactForPhoneNumber:number]; + [Environment.phoneManager initiateOutgoingCallToContact:contact atRemoteNumber:number]; } else{ NSString *threadId = [notification.userInfo objectForKey:Signal_Thread_UserInfo_Key]; [Environment messageThreadId:threadId]; @@ -294,7 +317,9 @@ UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationType)[self allNotificationTypes] - categories:[NSSet setWithObjects:[self userNotificationsCallCategory], [self userNotificationsMessageCategory], nil]]; + categories:[NSSet setWithObjects:[self userNotificationsCallCategory], + [self userNotificationsMessageCategory], + [self userNotificationsCallBackCategory], nil]]; [UIApplication.sharedApplication registerUserNotificationSettings:settings]; return self.userNotificationFutureSource.future; @@ -303,7 +328,7 @@ - (UIUserNotificationCategory*)userNotificationsMessageCategory{ UIMutableUserNotificationAction *action_view = [UIMutableUserNotificationAction new]; action_view.identifier = Signal_Message_View_Identifier; - action_view.title = NSLocalizedString(@"View", @""); + action_view.title = NSLocalizedString(@"PUSH_MANAGER_VIEW", @""); action_view.activationMode = UIUserNotificationActivationModeForeground; action_view.destructive = NO; action_view.authenticationRequired = YES; @@ -339,6 +364,22 @@ return callCategory; } +- (UIUserNotificationCategory*)userNotificationsCallBackCategory{ + UIMutableUserNotificationAction *action_accept = [UIMutableUserNotificationAction new]; + action_accept.identifier = Signal_CallBack_Identifier; + action_accept.title = NSLocalizedString(@"CALLBACK_BUTTON_TITLE", @""); + action_accept.activationMode = UIUserNotificationActivationModeForeground; + action_accept.destructive = NO; + action_accept.authenticationRequired = NO; + + UIMutableUserNotificationCategory *callCategory = [UIMutableUserNotificationCategory new]; + callCategory.identifier = Signal_CallBack_Category; + [callCategory setActions:@[action_accept] forContext:UIUserNotificationActionContextMinimal]; + [callCategory setActions:@[action_accept] forContext:UIUserNotificationActionContextDefault]; + + return callCategory; +} + - (BOOL)needToRegisterForRemoteNotifications { return self.wantRemoteNotifications && (!UIApplication.sharedApplication.isRegisteredForRemoteNotifications); diff --git a/Signal/src/phone/PhoneManager.h b/Signal/src/phone/PhoneManager.h index 70d1188fa..b9edd0b36 100644 --- a/Signal/src/phone/PhoneManager.h +++ b/Signal/src/phone/PhoneManager.h @@ -31,6 +31,8 @@ -(void) hangupOrDenyCall; -(void) answerCall; -(BOOL) toggleMute; +-(void) backgroundTimeExpired; + -(ObservableValue*) currentCallObservable; +(PhoneManager*) phoneManagerWithErrorHandler:(ErrorHandlerBlock)errorHandler; diff --git a/Signal/src/phone/PhoneManager.m b/Signal/src/phone/PhoneManager.m index 222af1353..cc742b08f 100644 --- a/Signal/src/phone/PhoneManager.m +++ b/Signal/src/phone/PhoneManager.m @@ -135,13 +135,19 @@ -(CallController*) curCallController { return currentCallControllerObservable.currentValue; } --(void) answerCall { + +-(void)answerCall { [[self curCallController] acceptCall]; } --(void) hangupOrDenyCall { + +- (void)hangupOrDenyCall { [[self curCallController] hangupOrDenyCall]; } +- (void)backgroundTimeExpired { + [[self curCallController] backgroundTimeExpired]; +} + -(BOOL) toggleMute{ return [self.curCallController toggleMute]; } diff --git a/Signal/src/phone/callstate/CallController.h b/Signal/src/phone/callstate/CallController.h index f01c9188c..f61e0a6b8 100644 --- a/Signal/src/phone/callstate/CallController.h +++ b/Signal/src/phone/callstate/CallController.h @@ -37,6 +37,7 @@ -(void)advanceCallProgressTo:(enum CallProgressType)type; -(void)hangupOrDenyCall; -(void)acceptCall; +- (void)backgroundTimeExpired; -(void)advanceCallProgressToConversingWithShortAuthenticationString:(NSString*)sas; -(void)terminateWithReason:(enum CallTerminationType)reason withFailureInfo:(id)failureInfo diff --git a/Signal/src/phone/callstate/CallController.m b/Signal/src/phone/callstate/CallController.m index b225b5161..884cefc4a 100644 --- a/Signal/src/phone/callstate/CallController.m +++ b/Signal/src/phone/callstate/CallController.m @@ -90,6 +90,13 @@ [self unrestrictedAdvanceCallProgressTo:type]; } + +- (void)backgroundTimeExpired { + [self terminateWithReason:CallTerminationType_BackgroundTimeExpired + withFailureInfo:nil + andRelatedInfo:nil]; +} + -(void)hangupOrDenyCall { bool didDeny = [interactiveCallAcceptedOrDenied trySetResult:@NO]; diff --git a/Signal/src/phone/callstate/CallTermination.h b/Signal/src/phone/callstate/CallTermination.h index 4f46f5880..875e03670 100644 --- a/Signal/src/phone/callstate/CallTermination.h +++ b/Signal/src/phone/callstate/CallTermination.h @@ -25,6 +25,7 @@ enum CallTerminationType { // -- uh oh -- CallTerminationType_BadInteractionWithServer, /// The signaling or relay server did something we didn't expect or understand. CallTerminationType_UncategorizedFailure, /// Something went wrong. We didn't handle it properly, so we don't know what exactly it was. + CallTerminationType_BackgroundTimeExpired, /// The application expired available time while in background. }; /** diff --git a/Signal/src/textsecure/Messages/TSCall.m b/Signal/src/textsecure/Messages/TSCall.m index 0c9ad271c..1204c0928 100644 --- a/Signal/src/textsecure/Messages/TSCall.m +++ b/Signal/src/textsecure/Messages/TSCall.m @@ -18,7 +18,7 @@ self = [super initWithTimestamp:timeStamp inThread:thread]; if (self) { - _callType = callType; + _callType = callType; } return self; diff --git a/Signal/src/textsecure/Messages/TSErrorMessage.m b/Signal/src/textsecure/Messages/TSErrorMessage.m index 04f151f75..cab73ccb2 100644 --- a/Signal/src/textsecure/Messages/TSErrorMessage.m +++ b/Signal/src/textsecure/Messages/TSErrorMessage.m @@ -8,6 +8,7 @@ #import "TSErrorMessage.h" #import "NSDate+millisecondTimeStamp.h" +#import "TSMessagesManager.h" #import "TSErrorMessage_privateConstructor.h" @@ -20,11 +21,14 @@ _errorType = errorMessageType; } + [[TSMessagesManager sharedManager] notifyUserForError:self inThread:thread]; + return self; } - (instancetype)initWithSignal:(IncomingPushMessageSignal*)signal transaction:(YapDatabaseReadWriteTransaction*)transaction failedMessageType:(TSErrorMessageType)errorMessageType{ TSContactThread *contactThread = [TSContactThread getOrCreateThreadWithContactId:signal.source transaction:transaction]; + return [self initWithTimestamp:signal.timestamp inThread:contactThread failedMessageType:errorMessageType]; } diff --git a/Signal/src/textsecure/Messages/TSMessage.m b/Signal/src/textsecure/Messages/TSMessage.m index b278dedd7..f8a781030 100644 --- a/Signal/src/textsecure/Messages/TSMessage.m +++ b/Signal/src/textsecure/Messages/TSMessage.m @@ -50,7 +50,7 @@ NSString * const TSAttachementsRelationshipEdgeName = @"TSAttachmentEdge"; self = [super initWithTimestamp:timestamp inThread:thread]; if (self) { - _body = body; + _body = body; _attachments = [attachments mutableCopy]; } return self; @@ -62,7 +62,7 @@ NSString * const TSAttachementsRelationshipEdgeName = @"TSAttachmentEdge"; - (NSString *)description{ if(self.attachments > 0){ - return @"Attachment"; + return NSLocalizedString(@"ATTACHMENT", nil); } else { return self.body; } diff --git a/Signal/src/textsecure/Messages/TSMessagesManager.h b/Signal/src/textsecure/Messages/TSMessagesManager.h index 09ce526de..c1b63fbf5 100644 --- a/Signal/src/textsecure/Messages/TSMessagesManager.h +++ b/Signal/src/textsecure/Messages/TSMessagesManager.h @@ -11,6 +11,7 @@ #import "TSIncomingMessage.h" #import "TSOutgoingMessage.h" #import "TSInvalidIdentityKeySendingErrorMessage.h" +@class TSCall; @interface TSMessagesManager : NSObject @@ -21,6 +22,8 @@ - (void)handleMessageSignal:(IncomingPushMessageSignal*)messageSignal; - (void)processException:(NSException*)exception outgoingMessage:(TSOutgoingMessage*)message inThread:(TSThread*)thread; +- (void)notifyUserForError:(TSErrorMessage*)message inThread:(TSThread*)thread; +- (void)notifyUserForCall:(TSCall*)call inThread:(TSThread*)thread; - (void)handleReceivedMessage:(IncomingPushMessageSignal*)message withContent:(PushMessageContent*)content attachments:(NSArray*)attachments; - (void)handleReceivedMessage:(IncomingPushMessageSignal*)message withContent:(PushMessageContent*)content attachments:(NSArray*)attachments completionBlock:(void (^)(NSString* messageIdentifier))completionBlock ; @@ -28,5 +31,6 @@ - (void)handleSendToMyself:(TSOutgoingMessage*)outgoingMessage; - (NSUInteger)unreadMessagesCount; +- (NSUInteger)unreadMessagesCountExcept:(TSThread*)thread; @end diff --git a/Signal/src/textsecure/Messages/TSMessagesManager.m b/Signal/src/textsecure/Messages/TSMessagesManager.m index ae1e72473..aad185674 100644 --- a/Signal/src/textsecure/Messages/TSMessagesManager.m +++ b/Signal/src/textsecure/Messages/TSMessagesManager.m @@ -41,6 +41,7 @@ #import "Environment.h" #import "PreferencesUtil.h" #import "ContactsManager.h" +#import "TSCall.h" #import #import @@ -348,7 +349,12 @@ } NSString *name = [thread name]; - [self notifyUserForIncomingMessage:incomingMessage from:name inThread:thread]; + + if (incomingMessage && thread) { + [self notifyUserForIncomingMessage:incomingMessage + from:name + inThread:thread]; + } }]; } @@ -407,6 +413,67 @@ return numberOfItems; } +- (NSUInteger)unreadMessagesCountExcept:(TSThread*)thread { + __block NSUInteger numberOfItems; + [self.dbConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) { + numberOfItems = [[transaction ext:TSUnreadDatabaseViewExtensionName] numberOfItemsInAllGroups]; + numberOfItems = numberOfItems - [[transaction ext:TSUnreadDatabaseViewExtensionName] numberOfItemsInGroup:thread.uniqueId]; + }]; + + return numberOfItems; +} + +- (void)notifyUserForCall:(TSCall*)call inThread:(TSThread*)thread { + if ([UIApplication sharedApplication].applicationState != UIApplicationStateActive){ + // Remove previous notification of call and show missed notification. + UILocalNotification *notif = [[PushManager sharedManager] closeVOIPBackgroundTask]; + TSContactThread *cThread = (TSContactThread*)thread; + + if (call.callType == RPRecentCallTypeMissed) { + [[UIApplication sharedApplication] cancelLocalNotification:notif]; + + UILocalNotification *notification = [[UILocalNotification alloc] init]; + notification.category = Signal_CallBack_Category; + notification.userInfo = @{Signal_Call_UserInfo_Key:cThread.contactIdentifier}; + notification.soundName = @"NewMessage.aifc"; + notification.alertBody = [NSString stringWithFormat:NSLocalizedString(@"MSGVIEW_MISSED_CALL", nil), [thread name]]; + + [[UIApplication sharedApplication] presentLocalNotificationNow:notification]; + } + } +} + +- (void)notifyUserForError:(TSErrorMessage*)message inThread:(TSThread*)thread { + NSString *messageDescription = message.description; + + if (([UIApplication sharedApplication].applicationState != UIApplicationStateActive) && messageDescription) { + UILocalNotification *notification = [[UILocalNotification alloc] init]; + notification.category = Signal_Message_Category; + notification.userInfo = @{Signal_Thread_UserInfo_Key:thread.uniqueId}; + notification.soundName = @"NewMessage.aifc"; + + NSString *alertBodyString = @""; + + NSString *authorName = [thread name]; + switch ([[Environment preferences] notificationPreviewType]) { + case NotificationNamePreview: + case NotificationNameNoPreview: + alertBodyString = [NSString stringWithFormat:@"%@: %@", authorName,messageDescription]; + break; + case NotificationNoNameNoPreview: + alertBodyString = messageDescription; + break; + } + notification.alertBody = alertBodyString; + + [[UIApplication sharedApplication] presentLocalNotificationNow:notification]; + } else { + if ([Environment.preferences soundInForeground]) { + AudioServicesPlayAlertSound(_newMessageSound); + } + } +} + - (void)notifyUserForIncomingMessage:(TSIncomingMessage*)message from:(NSString*)name inThread:(TSThread*)thread { NSString *messageDescription = message.description; @@ -424,7 +491,8 @@ sender = message.authorId; } - notification.alertBody = [NSString stringWithFormat:@"New message from %@ in group \"%@\": %@", sender, name, messageDescription]; + NSString *threadName = [NSString stringWithFormat:@"\"%@\"", name]; + notification.alertBody = [NSString stringWithFormat:NSLocalizedString(@"APN_MESSAGE_IN_GROUP_DETAILED", nil), sender, threadName, messageDescription]; } else { notification.alertBody = [NSString stringWithFormat:@"%@: %@", name, messageDescription]; } diff --git a/Signal/src/textsecure/Network/API/Requests/TSRecipientPrekeyRequest.m b/Signal/src/textsecure/Network/API/Requests/TSRecipientPrekeyRequest.m index d34722e7f..89276baa2 100644 --- a/Signal/src/textsecure/Network/API/Requests/TSRecipientPrekeyRequest.m +++ b/Signal/src/textsecure/Network/API/Requests/TSRecipientPrekeyRequest.m @@ -16,7 +16,8 @@ self = [super initWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@/%@/%@", textSecureKeysAPI, recipientInformation, deviceId]]]; - [self setHTTPMethod:@"GET"]; + self.HTTPMethod = @"GET"; + self.parameters = nil; return self; } diff --git a/Signal/src/textsecure/Network/WebSockets/TSSocketManager.h b/Signal/src/textsecure/Network/WebSockets/TSSocketManager.h index 5b7a5033a..70868f58b 100644 --- a/Signal/src/textsecure/Network/WebSockets/TSSocketManager.h +++ b/Signal/src/textsecure/Network/WebSockets/TSSocketManager.h @@ -24,7 +24,7 @@ extern NSString * const SocketConnectingNotification; @interface TSSocketManager : NSObject + (void)becomeActiveFromForeground; -+ (void)becomeActiveFromBackground; ++ (void)becomeActiveFromBackgroundExpectMessage:(BOOL)expected; + (void)resignActivity; + (void)sendNotification; diff --git a/Signal/src/textsecure/Network/WebSockets/TSSocketManager.m b/Signal/src/textsecure/Network/WebSockets/TSSocketManager.m index 309d2717e..35bca2d25 100644 --- a/Signal/src/textsecure/Network/WebSockets/TSSocketManager.m +++ b/Signal/src/textsecure/Network/WebSockets/TSSocketManager.m @@ -21,7 +21,7 @@ #define kWebSocketHeartBeat 30 #define kWebSocketReconnectTry 5 -#define kBackgroundConnectTimer 10 +#define kBackgroundConnectTimer 25 #define kBackgroundConnectKeepAlive 15 NSString * const SocketOpenedNotification = @"SocketOpenedNotification"; @@ -38,7 +38,10 @@ NSString * const SocketConnectingNotification = @"SocketConnectingNotification"; @property (nonatomic) UIBackgroundTaskIdentifier fetchingTaskIdentifier; -@property BOOL didFetchInBackground; +@property BOOL didConnectBg; +@property BOOL didRetreiveMessageBg; +@property BOOL shouldDownloadMessage; + @property (nonatomic, retain) NSTimer *backgroundKeepAliveTimer; @property (nonatomic, retain) NSTimer *backgroundConnectTimer; @@ -51,7 +54,10 @@ NSString * const SocketConnectingNotification = @"SocketConnectingNotification"; if (self) { self.websocket = nil; - [self addObserver:self forKeyPath:@"status" options:0 context:kSocketStatusObservationContext]; + [self addObserver:self + forKeyPath:@"status" + options:0 + context:kSocketStatusObservationContext]; } return self; @@ -63,7 +69,9 @@ NSString * const SocketConnectingNotification = @"SocketConnectingNotification"; dispatch_once(&onceToken, ^{ sharedMyManager = [[self alloc] init]; sharedMyManager.fetchingTaskIdentifier = UIBackgroundTaskInvalid; - sharedMyManager.didFetchInBackground = NO; + sharedMyManager.didConnectBg = NO; + sharedMyManager.shouldDownloadMessage = NO; + sharedMyManager.didRetreiveMessageBg = NO; }); return sharedMyManager; } @@ -118,7 +126,7 @@ NSString * const SocketConnectingNotification = @"SocketConnectingNotification"; #pragma mark - Delegate methods - (void)webSocketDidOpen:(SRWebSocket *)webSocket { - self.pingTimer = [NSTimer scheduledTimerWithTimeInterval:kWebSocketHeartBeat + self.pingTimer = [NSTimer timerWithTimeInterval:kWebSocketHeartBeat target:self selector:@selector(webSocketHeartBeat) userInfo:nil @@ -131,6 +139,7 @@ NSString * const SocketConnectingNotification = @"SocketConnectingNotification"; self.status = kSocketStatusOpen; [self.reconnectTimer invalidate]; self.reconnectTimer = nil; + self.didConnectBg = YES; } - (void)webSocket:(SRWebSocket *)webSocket didFailWithError:(NSError *)error { @@ -143,7 +152,7 @@ NSString * const SocketConnectingNotification = @"SocketConnectingNotification"; - (void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(NSData*)data { WebSocketMessage *wsMessage = [WebSocketMessage parseFromData:data]; - self.didFetchInBackground = YES; + self.didRetreiveMessageBg = YES; if (wsMessage.type == WebSocketMessageTypeRequest) { [self processWebSocketRequestMessage:wsMessage.request]; @@ -158,7 +167,6 @@ NSString * const SocketConnectingNotification = @"SocketConnectingNotification"; DDLogInfo(@"Got message with verb: %@ and path: %@", message.verb, message.path); [self sendWebSocketMessageAcknowledgement:message]; - [self keepAliveBackground]; if ([message.path isEqualToString:@"/api/v1/message"] && [message.verb isEqualToString:@"PUT"]){ @@ -184,7 +192,7 @@ NSString * const SocketConnectingNotification = @"SocketConnectingNotification"; if (self.fetchingTaskIdentifier) { [self.backgroundKeepAliveTimer invalidate]; - self.backgroundKeepAliveTimer = [NSTimer scheduledTimerWithTimeInterval:kBackgroundConnectKeepAlive + self.backgroundKeepAliveTimer = [NSTimer timerWithTimeInterval:kBackgroundConnectKeepAlive target:self selector:@selector(backgroundTimeExpired) userInfo:nil @@ -243,8 +251,8 @@ NSString * const SocketConnectingNotification = @"SocketConnectingNotification"; } - (void)scheduleRetry { - if (!self.reconnectTimer || ![self.reconnectTimer isValid]) { - self.reconnectTimer = [NSTimer scheduledTimerWithTimeInterval:kWebSocketReconnectTry + if (![self.reconnectTimer isValid]) { + self.reconnectTimer = [NSTimer timerWithTimeInterval:kWebSocketReconnectTry target:[self class] selector:@selector(becomeActive) userInfo:nil @@ -252,6 +260,8 @@ NSString * const SocketConnectingNotification = @"SocketConnectingNotification"; // Additionally, we want the reconnect timer to work in the background too. [[NSRunLoop mainRunLoop] addTimer:self.reconnectTimer forMode:NSDefaultRunLoopMode]; + } else { + DDLogWarn(@"Not scheduling retry, valid timer"); } } @@ -259,7 +269,6 @@ NSString * const SocketConnectingNotification = @"SocketConnectingNotification"; + (void)becomeActiveFromForeground { TSSocketManager *sharedInstance = [self sharedManager]; - [sharedInstance.backgroundKeepAliveTimer invalidate]; if (sharedInstance.fetchingTaskIdentifier != UIBackgroundTaskInvalid) { [sharedInstance closeBackgroundTask]; @@ -268,26 +277,23 @@ NSString * const SocketConnectingNotification = @"SocketConnectingNotification"; [self becomeActive]; } - -+ (void)becomeActiveFromBackground { ++ (void)becomeActiveFromBackgroundExpectMessage:(BOOL)expected { TSSocketManager *sharedInstance = [TSSocketManager sharedManager]; if (sharedInstance.fetchingTaskIdentifier == UIBackgroundTaskInvalid) { - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ - sharedInstance.backgroundConnectTimer = [NSTimer scheduledTimerWithTimeInterval:kBackgroundConnectTimer + sharedInstance.backgroundConnectTimer = [NSTimer timerWithTimeInterval:kBackgroundConnectTimer target:sharedInstance selector:@selector(backgroundConnectTimerExpired) userInfo:nil repeats:NO]; - - NSRunLoop *loop = [NSRunLoop currentRunLoop]; - [loop addTimer:[TSSocketManager sharedManager].backgroundConnectTimer - forMode:NSDefaultRunLoopMode]; - [loop run]; - }); + NSRunLoop *loop = [NSRunLoop mainRunLoop]; + [loop addTimer:[TSSocketManager sharedManager].backgroundConnectTimer + forMode:NSDefaultRunLoopMode]; [sharedInstance.backgroundKeepAliveTimer invalidate]; - sharedInstance.didFetchInBackground = NO; + sharedInstance.didConnectBg = NO; + sharedInstance.didRetreiveMessageBg = NO; + sharedInstance.shouldDownloadMessage = expected; sharedInstance.fetchingTaskIdentifier = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ [TSSocketManager resignActivity]; [[TSSocketManager sharedManager] closeBackgroundTask]; @@ -312,9 +318,16 @@ NSString * const SocketConnectingNotification = @"SocketConnectingNotification"; [self.backgroundKeepAliveTimer invalidate]; [self.backgroundConnectTimer invalidate]; - if (!self.didFetchInBackground) { +/* + If VOIP Push worked, we should just have to check if message was retreived and if not, alert the user. + But we have to rely on the server for the fallback in failed cases since background push is unreliable. + https://devforums.apple.com/message/1135227 + + if ((self.shouldDownloadMessage && !self.didRetreiveMessageBg) || !self.didConnectBg) { [self backgroundConnectTimedOut]; } + + */ [[UIApplication sharedApplication] endBackgroundTask:self.fetchingTaskIdentifier]; self.fetchingTaskIdentifier = UIBackgroundTaskInvalid; @@ -323,6 +336,7 @@ NSString * const SocketConnectingNotification = @"SocketConnectingNotification"; - (void)backgroundConnectTimedOut { UILocalNotification *notification = [[UILocalNotification alloc] init]; notification.alertBody = NSLocalizedString(@"APN_FETCHED_FAILED", nil); + notification.soundName = @"NewMessage.aifc"; [[UIApplication sharedApplication] presentLocalNotificationNow:notification]; } diff --git a/Signal/src/textsecure/TSConstants.h b/Signal/src/textsecure/TSConstants.h index bbafc50ab..8ad78011b 100644 --- a/Signal/src/textsecure/TSConstants.h +++ b/Signal/src/textsecure/TSConstants.h @@ -29,11 +29,11 @@ typedef enum { #define textSecureHTTPTimeOut 10 -#define textSecureWebSocketAPI @"wss://textsecure-service.whispersystems.org/v1/websocket/" -#define textSecureServerURL @"https://textsecure-service.whispersystems.org/" +#define textSecureWebSocketAPI @"wss://textsecure-service.whispersystems.org/v1/websocket/" +#define textSecureServerURL @"https://textsecure-service.whispersystems.org/" -//#define textSecureWebSocketAPI @"wss://textsecure-service-staging.whispersystems.org/v1/websocket/" -//#define textSecureServerURL @"https://textsecure-service-staging.whispersystems.org/" +//#define textSecureWebSocketAPI @"wss://textsecure-service-staging.whispersystems.org/v1/websocket/" +//#define textSecureServerURL @"https://textsecure-service-staging.whispersystems.org/" #define textSecureGeneralAPI @"v1" #define textSecureAccountsAPI @"v1/accounts" diff --git a/Signal/src/view controllers/MessagesViewController.h b/Signal/src/view controllers/MessagesViewController.h index e6516931e..6ff3edaf7 100644 --- a/Signal/src/view controllers/MessagesViewController.h +++ b/Signal/src/view controllers/MessagesViewController.h @@ -24,10 +24,14 @@ @property (nonatomic,strong) MPMoviePlayerController* videoPlayer; @property (nonatomic,strong) AVAudioPlayer* audioPlayer; @property (nonatomic,strong) AVAudioRecorder* audioRecorder; + - (void)setupWithThread:(TSThread*)thread; - (void)setupWithTSIdentifier:(NSString*)identifier; - (void)setupWithTSGroup:(TSGroupModel*)model; - (void)setComposeOnOpen:(BOOL)compose; +- (TSThread*)thread; +- (void)popKeyBoard; + @end diff --git a/Signal/src/view controllers/MessagesViewController.m b/Signal/src/view controllers/MessagesViewController.m index 25aa42278..5174b7f5b 100644 --- a/Signal/src/view controllers/MessagesViewController.m +++ b/Signal/src/view controllers/MessagesViewController.m @@ -9,6 +9,7 @@ #import "AppDelegate.h" #import + #import "MessagesViewController.h" #import "FullImageViewController.h" #import "FingerprintViewController.h" @@ -82,9 +83,13 @@ typedef enum : NSUInteger { @interface MessagesViewController () { UIImage* tappedImage; BOOL isGroupConversation; + + UIView *_unreadContainer; + UIImageView *_unreadBackground; + UILabel *_unreadLabel; + NSUInteger _unreadCount; } - @property (nonatomic, weak) UIView *navView; @property (nonatomic, retain) TSThread *thread; @property (nonatomic, strong) YapDatabaseConnection *editingDatabaseConnection; @@ -113,6 +118,11 @@ typedef enum : NSUInteger { @end +@interface UINavigationItem(){ + UIView *backButtonView; +} +@end + @implementation MessagesViewController - (void)setupWithTSIdentifier:(NSString *)identifier { @@ -146,6 +156,9 @@ typedef enum : NSUInteger { isGroupConversation = [self.thread isKindOfClass:[TSGroupThread class]]; } +- (TSThread *)thread { + return _thread; +} - (void)hideInputIfNeeded { if([_thread isKindOfClass:[TSGroupThread class]] && ![((TSGroupThread*)_thread).groupModel.groupMemberIds containsObject:[SignalKeyingStorage.localNumber toE164]]) { @@ -229,7 +242,7 @@ typedef enum : NSUInteger { } - (void)startReadTimer { - self.readTimer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(markAllMessagesAsRead) userInfo:nil repeats:YES]; + self.readTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(markAllMessagesAsRead) userInfo:nil repeats:YES]; } - (void)cancelReadTimer { @@ -237,23 +250,32 @@ typedef enum : NSUInteger { } - (void)viewDidAppear:(BOOL)animated { + [self updateBackButton]; [super viewDidAppear:animated]; [self markAllMessagesAsRead]; [self startReadTimer]; _isVisible = YES; [self initializeTitleLabelGestureRecognizer]; + [self updateBackButton]; + if (_composeOnOpen) { [self popKeyBoard]; } } +- (void)updateBackButton { + [self setUnreadCount:[[TSMessagesManager sharedManager] unreadMessagesCountExcept:self.thread]]; +} + - (void)viewWillDisappear:(BOOL)animated { if ([self.navigationController.viewControllers indexOfObject:self]==NSNotFound) { // back button was pressed. [self.navController hideDropDown:self]; } [super viewWillDisappear:animated]; + [_unreadContainer removeFromSuperview]; + _unreadContainer = nil; [_audioPlayerPoller invalidate]; [_audioPlayer stop]; @@ -1328,6 +1350,9 @@ typedef enum : NSUInteger { - (void)yapDatabaseModified:(NSNotification *)notification { + + [self updateBackButton]; + if(isGroupConversation) { [self.uiDatabaseConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) { TSGroupThread* gThread = (TSGroupThread*)self.thread; @@ -1657,6 +1682,58 @@ typedef enum : NSUInteger { } } +#pragma mark Unread Badge + +- (void)setUnreadCount:(NSUInteger)unreadCount { + if (_unreadCount != unreadCount) { + _unreadCount = unreadCount; + + if (_unreadCount > 0) { + if (_unreadContainer == nil) { + static UIImage *backgroundImage = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^ + { + UIGraphicsBeginImageContextWithOptions(CGSizeMake(17.0f, 17.0f), false, 0.0f); + CGContextRef context = UIGraphicsGetCurrentContext(); + CGContextSetFillColorWithColor(context, [UIColor redColor].CGColor); + CGContextFillEllipseInRect(context, CGRectMake(0.0f, 0.0f, 17.0f, 17.0f)); + backgroundImage = [UIGraphicsGetImageFromCurrentImageContext() stretchableImageWithLeftCapWidth:8 topCapHeight:8]; + UIGraphicsEndImageContext(); + }); + + _unreadContainer = [[UIImageView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 10.0f, 10.0f)]; + _unreadContainer.userInteractionEnabled = NO; + _unreadContainer.layer.zPosition = 2000; + [self.navigationController.navigationBar addSubview:_unreadContainer]; + + _unreadBackground = [[UIImageView alloc] initWithImage:backgroundImage]; + [_unreadContainer addSubview:_unreadBackground]; + + _unreadLabel = [[UILabel alloc] init]; + _unreadLabel.backgroundColor = [UIColor clearColor]; + _unreadLabel.textColor = [UIColor whiteColor]; + _unreadLabel.font = [UIFont systemFontOfSize:12]; + [_unreadContainer addSubview:_unreadLabel]; + } + _unreadContainer.hidden = false; + + _unreadLabel.text = [NSString stringWithFormat:@"%lu", (unsigned long)unreadCount]; + [_unreadLabel sizeToFit]; + + CGPoint offset = CGPointMake(17.0f, 2.0f); + + _unreadBackground.frame = CGRectMake(offset.x, offset.y, + MAX(_unreadLabel.frame.size.width + 8.0f, 17.0f), 17.0f); + _unreadLabel.frame = CGRectMake(offset.x + floor((2.0f*(_unreadBackground.frame.size.width - _unreadLabel.frame.size.width)/ 2.0f)/2.0f), offset.y + 1.0f, + _unreadLabel.frame.size.width, _unreadLabel.frame.size.height); + + } else if (_unreadContainer != nil) { + _unreadContainer.hidden = true; + } + } +} + - (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; } diff --git a/Signal/src/view controllers/NotificationSettingsOptionsViewController.m b/Signal/src/view controllers/NotificationSettingsOptionsViewController.m index 7352c03bb..fd2a87929 100644 --- a/Signal/src/view controllers/NotificationSettingsOptionsViewController.m +++ b/Signal/src/view controllers/NotificationSettingsOptionsViewController.m @@ -22,6 +22,7 @@ self.options = @[@(NotificationNamePreview), @(NotificationNameNoPreview), @(NotificationNoNameNoPreview)]; + [super viewDidLoad]; } @@ -41,11 +42,22 @@ { UITableViewCell *cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"NotificationSettingsOption"]; PropertyListPreferences *prefs = [Environment preferences]; - [[cell textLabel] setText:[prefs nameForNotificationPreviewType:[[self.options objectAtIndex:(NSUInteger)indexPath.row] unsignedIntegerValue]]]; + NSUInteger notifType = [[self.options objectAtIndex:(NSUInteger)indexPath.row] unsignedIntegerValue]; + [[cell textLabel] setText:[prefs nameForNotificationPreviewType:notifType]]; + + NotificationType selectedNotifType = [prefs notificationPreviewType]; + + if (selectedNotifType == notifType) { + cell.accessoryType = UITableViewCellAccessoryCheckmark; + } return cell; } +- (NSString*)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section { + return NSLocalizedString(@"NOTIFICATIONS_FOOTER_WARNING", nil); +} + - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [Environment.preferences setNotificationPreviewType:[[self.options objectAtIndex:(NSUInteger)indexPath.row] unsignedIntegerValue]]; diff --git a/Signal/src/view controllers/UITests/SignalsViewController.h b/Signal/src/view controllers/UITests/SignalsViewController.h index 2f8a9fa76..3ad8bfe54 100644 --- a/Signal/src/view controllers/UITests/SignalsViewController.h +++ b/Signal/src/view controllers/UITests/SignalsViewController.h @@ -20,13 +20,11 @@ @property (nonatomic) BOOL composeMessage; @property (nonatomic, retain) IBOutlet UITableView *tableView; -@property (nonatomic, retain) IBOutlet UIButton *inboxButton; -@property (nonatomic, retain) IBOutlet UIButton *archiveButton; -@property (nonatomic, retain) IBOutlet UILabel *inboxCountLabel; @property (nonatomic, strong) IBOutlet UILabel *emptyBoxLabel; @property (nonatomic, retain) CallState* latestCall; -(IBAction)selectedInbox:(id)sender; -(IBAction)selectedArchive:(id)sender; + @end diff --git a/Signal/src/view controllers/UITests/SignalsViewController.m b/Signal/src/view controllers/UITests/SignalsViewController.m index 23fa01f42..908e38eab 100644 --- a/Signal/src/view controllers/UITests/SignalsViewController.m +++ b/Signal/src/view controllers/UITests/SignalsViewController.m @@ -48,6 +48,7 @@ static NSString* const kShowSignupFlowSegue = @"showSignupFlow"; @property (nonatomic, strong) YapDatabaseViewMappings *threadMappings; @property (nonatomic) CellState viewingThreadsIn; @property (nonatomic) long inboxCount; +@property (nonatomic, retain) UISegmentedControl *segmentedControl; @end @@ -76,8 +77,21 @@ static NSString* const kShowSignupFlowSegue = @"showSignupFlow"; [[[Environment getCurrent] contactsManager].getObservableContacts watchLatestValue:^(id latestValue) { [self.tableView reloadData]; } onThread:[NSThread mainThread] untilCancelled:nil]; - self.title = NSLocalizedString(@"CONVERSATIONS_VIEW_TITLE", @""); + + self.segmentedControl = [[UISegmentedControl alloc] initWithItems:@[NSLocalizedString(@"WHISPER_NAV_BAR_TITLE", nil), + NSLocalizedString(@"ARCHIVE_NAV_BAR_TITLE", nil)]]; + + [self.segmentedControl addTarget:self action:@selector(swappedSegmentedControl) forControlEvents:UIControlEventValueChanged]; + self.navigationItem.titleView = self.segmentedControl; + [self.segmentedControl setSelectedSegmentIndex:0]; +} +- (void)swappedSegmentedControl { + if (self.segmentedControl.selectedSegmentIndex == 0) { + [self selectedInbox:nil]; + } else { + [self selectedArchive:nil]; + } } -(void)viewWillAppear:(BOOL)animated @@ -186,7 +200,6 @@ static NSString* const kShowSignupFlowSegue = @"showSignupFlow"; - (void)tableViewCellTappedDelete:(NSIndexPath*)indexPath { TSThread *thread = [self threadForIndexPath:indexPath]; if([thread isKindOfClass:[TSGroupThread class]]) { - DDLogDebug(@"leaving the group"); TSOutgoingMessage *message = [[TSOutgoingMessage alloc] initWithTimestamp:[NSDate ows_millisecondTimeStamp] inThread:thread messageBody:@"" attachments:[[NSMutableArray alloc] init]]; message.groupMetaMessage = TSGroupMessageQuit; [[TSMessagesManager sharedManager] sendMessage:message inThread:thread]; @@ -210,17 +223,20 @@ static NSString* const kShowSignupFlowSegue = @"showSignupFlow"; } --(void) updateInboxCountLabel { +- (NSNumber*)updateInboxCountLabel { NSUInteger numberOfItems = [[TSMessagesManager sharedManager] unreadMessagesCount]; - NSNumber *badgeNumber = [NSNumber numberWithUnsignedInteger:numberOfItems]; - NSString *badgeValue = nil; + NSNumber *badgeNumber = [NSNumber numberWithUnsignedInteger:numberOfItems]; + NSString *unreadString = NSLocalizedString(@"WHISPER_NAV_BAR_TITLE", nil); if (![badgeNumber isEqualToNumber:@0]) { - badgeValue = [badgeNumber stringValue]; + NSString *badgeValue = [badgeNumber stringValue]; + unreadString = [unreadString stringByAppendingFormat:@" (%@)", badgeValue]; } + [_segmentedControl setTitle:unreadString forSegmentAtIndex:0]; [[UIApplication sharedApplication] setApplicationIconBadgeNumber:badgeNumber.integerValue]; - self.inboxCountLabel.text = badgeValue; + + return badgeNumber; } -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath{ @@ -267,15 +283,11 @@ static NSString* const kShowSignupFlowSegue = @"showSignupFlow"; -(IBAction)selectedInbox:(id)sender { self.viewingThreadsIn = kInboxState; - [self.inboxButton setSelected:YES]; - [self.archiveButton setSelected:NO]; [self changeToGrouping:TSInboxGroup]; } -(IBAction)selectedArchive:(id)sender { self.viewingThreadsIn = kArchiveState; - [self.inboxButton setSelected:NO]; - [self.archiveButton setSelected:YES]; [self changeToGrouping:TSArchiveGroup]; } @@ -324,8 +336,6 @@ static NSString* const kShowSignupFlowSegue = @"showSignupFlow"; return; } - [self updateInboxCountLabel]; - [self.tableView beginUpdates]; for (YapDatabaseViewSectionChange *sectionChange in sectionChanges) diff --git a/Signal/translations/ar.lproj/Localizable.strings b/Signal/translations/ar.lproj/Localizable.strings index 11ec97f8608716fe8139b9df475c0230ae486772..1145bee66b43d087f271541d5f29012215a31d3b 100644 GIT binary patch delta 293 zcmZ2=hVk8b#tla#Cnrg2OxDw9V+@(RQ9{-(mm!s*7zh&?(t#`mhBSsEhJ1!xAWN0O z0Z3*t2`O6`Sngz_a*PW{b)ZNQ zLo!1K(3CQU)X9mO(whY|1T^@a85|jWfY1p@J2QAsp3k8w=nQm14iG9ZBmr5;4B3-q z17&5EfP7mZRsyOl0YZ>W2GDt_KxdTzRp@Va3pl_y`B0#gT|9#u(0+dgU!Y=`CQqQU XWUzlg{zwOkC&R5l_37q+fjS}p{CYiQ delta 41 zcmV+^0M`HR&jG5;0kFgwlbS^ilin=~vu+w94wI@X60__m5Gb>RQRV@&%2Om1f~XNi diff --git a/Signal/translations/az_AZ.lproj/Localizable.strings b/Signal/translations/az_AZ.lproj/Localizable.strings index dec976c37b1afa367a2df799a529ffd09aefe2f5..65d51009d487741d43704532e5e067d6a7138b63 100644 GIT binary patch delta 242 zcmeA<$9Ul)=OzvkDoh&24VVld4%1{i1i45sLmI6Z> zLlHwhLoSe|%HRMbGa2%LWI9;1l%W7BZUvz?&z0EC$Lq)t#Nf=}!Qjad#^5^nyplRl zq=+GzAp@wnj3IUMK`q(MIqD`F{LT!H3_d{U1f-oAyeC^Ls!q;h;^0(ZNCMiQ%#b~q zKR|Z!tpK^n0zkYcKw$GR|9y;;?E=OjeW;o$RB>!I(SQP(oZ)fkBnQfkA;GlOYdC zrZW^Vd!4+c+$Fb3DjA9>Ze9f4Ys88Uzd zlua&-m)$I-E~mlo%;3o21B6aM+L^(7@_s4R$$C6o>`4rXK*iaU_5Ech=Qwdqt_cv? qY~cTfaq_hQDb9EXH=ybM489XL%1-79G1qM|H z2OycrkOw5w!J?%M1yFG-2tC=*MSQZK4%cP_Nh>~HM}{BOheq zhGd2epdn=pshbnkEj9R^85|jWfY1p@J2QAsp3kH@`JWUQdlEw;P-*t$iT<*a&pB~T ozTq#jd6NGd#>p0eQk?M&Za}mB8GI)P2C7c>Nfg*z7C1o^07KO?xc~qF delta 41 xcmX?gk+JO@;|2-I&8sAX_$G5{32lzhkkgo47AQ7ZDo9|nO5i@m%}&7`q5wVn4n_a~ diff --git a/Signal/translations/ca.lproj/Localizable.strings b/Signal/translations/ca.lproj/Localizable.strings index 33088f5f53ddd9a4ddbb160d4dc76884b10c5fca..ebb3c8df1dc7360617f3fd73f0c5bdf4ea866c37 100644 GIT binary patch delta 192 zcmX?fjci&>SyVe&=^VO|9WAdA6@ z0ZdQc?<_vKz@BIF2{Vz+za-Z1@j5aDF*q}LFnBVAF}O}<#CYf&=Ox`IjE1S!Z%1{i1i45sLmI6Z>LlHwhLoSe| z%HS}0ql7Ron8jcP70GoHpX_7DGugsaWb-eHd%WC^3_%Re3?2-g3}KVsGih@dF(fl& zFk~{6F{DlwRF~fTN^PDxzcYg)gAWio0cmFj@5ytSR0W-ZcIE(~0z(pzmCTSmx!zB9 z@-9a%VMm4%AOwkJ09}&GkjGH6x!#YLX|hXzlyW?S8_-67244mxpjKNTRs!0c2UHAl Vb|#ROKKZ<$I5W`so0|iAMFA(cI{yFw delta 45 zcmV+|0Mh@|&jFCk0kF&%laeeLlZZnWvy2(u4U>8+6tl=DoF|j`P$shyP~HKvP*Q{y D(3}%W diff --git a/Signal/translations/da.lproj/Localizable.strings b/Signal/translations/da.lproj/Localizable.strings index 47316d7996a4bc8b7da35ae796f0a74cd5108dda..d8ab90c4e6724f1e95574e58ecdd3fa8f0d6ab01 100644 GIT binary patch delta 287 zcmdmUg|XoVQ< zRA5K~vXU9HCo=}iPJZXYCG5yh0)!y346rNn7)pS0`kSSK-Z4(z6D&1ZNm4}96X?8T Xu!BJkO$Qp23^x$PE1UlZ+lm1IEv`J{ delta 41 zcmV+^0M`G2*a5uM0kF0ild47zlQ2RIlh^_lvv?YK4zoHbmMODXQxpQT%vCfNWjznU diff --git a/Signal/translations/de.lproj/Localizable.strings b/Signal/translations/de.lproj/Localizable.strings index 7fa276f5a9c4c6c1582c3964f164df9823d1e0d0..81aca746b5b1de6e807770392f4576ea3d994053 100644 GIT binary patch delta 334 zcmbRDm~q8(#tm=8MZ6hu7&0017}6P1fvh|R1qL;RO%nT1rgnRS8BZguOmYcgENB% zgC|26gX`o%HFa)Bh9ZV!h76#VvdJ6Oq&Lsg{=zYtB}8QM0aKyPdrS&ASW|#*$(w9w zYtCK9kPmhf(AdepZ6!C?*(ONwJ2N;k_yD03kalM9o~+2M${WP+2WV(E(CAWzw8?=H zvVuxLSJ(ov5>Qnh(7MFU7sEA~Ca;NncC)ErZF6>stgVc#gnD&%qM@d6Wd&7mmsw{C{l)L z^OfimBHXzQxeTccMGOiINs}FmB`2RKFyZxK$Ol>qwRW<2p`~*WP>n87RVrAtn4tu! pCk?0)q_=>fl%bd*1IWq)ij)8yoCd_n42fWNK2WrH^V-7Si~tTfJo*3t diff --git a/Signal/translations/el_GR.lproj/Localizable.strings b/Signal/translations/el_GR.lproj/Localizable.strings index e42b9e00d4f920e42b1c595d1f1915212f62a4a7..b79f67aa5c3b29cffd1ba831d46a7cdb9e72a732 100644 GIT binary patch delta 257 zcmbPmf$_>^#tkfzlNU*7B*rtiFt{>=FgP-JGWY;lE(}Tx3JkVDti<5QkjhXFWaR?s zVjxUpNC&bM7}6Mu81jLl3Jj_Y4nQ)KArDBVgGEaj3ZUXv5PI`(32A7&?+kQ@4-h&5X=euS$%4|Vlk0f6*pq;E zCo^PE{v9C8s5JRtfb8Ty0dkX91PW~46tItR@&y5w$$CLzobe29KzsZdd?#;|6P_Fv OB*c&A*v;udD@6eV;5q;R delta 49 zcmV-10M7r^(*cms0k8xallnytlin=~v#uHX4wI-W60-y;WGItpQWld8QxLNjQoaGR HG*qA!0bvsK diff --git a/Signal/translations/en.lproj/Localizable.strings b/Signal/translations/en.lproj/Localizable.strings index 7c96463c8f89f0dafcdf619c45a523a6c072253e..7ec61b587fbf9e8a0dd4f04944624a7398277a8b 100644 GIT binary patch delta 201 zcmex!ma*?5;|2+d$tGM9lPx5yfV9BmE+F4QLSr(Y9vfrGWI-8GWmN_T1_g#phCCpd z&QQdV&rr%x0Az#2tswN~nG)fAyp9Y(49*N544w>O46c(O@~U$?0+lB-WB@gnO%BwQ z-OQxkr@`;c;K<+ugib)(nZbK9qnYYtIUX+dB!)zw;_S)){beVg3Xq!=AUAnUfWYQ$ l{`(jw>jg@2#xuA9E%0aXow!kU@)ki6W}pK$X9rFc1pu+aF@695 delta 57 zcmeCX$oS_h;|2+d$zkGRlhq_#z;uO#)Z|+(e47O%9r!lSQeU7k*(y+M^1VQT%`XD> LF>YoH?hpk4V7wIv diff --git a/Signal/translations/es.lproj/Localizable.strings b/Signal/translations/es.lproj/Localizable.strings index 720e07cd07e840715ad5c734eff6668926c4180f..5e78e6ba2ed3d5eca3e4c2f0ed9962f60afaae51 100644 GIT binary patch delta 271 zcmaEGm+`{`#tkOoticTV40)61imPu<692(8`HQ5+!&cJGAJ;pGB^OqRE9h-nFA!#8HyN6847@gKxC~T^yWY*MgiGUhAM{7K*dT7)(l)g z(vcyE!I{AWXmA*V>tsfLbzVoH_GE?(hD?SshWyC~wWK%qY5mgTcLpl;0YWDr?abgk z`6Gv_tP9XypdyAGAejo(rT}E+FeEbM0&&XZ+EDq)@7yIeH-!FUoNN>>#Tn1w2DHte j!FRGCuk_@)46e;(;g3Xk^WlyO0y-g3L3ndhP8<^e%XvW_ delta 91 zcmV-h0Hpu$-~r&>0kAX|lN=2Slb#nOvtSqa0+Sj_4wKw43bXtg;182(QzDZFCK|Iy xEBY$4(pL5Xvlv<06c^zDZUAHeZvb-uWdI@oI{*p*A^=hVMUxR76SER-UIIYO9#{YX diff --git a/Signal/translations/et_EE.lproj/Localizable.strings b/Signal/translations/et_EE.lproj/Localizable.strings deleted file mode 100644 index de53517030c8b3fe749cd31bdf72ae06dd426299..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26252 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 diff --git a/Signal/translations/fil.lproj/Localizable.strings b/Signal/translations/fil.lproj/Localizable.strings index 803e85982d16dce065502a8c5717befc3db278c3..86098b6cfae00a5b9f7563577ba09b5207f2010f 100644 GIT binary patch delta 240 zcmZ2=p7Gr!#tnNUCPztVOqSDUV+@(x&nh~3pE!qXE<-9qF%Tv)qyt$B3~3BS4EYSX zK$a?l!{mh$!lGangB3)CL5abdfr~+Da-p5%WGxk*%?~6L_<0=}f*70`JQzF~!Wdj9 zGb*cdI|7YKX2@X3WGI`Qs3p5uNJB@1-KC2> diff --git a/Signal/translations/fr.lproj/Localizable.strings b/Signal/translations/fr.lproj/Localizable.strings index 3b4dcd8343c602b82e94b1053dcc386ed1e8de3f..ee2f64bf1a8111d27c6d32eb0676a3a97df6da09 100644 GIT binary patch delta 700 zcmZ8eOK1~O6uqw#^G`H|kbg5o)0#?x)Y6ua(!?|+Lu+eNNdx{Gr%^-m8JnaFt001I z#DZP~H;TG+p_R8)DA<*Pin!=PFbfyWrs~Fxh~7!r+h)p(c*WY z)9Ve%>a7$-kg2B#OVrV#B~fiBSI-&{LFV)DoBq7Xl7K8EAx$kgNZ|u#pD95w87`89 zWqc9$@$dat1QK0|q_p^Pup85U^B#pBQ^!ovE{HJ3{|wGDCSqpjy(>YmO6TSheJ?{8 zmg!ARYMvRMM00Q-&JS7f_=puZhCi?Zzc+G&u@-uw`*A*_!Fbf$A+mEN+G6%x2V4G+ zX(c8xk-v_8(_;Ft88@XK{G43v>J|CY_)o!7B*E&a+9b4%&zVbTLlJMMn@pAM!nHmP z_DfGxEZ>x_YgiahPW#z5Uzt9w-7XGTu{sn;1z48D6 delta 660 zcmah{O-xfk5T3PIXo&=yS12lUNh1|o9%*7DKbCl)i3L>B7*aGbHui}%?W65094f|y z;MIhDMm_3554wis^P@!1EV)G+1Z_)nQy+G*_YqM=cd@)ZWU5} zY%O~IOH^Umr2&aozEdjK;rAI?Dw0hLhuS19YNh*<2isE}%03-xNfszdd2(2ayy|?m z=`L9$8Elc3sK%#~YnRzB@C{pd9qz_jB!DmB&R~OvXxWW*IJW7=M-dFiR7mF9F%b`_ zPq7sb^UMsVy$Q=LGjv#_%7D7qKLDEvY1YfE>+EabZL$|zvxeG9P6%X2&S31~)^Pd= zm^`PKIlaca201=5&AEG`sjiMb5h9NlMg)Jx`uNgN@$sgJ9ff#6QTL*O{!~VlQop<> z|7Y&#b|IDM!P?|gU)=4sNrQNtm{xbv?>te--IY9|Ixor0Ecc=MnML-LSUc=7@pZHx zbD3=WLCklCH6i+X@FBAyByLR(VlH8*jj7odHh*6WhkpqZCK59sjl2@A!>Ly z|6V=2+3DxLzbQQOAy7J}X6$3)#0<}B;qRwFd2#%##S_$Q^heQuKzB{jJ&x0Rh3h+X hA3v+T*m=;VLX}k^EUaG%VzV0X?2?1^N(4Wu<~|f6uA~3} diff --git a/Signal/translations/he.lproj/Localizable.strings b/Signal/translations/he.lproj/Localizable.strings index 04806eb09694436d63d9ad844d8aed700a135496..495523e2e632018a7126ee387f729b7ca8579e28 100644 GIT binary patch delta 219 zcmdmTgz?95#tmD=OkOA|Yn#iE%1{i1i45sLmI6Z>LlHwhLoSe| z%HRMbGa2%LWI9;1l%W7BZUvzyZ?qGitf0ZQ`Ha{+9&Sg5AO>d!4+c+$u*s{LG=cmg zhGd2epb=%08KY%4*C_j_^E)#*GWYt4tvJo^|y7{ULineM-sAHLc@k52oRT@Wd>;_7|fry z{XY5j;bc~2b+?4Wp#apE$~<|l@3~a*KmUDi*co<*(_w#jG8_%hhm+yq@E^mOUh~@n zy~Agx!+~Di8y3UA>JQgk3?GIchs)u;UY`uFhd&P=_4-=Bz0&9ZGW=!v*3qyW&UNL9 z*4fon2l{zF+}HZ2`tgqa_1_OS!zZnFU9EO33X_I??R_B%e%8M4hqt0*cX%=Uq@UdX zOef%E&xhke#i3p;^%JK()VsXi8TOj5$C0QhZmOPQn_-(V6Jk|G3B+EzQThfD8ooZdQnpIA;;<;qZ znn!y7X?b_2=wwg#c8kP56ux{Acjs1yO7__=It|^2`oUhF6>WR2&kt9h-xGgrIe+oZ zci-%N^P6w(zUsbC!D)77Mc8PreJ1&%CvPP~v<4l)9v8aeqqOB^dFSpsAL)#z+HqO! zc_ePJ)7S8+f0`4mdb^XrnKRLc46ylg=@<5H+wXg_kTzEGQ9Fj6_H_M$r0MgY7QI7f zy%(RLgCXTpapjdX=<^rt!4KhQ?n_&slPmA*_3rS!Xg=1fM|y=W;dOJR^Fq^WQHQVl zsDEp@+Djnqn-%q+=iXOa>+<($<_L1R1UKag+r>pP?m%|(VogNJTgC||+ z&!wb*Zwl*;_wXqA-nZKEL;2=wU4>_}AIjB!6xW~}E%`@%x?5KLSTwVy<3{_0c4FCB zE|KG0oLTB$TO68?6y{>neeLzLe$f73-EzI9WN}|sOT@1-!Q`QQ>=0HD?o#MH6e?Nb}G*IJ_;L-eqrPa|hBeQ;_G682q^CEHXcn zWY%%KT@#;txbl>_>S>AGNP7Eqp>D5ui#bjl6zjCTz1dPyE#_fm?2O1&>jQ|1lRVP? zKUCUrC~o6zUdS5Y`y1&B7z`axz4@(PrzMXiO&npjGw~ihJX`IY+^XZ%Lb4{t*hZ!i z;gj?euQs+aY{}U4mCh14to8_Fx;XEy&U>ss=qLE$O#gxz?3?Ys>zGTF!ZNS)$F_;S zfE+$Muh&c83ahi6--ne6$evafwlV!rUv>$G*c7w=3pHr6r^>-{#Zeyk{l z&#{lbugD1UdMG`ry=vImp*VzJTj&}~8jOqVf`U!^5#d37#0TO9k=FQe*+gX`!%acj z->sF#Qgo85;DNA-%oy&8D&shCGIn5m6;X8?iqR;14wBvz-5}UM=y$wfV1O~QBVwk0 z^?e=JKGk|$OZ+UgUV;^hvS}aVQESv)&j;SQDLf4u zy%3k7Ba!mlIk(?`d{WT3v&a9-oz}^5{+z*OaL9e>zz@=gr;^M=;WeLcd~j`no964XXDhzm3D?71j}Fz?}uOO9FBI>7|7A>WnNS?)RC9>TZD<9vk(2O ze`~x5#Yh25&d7_cwkQ!4_E0}qcrQ!d7oER|Hnh8+U(WB;B9Qc{`#L$jKUoq)&CgD(8`ix26a5)Gz~ zVa@LG4~)P{Q#=zHsr9+GqN&{4ecFl%F@{KkMJ12zAwZ+>;+^<#_Z{l9=MJ@I+-7Yw zvPB3`iFT2hNA<#4Et0cMI6t}zLPRspCC`sq3$3$9nQ9-}lA3Ov0PpgiE$>j8@$U^E zGYYz*btFkRZ-r-jl{_qMqLM4BWa*%j#5`P4uSaxejqyq+MX%AP&1*Qq7%8;$fWe~j z8hP!qP=^=XW^H4q?U#rxOSlQ~j>a~8Z!#qWFV z|5-K;4h@ZcqPk4#^b=W1e6pjpkw}{f<#&&?+9&Bp`+4Raas4CFc`EzF&(_$lJ>T4F z3;7qS!1%KlEB|C~iC5ty__^Bi$G)xi&HQiE3DPr8IZ;>9!Qb#_PpA(xTF1KnX`*8E zRvLyqUVY&;Rn?;v+N73>C*_@fOtLM#(YdLO2bIU7foNtdPv60oL(FS=ksN3v0vv7Y z|5qj6kaODe{HQ#by7>!nJgV{bQPgul7I<4^0wx4A8E;r()Poj9mXRy+O@Fq&UvOOf zAQdU&6MJ=M=14y{8<7kfT-OsII&gyNX?6>JM0+x`X+I$C*I9Jr&)eAFuDD}_?s`T@ zj+O9pz7IE}fJL13f&dG)FpjWa+2UR?s2UDylK-c(N-V(zBuN3>qf)AaAX+ zmN|dX+M(+}wiFNol^`%JR(-Lu{|_t5cun988?8E{gfmFT`OCF*1pWWEXbOFm>;v5B72RkouV-1) zQ-ET<-gSknYAO3P5lyZ2WaDW&wYM{M5!u%3PrLGzGwx_13nTA3-zDcEs)oecI9&4* z^xn#R%7xa4M18f!(%Zz7thI)X5;3B0;)p@zF*(YPX+Pu>cKU zx6d|cVT@sFskA(z8+<6+L|SwG4A%z0GCxO!di82E_v!noI38cc|mQRco^#xyvCzT`qI6d{moR11R z&_XKJpUQYV3M0^K6J19bfzSkdSZd|t@Uqk;qkAsDy4Y>*$^-g~- z3tsS$DNV99v_nR=lSc&QjUdxs0Hl_snvFcrd-LpgMVT+BWnfck`*z)6J*ph zKbMH`TDC~^`OhMQ1APZwp%!G%;+&P!r8Vq{h6AD7e_q33ck}Tgt_wtOt*%KfMU!LD zLg#5~vrvM5%<}>aMtAB&dR12lsHpN#*IwP|6^{Z#yb$-pL5YDf}wFlzZ z^HTAdQWn!A^DA)Dq~%l=1_q7Xcxs>Hx;IfG5Eh`UP=kCN7iJIwGJ^%*F)mqx;=55`H6e0j_pIO7WI{dsF;h- z+t6Ik2{|IQJ4XJwEheC!N*xwmW$uDk_;swu5%{^hDs@fkIN#eB7wMJF)yQgYBKfRv z)8+CzRF^*L6Q-JofsvInSreEdusBvjl?FeJO}VALLZ7V1q!YJK;^J#IcU^ zG5jL4Xmz#rYffIH_dG4$BxsMi65XWFE2^1Vi`<9`{xlwQ??1j0$X_trybGt-Th;`^k(1*<` zt@W7N%9-e%>-$9ocTe=8J6Ws6+OS4za_D75evlheA<^OW6y(FUFxSPAQ@{C>Zyop1Z8w#{Y zbRTDPF=KQalp1l3NZ<(Q%5B|Ytf}#Y*iu@6{`OA>3U+PZ-?JT$v-ftT)@S!)V9POl zK|QUI{YT^nO3OI~(~%uX_}cE@N^I)knBKc)FQ!J#b;A={bvEMO1Kmlk^ogP_-c|_B zZ#YU_8D5h!*vrrZh{_&#BeNRk55@;%=fq;;k@UM^ajo2^wL~UH=*7cV%Q`q5-p$gr zjr1ozex>Wd-bO^GD=-h$I#uRBt7G~it2)L=`vutqLS^lG5^$Q47&m#M$rvr@N(;+A zPRpaz-r#GmuS1;y&p^~Bd^X}6=Y*07{-r=elf&aq?S!#SSxcMIIO`HX>InWLb7 zMt%jJyOs_I6`&_i_MP0;j9J0X1h$i$L@B*Hm;$2ScE&!dBlhyY!N5b!+ zv)mWN$>2_nyWvY)ZLd2KzV9liP8ze{fX~I(1{DjPh&zqa!%TPR=Zd-dBdth$#g}t; zC9krwyzP2M`c&6)Wwep|q^yOYS1N3Eyc%<(PiwACUda6qQxs#1bC;+^AT7ULC!m(H zTQp;e;_gYe;X>Tw8M-~?#8PXZfB4GiN_aX9ubF&kYbZ-;5xNAn0XYQ*weMTE8(oiF zzaMw*x_Ya7t^xIT=xg9S-ECc#54vt%blS=md~*bcatx^tT|rE{_5`}-F3Adu4l5tcjQ69Y>Gw$AJukySabPgMpXHFkN@cIgiwLA`Ou}bYlM6z}{F9RgheR`&)d+x9=Q; zGgLWZO>7T3qQaL~VgYbAP{iC7Q0|H#UdPd-=MA1}XZ!)vT~zgJ@6yuHUvX|e_hv;W zScFWA^{0L~>TYz4&`IY3u8wdeRT9n`*c(3KX~7REy)n0v&Zv{~&r| z-@3Dh4c9Av?b)fk)H#uBknOZXR*SabL-^3>Bj;U8?j769*V+{R8D4`^@DMT65%;yi zbv~;nN9S@xyqoJ`kCjsxXXkz=S_Q0}_b<>xYI8yBOV2Z*2h8NwwPI{*+!5yvr@G5O z%{ic>p4#)C{ce9q9^Azpk;dtC2wjiIQ;~0pUYC_tiCyi}GNG-I-_b_Livi(Plqe4Knt&T`JgT<-XtCmq*Sx?D?UqCx! zqUt-XOa}sujw$Fo!G%r|i2Q|YpGXwd3dhr+-}ePM*M3oX8!#4k2!o91Rkhhf#2Qf6 zWzltXE4(y1GuBvJ<^$m}vI}bPdCy;3P7lfVxl})21YgOVjlBq(5_RXg&bFSqupWFz zJYVALD6HikT5&r{;S#-0G9YSO?jV!lQNQSSWRE224~pAF51vS{)GODSGQU{AZg3){ z@=UAID~p)yI5xf;jYwASOokIXNA(%4ycAu*4?a&DgFAc!n;@F{dPM{y({;JQv(9`AyeuO$eF4o zK8gG3)0-M6@*Q-5i85-(d@oT;eb(rixEiJ^Fj-${&h+ zE=4K76GQP2ygDjUucJzRhOz8==SV93EQ+|J5vkc8rdm|jYS!;JKGoRI;e9xZahz-I z(d%d5dHn$6$Nd30k6c&B(vR&+%40uP_onOGdF`>X56v`7*30Xhp$*Li zbe_ynPkp(*OrPkrcwWboysK)C>SywkXQDS(t@~+pZ+iXeo9X_&cEV~~eh2M;lC5Kz zj(dUk`t-vOV}ZCIGGhcCi=c&P2hlrr9GSb~yvX8x+5PR8YkT?4v;ymu**$*Dy`AE{ zu#~K~gg%iCGVMs5&xwbixxcTweRTY+|FK*C>wS-OdU_E=lySXhvGRyK>B^ZpIKy!! z>%>%;(&P528P}l`B?f)#xG+9HJ|UkoL`M|Lv*Jn|bXPR#g707j-x*51oEio*H>nAD z72>R8D4o}+bp@|I{mFAULPMsjJSmZgXH-Po7_R~i&Iay9qxi;hYW^_|6TNAm-DdZu=%m0{V@-AbL?#JyLAZ&?GdPPfwDj+U_$ ztyjz%{2=Pw!yRjUWcz4L``jgWV%={IKN~#FJMgxn?7Y~cyKt`dkagO+$Nkf3-FCmA zbu#d_3*3wKr;VSpMB~0SA|amKXWEW(st)!1eOgh`*5tFe+Iw!oBhT+a^{t*y#QVE4=iX>ci{-AnItk~Di5gy$ zNp0RMD>Q9=ajpUs&lkJxnOrqRO6@-5vrg*~^x~qTRaY}NpDnuu?kGQ$FU23!nfp_5 z$-M%m7_d6~oCkV8CVgV3Tra#z+*jDI&eUsfUc)GwxDK!Ul-SMO$vvp|*V*-02j;2o z?c7d&qk+(p8n=|bS#M(x7)YQrrN51o_e>+rTUiW>XLV6G8?}|C6-zu=ZU9NF)xJ1)ob_b zHCa(?Q3yB?bjn>mAj9>m2Wp33Stk$cAY&R&YlpY1^G|$dP6du9y7Mg5B#79qxY)8Y z&x$yevlG4j$9vKBq_WMOejtpRcRTXBAYb}9%ubL;#@Xg3B|rz<*F$#&KjIo*o}rDL z(SrmHJL=OFAl}5Yu#6A-y~*uqajr}?agGu{b(b^p{NHhft=AU~Y(7W%_SE(6XT$R8 z3s7x9;#66{kgoVm>2YV4yyBO_!9XKftGUn$#2#0H%-8AU8>d0$?8Uz1PQ)wpEO3$g zF7b^y3^}JEJy|5qcvNI(5jktSDEfYJ$=&iYGv;3qIR|oT|9Y|{GhHE&*?io4_g#ZX4-Cbdx^lh z@ig~{$L+rNi?@7NykG1CLfK?}n`Dch3JUNsJmsr?;uaOKZ}qPK=ZDSvd0vhw3unK0 zmE0pGd?3o->cx?XoD(y0z!#O*6M6GmhNOv+r<$iJkc0PTuHua6Pz&lTT%5-rPohjtl<_Hp8&% diff --git a/Signal/translations/hr.lproj/Localizable.strings b/Signal/translations/hr.lproj/Localizable.strings index 9dcc75a12c5dad8dd52f16be8cd0d64e6b8b09b5..1d63f4fd582cca0c4d981ecd88cdd247bd6c4fc4 100644 GIT binary patch delta 195 zcmZoW&v@z*{oxD|w+ywOE`^EyczK3+$LAO>d!4+c+$Fb3Dj8`af;B1H_z3>iQJ z${12NKUBBW;CE(lWbgq(Cm`+2;5|8!NmbC9A(0^m2o)HTfUIPO?8$-wvXlLsxh6*h gh-?-Lc*8h(N1)VXCP|UWcYySnM1jrU0w;(903L2I8vpa I9TqMQ0JV)ceE8Yv)~$f50lJ660^1{XezU&Rq_F|_*YIBHM9^! diff --git a/Signal/translations/ja_JP.lproj/Localizable.strings b/Signal/translations/ja_JP.lproj/Localizable.strings index dcce98c6272b20b142ff11dc7ca09e94b38c5184..72bd0ee05cd1c484e4f4d8f4dbff979b8b00a8c7 100644 GIT binary patch delta 260 zcmdn9ld)khPS)mC=W}EzVn}AlV8~=B zV@PF~T%aJe`Gg9OGQTr}BZChRIss{C2Jgv=OxEWRoh&25VVld4%1{i1i45sLmI6Z>LlHwh zLoSe|%HRMbGa2%LWI9;1l%W7BZUvz?3yOZ{;&x;RVsK{gVDMxJn;gib$?FJIoXn5` z)LO=nI$6;`db5;*lmfpqgCm0v5IO;AX9n-djXJ7A&Om!}fKY)U3CK!j$Yz+V;~+D+ z!Hi49k)Z?#L4p}T=cEFiQNplU$DxjKa*3mqT|9#u&{ls2Uj`+hW?LXu0@|MkR1I=G U$kFLQv1GXMsNUMV$k9Ov0LEoF2LJ#7 delta 37 vcmV+=0NVeis{!Jt0k9esljb)Lv$_@F3X`}T60`Oo8X&WnL3RPNZbLW{Go=p` diff --git a/Signal/translations/lv.lproj/Localizable.strings b/Signal/translations/lv.lproj/Localizable.strings index 2106d278ed44fdff5e29eec3cc845aa05a80e9aa..6da4ba2c2bcbba72e6ddfeffd052a04aa3954b31 100644 GIT binary patch delta 226 zcmbPomhr{~#tq9PCR>SfP4<(JV~=NWVQ^&#nY@uxbh3;DhixuHDnl_4CNiW0Sqcnk z3`Gq247os-DuV-%%w)&|lIdX4QicMkxD|w+Ea)sg`HnW%=6w=Ye7uefK@83e9t@rg zVGOR5_p7OMI|8*OGh_e_DVv-aFT0sbT~34FnZc342MC>jv@?VEWM2-|$?p`o*pq;6 zNM^{MEblKnImU@=a!!EAW(EH@jFXQANO8t9xB*S~XYif4QFij50FKGG5(GB01WphI E086Mhpa1{> delta 41 zcmV+^0M`H5&;gXq0kEbRvp5-24wL#T6tn0j94M0nQ5KV^Q4q7TP`&}P&{BvMa(odm diff --git a/Signal/translations/nb_NO.lproj/Localizable.strings b/Signal/translations/nb_NO.lproj/Localizable.strings index 4a00c6db41670f2f0f74fa7b9f34cd5060e55895..fb2c4256de655cf167590dc1d82ef856d00b8908 100644 GIT binary patch delta 358 zcmX|7%Ps=}6g@Lt5TQtuc8bPiqJ}i-2arjPX+`5zjab+elj(!1W>i-emKHXXyX6~* z+4uuH7Gmcke1bF8$jQyU_uTh=|4{BemFN3p%!3~W$uCu2G)=Vh)JP3QlyD$rZCQS_ zQBy}2YtYf6G~nYJUBW|$eiT{x)ACeI$wOg0yiG60Cu~&VU=w8=q9j4eB;&(HlWqF& zBrs;fSMz3R(t(X_Vx8K-mK4T$c~I;yQiy^=Y-4>LbtDtM~=~x=!Z+ delta 154 zcmeCU%y{lR4Z?ct^(B=smH5!wn0!22j z2z3iJ4iG9ZBmr5;4B3-khRDh) z0r|E-tOQh90)!x$46r-%7)pRDOR}ixXRt5sI HY*?HY<@FKW diff --git a/Signal/translations/pl.lproj/Localizable.strings b/Signal/translations/pl.lproj/Localizable.strings index 229d8075ac4df51be89253a796668effd80c4818..9074497fbf8f057b900d54f4d3dfef828feb20ba 100644 GIT binary patch delta 255 zcmdmUjj`bt--&dUWmHXW!j8E$ME*x|WA NF`%^Mm@|IAk$r~g^G(CaB$v{Wvg1wLqG$t8tU>evvxe!lm{vNtf3;>6AM5h1% delta 41 zcmV+^0M`HP+ySWB0kBRQld4D#v+f#r50g4B6tl!CEGm=QRTi_3Rn`Hs#8;>mgisO? diff --git a/Signal/translations/pt_PT.lproj/Localizable.strings b/Signal/translations/pt_PT.lproj/Localizable.strings index 79bcab7813863b33a8be41da857c8f806f170308..149156a97afce8983768e25061eda0603fc4657b 100644 GIT binary patch delta 725 zcmX|9J#Q015S=q1LK1&~i}*;6EFxB7fssOqK;d#R<|7vJM^G9_F82A(!7=78M}Urw zHX3TAv_JuzpyD4;kp_u05tSPd66xXX9-!0i?9J@FH}hs+e9@loX>WFQUe{-iuFwLN zsKIY@W0pf(Bxr*i3h>$F;v}d|KHY~`P@b+}?@$lBtGprg|N1Y+md)~5w6Ay5BPP|z zqHA=WZu9R%0slTdpb+T~dG@Rk-7TaJ@y{DW;{h_8VCc~%IGbwssVM86Yi&X@sfOTPgvibPD@vb<~dBU8UZK)m|T35(6 z5am4^_hg0uN~rArx}v%A&Tx7GX&rimkRs-t>NNMODZWs9nYPHJMSSzH7Tx5%@jQ!} z!^tj+5wwP!Cf(z?y21OU;jD==<90nIIGRUnk_Yunl&J4&{H$^E*a}^Rh_|S+{k}LN zWsu{*5TZ|wUunGr;0}^y*Ky@mtRkBQgAZE1v51)LDppCTE}=vW!cU#cd}(>~%)e*| zEE#J;Wm}zN-9gLW9g|--GF)5A9Z`iumG-2@KPHBfJ&?*LBVa?WE@!p#{JA~NAKXl` z0-uDJq`vYVxF?czRi+%fgx>bD{NzrGzqSPr@}s=!o#LF6J1u}IA6)?JVjMl(mILjp Q;er)-1(^|j^FAj205V0f0{{R3 delta 585 zcmYjOJxjw-6unVUD20~R4%(qn6tUQdlY@e-ICRm$ip8-eHXo)RB&nq?{)p=+Lcz&N z$)prq+yw^}T%6sUbo9Je+B)RjlXuQN_v2lBC|7UF?aOp%%$&veMw<#ZveEJLLuycq zRMM$JbwrPjfpoHfYrra4pKNd@a0$o+u8@nrBkJJHQyFR-swVUvG#%goxQ4h4g$W!W z+VZTUVw*IYqjie#{bq`LS|Xg#UZ=|iSzd)fzbPNZMMI;Twro?F1<hSfP4<(JV~=NWVQ^&#nY@rgbh3;DhixuHDnl_4CNiW0Sqcnk z3`Gq247os-DuV-%%w)&|lIdX4QicMkxD|xnJXc~lAGaez5Q8&=2ZJX=*yPttn!Juc z#mNjAK&@pAsgo16Wj9Bt%V_XBGdME%0HG6*c4qLNENG@Wd0iA2dlJy@WQOd?g#ogY r*9FK;E(*}wJj;I{<7A;gDb9EXH=ybM489XL%1)L`l-L{)I6)Ku+oUtG delta 37 vcmV+=0NVeg(E;Gi0kEbRvp5-^4wH;360IOP(}5b3;l`$c{gDe41NmZeQdou<0LZ^Tf&c&j delta 33 pcmeCX%XsQ0;|4#e%@3sF_$SZN6WKgRYl7D1Eum6OoAn|R!~ptC4Q>Dc diff --git a/Signal/translations/sl.lproj/Localizable.strings b/Signal/translations/sl.lproj/Localizable.strings index 07392154f0d8504c4f161ad83bd0b4bf1dfe0942..4f905ff3e251bd5f2a8151f738b9e204b707b940 100644 GIT binary patch delta 269 zcmZ2?mGRFF#tnxgCr3zXu*WmFFt{>=Ouo+{I=M?yPFt11fkA;GpCJWEmH}}wLpDPx zLjgl3Lmm(-Fo5K(AoOHeH}TCEBp>ndIx++?I5T)Kcrt`BxK3tNQRj4IC}PL}YABn0 z(N=o%5sfLD{LT!H3_d{U1f-oAyeB6zsZPEi#4_10g^iz=5oC5ALn1>J5NA#H50aHt z0*crIu@X>y2@obSBm<4iWk?08E7|NH^qz6@uV5+8cm_A1?fwkD6Zb1~!(0w@t_K&p!MB delta 64 zcmV-G0KfnI*a5E90kFauvsfDN4wI@Q60@Kwlqr)eR2GxYR1mZ3Q@{bU1Xhd?lPqQ) Wld@(y1tkDL04|e(XEU=XXH*4@0vQAV diff --git a/Signal/translations/sv_SE.lproj/Localizable.strings b/Signal/translations/sv_SE.lproj/Localizable.strings index 7b1ef1997403c1818dd7f5ae9f74f8896ab2b2b5..56f41e9ac448f752dc63a080f76c43082e609e26 100644 GIT binary patch delta 261 zcmZ2+iSgf6#tp~B7*i)JiYsn@C3c5ta)hJ?dpv^+gDXSGXv%IR-b3cSTQSwV-()Wpq0KKeerZg$2ojmx5G=HL zM$j$B&9_3n2~WP1VdosgkjkLTPy{5?88R7)8A^bxA_fJ9G=_XIUBFNZ6wLsN=OzvkD<@94nWhiG*V91^9FCnh0z@WfiI=Np; zo!b$pHJKp;Xi(YYdQI8Q2I_Je{LT!H3_d{U1f-oAyeHc;sR}wXBr@axp#nn^kd@4k zJ$bLc?BtFBxyk$d=OlIU1W%Qf;KV5WkjU<<@0)r}p1A_uXCPN;O zOlK%!$Y&^JC;+lS;#N>viNTtIi$Q6!p@ZaR4yiqSyp9Y(49*N544w>O46c*!N^5f_ zGh_e_DPu^T?5Hfg`I<(R2EQ|dBZChRIss{C2Jgv+Osay;42cXmK&Zfw1Y{*MWKZ@E zlAZj^g-h6xp#%s)Vi^p%45>i(lmO-QH5~hS Lr8j#7zY_%jX9qY< delta 37 vcmV+=0NVfh)d9BB0kH5Hvw|Ab4wG6X60@=?dMJ~)Qzo<8QrZEt6jkOGSgjE) diff --git a/Signal/translations/uk.lproj/Localizable.strings b/Signal/translations/uk.lproj/Localizable.strings deleted file mode 100644 index de53517030c8b3fe749cd31bdf72ae06dd426299..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26252 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 M`5(D>lo}e~FQA<(aR2}S delta 1591 zcmb7E&rcIU6n-^EkeH@cFhJ0Zq!OZq)EWr}L?I;5MX;e7qqkBht(MYs3#1pg8V`gx z7ZU#g_0(h&j>JF10|yTtJs3|O{l1wl3z3qT&F;LNc|X4Qz4zvDKlJBgsIeCbFG^9$ zvfBLW?~$9{L8K6xT96gl5+(CkT|8OntjI0wJd+BfGNde|3f7ve<6FgUR+b?Zu`?|C zFsk%!Tf2TU-l5KRrz8)vby=fwBH0hyM|k_Cl{&F1AfeF)V(abXb^Rgc8iFzMy zJGDk{s07GR9D<=iWYk;U==r+?;l7X}ey{wdQvLtnUpU6vS7oo*OtI(-Ku0dYI z8ixj{s9|NI3fAkOY8bG`q(eXG>Cz1q^|sZ*)no>WIRqpK1!K!)5e9^|g|IGGp7PAF zc64vTS;S8cZ&5b!C8ZlMa81e;7*`D%?q?y@@MV6?u8cnxq;9aI2qxNIgVaki&|8yzg(_ermf>*{q z--J~#J3;*b@W;b1Ui;WY$lD$N*3mZ&g&^Q0f&^i7q_U|2DU(rG zbYo_u&xgRHlJQ2SZlkUU*O=+n;n~=zuf+UMQ=NsfZyGe{DF;ilYH%JwIT*G+=NRmz z2K3k2_#O5_*)U25*>biW2k=KJm@;imuIS-ZRJAf=!X=ah$}wF@MPp>;q+hnl8J|bn4W}mHIf=gy@YaU#CK?7NPUYw^(>iYKsZi%$Kkc|F3cQ=+k273+> tM|0yl&jFCx+KJqR%#gti!b#?+u#57L+4j83*xmoKW#Rt^V{J|Je*r38OV$7Y