diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
index ab384e3392..c068b95892 100644
--- a/.github/workflows/deploy.yml
+++ b/.github/workflows/deploy.yml
@@ -4,13 +4,13 @@ on:
push:
branches:
- gps-release
- paths-ignore:
- - 'package.json'
- - 'CHANGELOG.md'
+ paths-ignore:
+ - "package.json"
+ - "CHANGELOG.md"
jobs:
version_bump:
- name: 'Bump version'
+ name: "Bump version"
runs-on: ubuntu-latest
steps:
@@ -22,10 +22,10 @@ jobs:
uses: TriPSs/conventional-changelog-action@v2
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
- git-message: 'chore(release): {version}'
- preset: 'angular'
- tag-prefix: ''
- output-file: 'CHANGELOG.md'
+ git-message: "chore(release): {version}"
+ preset: "angular"
+ tag-prefix: ""
+ output-file: "CHANGELOG.md"
deploy_android_gps:
# gps-release branch only
@@ -118,21 +118,21 @@ jobs:
KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
GITHUB_RUN_NUMBER: ${{ github.run_number }}
with:
- lane: 'release_gps'
- subdirectory: 'android'
- bundle-install-path: 'vendor/bundle'
+ lane: "release_gps"
+ subdirectory: "android"
+ bundle-install-path: "vendor/bundle"
- name: Upload to Google Play beta track
uses: maierj/fastlane-action@v1.4.0
with:
- lane: 'play_store_gps'
- subdirectory: 'android'
- bundle-install-path: 'vendor/bundle'
+ lane: "play_store_gps"
+ subdirectory: "android"
+ bundle-install-path: "vendor/bundle"
deploy_ios_gps:
# gps-release branch only
if: github.event_name == 'push' && github.ref == 'refs/heads/gps-release'
- runs-on: macOS-latest
+ runs-on: macos-latest
needs: version_bump
steps:
- uses: actions/checkout@master
@@ -197,9 +197,9 @@ jobs:
MATCH_GIT_BASIC_AUTH: ${{ secrets.MATCH_GIT_BASIC_AUTH }}
SSH_AUTH_SOCK: /tmp/ssh_agent.sock
with:
- lane: 'release'
- subdirectory: 'ios'
- bundle-install-path: 'vendor/bundle'
+ lane: "release"
+ subdirectory: "ios"
+ bundle-install-path: "vendor/bundle"
- name: Deploy to testflight
uses: maierj/fastlane-action@v1.4.0
@@ -212,6 +212,6 @@ jobs:
MATCH_GIT_BASIC_AUTH: ${{ secrets.MATCH_GIT_BASIC_AUTH }}
SSH_AUTH_SOCK: /tmp/ssh_agent.sock
with:
- lane: 'deploy'
- subdirectory: 'ios'
- bundle-install-path: 'vendor/bundle'
\ No newline at end of file
+ lane: "deploy"
+ subdirectory: "ios"
+ bundle-install-path: "vendor/bundle"
diff --git a/.github/workflows/dev_setup.yml b/.github/workflows/dev_setup.yml
index a6dc2df2ae..d32c10ec68 100644
--- a/.github/workflows/dev_setup.yml
+++ b/.github/workflows/dev_setup.yml
@@ -4,11 +4,11 @@ on:
push:
branches: [develop]
paths:
- - 'dev_setup.sh'
+ - "dev_setup.sh"
pull_request:
branches: [develop]
paths:
- - 'dev_setup.sh'
+ - "dev_setup.sh"
jobs:
test-ubuntu:
@@ -32,7 +32,7 @@ jobs:
run: npx react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res/ --verbose
test-mac:
- runs-on: macOS-latest
+ runs-on: macos-latest
steps:
- uses: actions/checkout@v2
diff --git a/.github/workflows/test-e2e.yml b/.github/workflows/test-e2e.yml
index ea91c4c955..6c65e1b847 100644
--- a/.github/workflows/test-e2e.yml
+++ b/.github/workflows/test-e2e.yml
@@ -7,7 +7,7 @@ on:
jobs:
e2e-ios-build:
- runs-on: macOS-latest
+ runs-on: macos-latest
# while this job doesn't depend on the previous job explicitly
# this will force them not to run in parallel. If they're run in parallel,
# the node_modules caches will conflict
@@ -66,10 +66,10 @@ jobs:
- uses: actions/upload-artifact@v1
with:
name: e2e-ios-bin
- path: ios/build/Build/Products/Release-GPS-iphonesimulator/GPS.app
+ path: ios/build/Build/Products/Release-iphonesimulator/GPS.app
e2e-iphone-se:
- runs-on: macOS-latest
+ runs-on: macos-latest
needs: e2e-ios-build
timeout-minutes: 15
env:
@@ -104,7 +104,7 @@ jobs:
- uses: actions/download-artifact@master
with:
name: e2e-ios-bin
- path: ios/build/Build/Products/Release-GPS-iphonesimulator/GPS.app
+ path: ios/build/Build/Products/Release-iphonesimulator/GPS.app
- run: yarn test:e2e:iphone-se
diff --git a/.github/workflows/test-ios.yml b/.github/workflows/test-ios.yml
index 8fa05df1ac..764c80fd83 100644
--- a/.github/workflows/test-ios.yml
+++ b/.github/workflows/test-ios.yml
@@ -4,18 +4,15 @@ on:
push:
branches:
- develop
- paths:
- - ios/**
pull_request:
branches:
- develop
paths:
- - ios/**
+ - "ios/**"
jobs:
- unit-test-ios-gps:
- runs-on: macOS-latest
- needs: unit-test
+ unit-test-ios:
+ runs-on: macos-latest
timeout-minutes: 25
steps:
- uses: actions/checkout@master
@@ -53,8 +50,8 @@ jobs:
- run: pod install --repo-update
working-directory: ./ios
- - run: |
+ - run: |
xcodebuild test -workspace COVIDSafePaths.xcworkspace \
-scheme GPS_Development \
-destination 'platform=iOS Simulator,name=iPhone 8' \
- working-directory: ./ios
\ No newline at end of file
+ working-directory: ./ios
diff --git a/.github/workflows/test-js.yml b/.github/workflows/test-js.yml
index 2ace0dc823..98c2c928b8 100644
--- a/.github/workflows/test-js.yml
+++ b/.github/workflows/test-js.yml
@@ -4,16 +4,14 @@ on:
push:
branches:
- develop
- paths:
- - app/**
pull_request:
branches:
- develop
paths:
- - app/**
+ - 'app/**'
jobs:
- unit-test:
+ unit-test-js:
runs-on: ubuntu-latest
steps:
diff --git a/README.md b/README.md
index ae9f807de2..81e60651bb 100644
--- a/README.md
+++ b/README.md
@@ -9,7 +9,7 @@
src="./assets/Safe_Paths_Logo.png"
/>
-
+
**https://pathcheck.org/**
@@ -19,9 +19,9 @@
Help us stop COVID-19.
-COVID Safe Paths is a mobile app for digital contract tracing (DCT) sponsored by Path Check a nonprofit and developed by a growing global community of engineers, designers, and contributors. Safe Paths is based on research originally conducted at the MIT Media Lab.
+COVID Safe Paths is a mobile app for digital contract tracing (DCT) sponsored by Path Check a nonprofit and developed by a growing global community of engineers, designers, and contributors. Safe Paths is based on research originally conducted at the MIT Media Lab.
-## Privacy Preserving
+## Privacy Preserving
What’s truly special about Safe Paths is our strong commitment to preserving the privacy of individual users. We're building an application that can help contain outbreaks of COVID-19 without forcing users to sacrifice their personal privacy. For example, if a user chooses to use Safe Paths to maintain a record of their locations use a time stamped GPS log, which stores 14 days of data in 5 minute increments. The location log is stored on the user's phone. The logged data only leaves the device if the user chooses to send the information to an authorized public health authority (PHA) as part of the contact tracing process.
@@ -29,14 +29,14 @@ What’s truly special about Safe Paths is our strong commitment to preserving t
Safe Paths is designed to support a range of DCT and public health use cases. Currently the main build uses GPS for location tracking. Our roadmap includes adding support for other location and proximity technologies, symptom tracking, and communication with PHAs.
-## Multiple Implementation Strategies
+## Multiple Implementation Strategies
The Safe Paths app is being developed to support a variety of build 'flavors' of the application around core health and tracing functionality. Reach out to our team to discuss creating a flavor for your use-case.
### Path Check Release of COVID Safe Paths
-Safe Paths is available as an app published by Path Check in the [Apple App Store](https://apps.apple.com/us/app/covid-safe-paths/id1508266966) and the [Google Play App Store](https://play.google.com/store/apps/details?id=org.pathcheck.covidsafepaths). Any authorized pubic health authority can use Safe Paths.
+Safe Paths is available as an app published by Path Check in the [Apple App Store](https://apps.apple.com/us/app/covid-safe-paths/id1508266966) and the [Google Play App Store](https://play.google.com/store/apps/details?id=org.pathcheck.covidsafepaths). Any authorized pubic health authority can use Safe Paths.
-### Custom Builds
+### Custom Builds
We welcome public health authorities and other organizations implementing digital contact tracing strategies to create custom builds for their specific needs, incorporate Safe Paths features into their applications, or create downstream projects that stay linked to the Safe Paths project. If intending to fork the repository and develop off of it, be aware that this comes "at your own risk" for continued maintenance.
@@ -44,7 +44,7 @@ We welcome public health authorities and other organizations implementing digita
Safe Paths is designed to work with Safe Places, a tool for contact tracing teams to work with location data in the course of contact tracing interviews and to publish points of concern. Without having to sharing their own location history, a Safe Paths user can download the points of concern from their PHA to identify if they have had risk of an exposure.
-## Broad Non-Developer Community
+## Broad Non-Developer Community
One of the important aspects of the Safe Paths open source project is that it's supported by a large community of volunteers in addition to the open source developer community. Spanning as diverse domains as product management, user research, cryptography, security, compliance, design, and videography more than 1,400 Path Check volunteers are working together to support Safe Paths and help drive adoption around the world.
@@ -54,7 +54,7 @@ One of the important aspects of the Safe Paths open source project is that it's
[Apps Gone Rogue: Maintaining Personal Privacy in an Epidemic](https://drive.google.com/file/d/1nwOR4drE3YdkCkyy_HBd6giQPPhLEkRc/view?usp=sharing) - The original white paper.
-[COVID Safe Paths Slack](covidsafepaths.slack.com) - Where the community lives.
+[COVID Safe Paths Slack](covidsafepaths.slack.com) - Where the community lives.
[Path-Check/gaen-mobile](https://github.com/Path-Check/gaen-mobile) - PathCheck's GAEN based contract tracing solution.
@@ -117,7 +117,7 @@ Populate the following 2 `.env` files with the relevant urls for your GAEN serve
#### Android (Windows, Linux, macOS)
```
-yarn run-android-gps ## for the location enabled app
+yarn run-android ## for the location enabled app
```
Device storage can be cleared by long-pressing on the app icon in the simulator, clicking "App info", then "Storage", and lastly, "Clear Storage".
@@ -133,7 +133,7 @@ yarn install:pod ## only needs to be ran once
Then, run the application:
```
-yarn run-ios-gps ## for the location enabled app
+yarn run-ios ## for the location enabled app
```
Device storage can be cleared by clicking "Hardware" on the system toolbar, and then "Erase all content and settings".
diff --git a/ios/AppDelegate.m b/ios/AppDelegate.m
deleted file mode 100644
index 094b44f829..0000000000
--- a/ios/AppDelegate.m
+++ /dev/null
@@ -1,117 +0,0 @@
-//
-// AppDelegate.m
-// BT
-//
-// Created by John Schoeman on 5/28/20.
-// Copyright © 2020 Path Check Inc. All rights reserved.
-//
-
-#import
-#import "AppDelegate.h"
-
-#import
-#import
-#import
-#import
-#import
-#import
-#import
-
-@implementation AppDelegate
-- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
-{
- RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:launchOptions];
- RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge
- moduleName:@"COVIDSafePaths"
- initialProperties:nil];
-
- rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1];
-
- self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
-
- UIViewController *rootViewController = [UIViewController new];
- rootViewController.view = rootView;
-
- self.window.rootViewController = rootViewController;
- [self.window makeKeyAndVisible];
-
- UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
- center.delegate = self;
-
- // Register background task
- [[ExposureManager shared] registerBackgroundTask];
-
- // Schedule background task
- [[ExposureManager shared] scheduleBackgroundTaskIfNeeded];
-
- [RNSplashScreen showSplash:@"LaunchScreen" inRootView:rootView];
- return YES;
-}
-
-- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge
-{
-#if DEBUG
- return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
-#else
- return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
-#endif
-}
-
-// Required to register for notifications
-- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
-{
- [RNCPushNotificationIOS didRegisterUserNotificationSettings:notificationSettings];
-}
-// Required for the register event.
-- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
-{
- [RNCPushNotificationIOS didRegisterForRemoteNotificationsWithDeviceToken:deviceToken];
-}
-// Required for the notification event. You must call the completion handler after handling the remote notification.
-- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
-fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
-{
- [RNCPushNotificationIOS didReceiveRemoteNotification:userInfo fetchCompletionHandler:completionHandler];
-}
-
-// Required for the registrationError event.
-- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
-{
- [RNCPushNotificationIOS didFailToRegisterForRemoteNotificationsWithError:error];
-}
-// Required for the localNotification event.
-- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
-{
- [RNCPushNotificationIOS didReceiveLocalNotification:notification];
-}
-
--(BOOL) isFirstTimeClosing {
- //Show local notifiation at first time only.
- if(![[NSUserDefaults standardUserDefaults] boolForKey:@"cxfed_NotificationAtFirstTimeOnly"]) {
- [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"cxfed_NotificationAtFirstTimeOnly"];
- [[NSUserDefaults standardUserDefaults] synchronize];
- return TRUE;
- }
- return FALSE;
-}
-
-- (BOOL)hasNotificationPermissions {
- //Checking local notification permission or not.
- UIUserNotificationSettings *grantedSettings = [[UIApplication sharedApplication] currentUserNotificationSettings];
- if (grantedSettings.types != UIUserNotificationTypeNone){
- return TRUE;
- }
- return FALSE;
-}
-
-- (void)applicationWillTerminate:(UIApplication *)application {
- if([self isFirstTimeClosing] && [self hasNotificationPermissions]) {
- }
-}
-
--(void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler
-{
- completionHandler(UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionBadge);
-}
-
-@end
diff --git a/ios/BT/API/APIClient.swift b/ios/BT/API/APIClient.swift
deleted file mode 100644
index f612a50589..0000000000
--- a/ios/BT/API/APIClient.swift
+++ /dev/null
@@ -1,241 +0,0 @@
-import Alamofire
-
-enum RequestType {
- case postKeys,
- downloadKeys
-}
-
-final class APIClient {
-
- let postKeysUrl: URL
- let downloadBaseUrl: URL
- static let shared = APIClient(
- postKeysUrl: URL(string: ReactNativeConfig.env(for: .postKeysUrl))!,
- downloadBaseUrl: URL(string: ReactNativeConfig.env(for: .downloadBaseUrl))!
- )
-
- private let sessionManager: SessionManager
-
- init(postKeysUrl: URL, downloadBaseUrl: URL) {
- self.postKeysUrl = postKeysUrl
- self.downloadBaseUrl = downloadBaseUrl
-
- let configuration = URLSessionConfiguration.default
-
- let headers = SessionManager.defaultHTTPHeaders
-
- configuration.httpAdditionalHeaders = headers
- configuration.requestCachePolicy = .reloadIgnoringLocalAndRemoteCacheData
-
- sessionManager = SessionManager(configuration: configuration)
- }
-
- func request(_ request: T, requestType: RequestType, completion: @escaping GenericCompletion) where T.ResponseType == Void {
- dataRequest(for: request, requestType: requestType)
- .validate(validate)
- .response { response in
- if let error = response.error {
- completion(.failure(error))
- }
- else {
- completion(GenericSuccess)
- }
- }
- }
-
- func downloadRequest(_ request: T, requestType: RequestType, completion: @escaping (Result) -> Void) {
- downloadRequest(for: request).responseData { response in
- guard let data = response.result.value else {
- completion(.failure(GenericError.unknown))
- return
- }
- if let downloadedPackage = DownloadedPackage(compressedData: data) {
- completion(.success(downloadedPackage))
- } else {
- completion(.failure(GenericError.unknown))
- }
- }
- }
-
- func request(_ request: T, requestType: RequestType, completion: @escaping (Result) -> Void) where T.ResponseType == JSONObject {
- dataRequest(for: request, requestType: requestType)
- .validate(validate)
- .responseJSON { response in
- switch response.result {
- case .success(let value):
- completion(.success(value as? JSONObject ?? JSONObject()))
- case .failure(let error):
- completion(.failure(error))
- }
- }
- }
-
- func request(_ request: T, requestType: RequestType, completion: @escaping (Result) -> Void) where T.ResponseType: Decodable {
- requestDecodable(request, requestType: requestType, completion: completion)
- }
-
- func requestList(_ request: T, requestType: RequestType, completion: @escaping (Result<[T.ResponseType.Element]>) -> Void) where T.ResponseType: Collection, T.ResponseType.Element: Decodable {
- requestDecodables(request, requestType: requestType, completion: completion)
- }
-
- func requestString(_ request: T, requestType: RequestType, completion: @escaping (Result) -> Void) where T.ResponseType == String {
- dataRequest(for: request, requestType: requestType)
- .validate(validate)
- .responseData { response in
- switch response.result {
- case .success(let data):
- completion(.success(String(decoding: data, as: UTF8.self)))
- case .failure(let error):
- completion(.failure(error))
- }
- }
- }
-
- func cancelAllRequests() {
- sessionManager.session.getAllTasks { tasks in
- tasks.forEach { $0.cancel() }
- }
- }
-
- static var documentsDirectory: URL? {
- let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
-
- return paths.first
- }
-
-}
-
-// MARK: - Private
-
-private extension APIClient {
-
- enum Key {
- static let error = "error"
- static let errorMessage = "error_description"
- }
-
- func downloadRequest(for request: T) -> DataRequest {
- let r = sessionManager.request(downloadBaseUrl.appendingPathComponent(request.path))
- debugPrint(r)
- return r
- }
-
- func dataRequest(for request: T, requestType: RequestType) -> DataRequest {
- var baseUrl: URL!
- switch requestType {
- case .postKeys:
- baseUrl = postKeysUrl
- case .downloadKeys:
- baseUrl = downloadBaseUrl
- }
- let r = sessionManager.request(
- baseUrl.appendingPathComponent(request.path, isDirectory: false),
- method: request.method,
- parameters: request.parameters,
- encoding: request.encoding
- )
- debugPrint(r)
- return r
- }
-
- func validate(request: URLRequest?, response: HTTPURLResponse, data: Data?) -> Request.ValidationResult {
- if (200...399).contains(response.statusCode) {
- return .success
- }
-
- // Attempt to deserialize structured error, if it exists
- if let data = data, let json = (try? JSONSerialization.jsonObject(with: data, options: [])) as? JSONObject, let errorJson = json[Key.error] as? JSONObject {
- do {
- return .failure(try StructuredError(json: errorJson))
- } catch {
- return .failure(error)
- }
- }
-
- // Fallback on a simple status code error
- return .failure(GenericError(statusCode: response.statusCode))
- }
-
- func requestDecodable(_ request: T, requestType: RequestType, completion: @escaping (Result) -> Void) where T.ResponseType: Decodable {
- dataRequest(for: request, requestType: requestType)
- .validate(validate)
- .responseData { response in
- switch response.result {
- case .success(let data):
- do {
- let decoder = JSONDecoder()
- decoder.dateDecodingStrategy = .formatted(DateFormatter.iso8601Full)
- completion(.success(try decoder.decode(T.ResponseType.self, from: data)))
- } catch {
- completion(.failure(error))
- }
- case .failure(let error):
- completion(.failure(error))
- }
- }
- }
-
- func requestDecodables(_ request: T, requestType: RequestType, completion: @escaping (Result<[T.ResponseType.Element]>) -> Void) where T.ResponseType: Collection, T.ResponseType.Element: Decodable {
- requestDecodable(CollectionAPIRequest(request: request), requestType: requestType) { result in
- switch result {
- case .success(let value):
- completion(.success(value.results))
- case .failure(let error):
- completion(.failure(error))
- }
- }
- }
-
-}
-
-private struct CollectionAPIRequest: APIRequest where T.ResponseType: Collection, T.ResponseType.Element: Decodable {
-
- typealias ResponseType = ResultsContainer
-
- let request: T
-
- var method: HTTPMethod {
- return request.method
- }
-
- var path: String {
- return request.path
- }
-
- var parameters: Parameters? {
- return request.parameters
- }
-
-}
-
-private struct ResultsContainer: Decodable {
- var results: [T]
-}
-
-private extension GenericError {
-
- init(statusCode: Int) {
- switch statusCode {
- case 400:
- self = .badRequest
- case 401:
- self = .unauthorized
- case 404:
- self = .notFound
- default:
- self = .unknown
- }
- }
-
-}
-
-private extension DateFormatter {
- static let iso8601Full: DateFormatter = {
- let formatter = DateFormatter()
- formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ"
- formatter.calendar = Calendar(identifier: .iso8601)
- formatter.timeZone = TimeZone(secondsFromGMT: 0)
- formatter.locale = Locale(identifier: "en_US_POSIX")
- return formatter
- }()
-}
diff --git a/ios/BT/API/APIRequest.swift b/ios/BT/API/APIRequest.swift
deleted file mode 100644
index d2ebda9ec9..0000000000
--- a/ios/BT/API/APIRequest.swift
+++ /dev/null
@@ -1,33 +0,0 @@
-import Alamofire
-
-protocol APIRequest {
-
- associatedtype ResponseType
-
- var method: HTTPMethod { get }
- var path: String { get }
- var parameters: Parameters? { get }
- var encoding: ParameterEncoding { get }
-
-}
-
-extension APIRequest {
-
- var method: HTTPMethod {
- return .get
- }
-
- var parameters: Parameters? {
- return nil
- }
-
- var encoding: ParameterEncoding {
- switch method {
- case .get, .connect, .options, .head, .trace:
- return URLEncoding.default
- case .post, .patch, .put, .delete:
- return JSONEncoding.default
- }
- }
-
-}
diff --git a/ios/BT/API/Helpers/DownloadPackage+Helpers.swift b/ios/BT/API/Helpers/DownloadPackage+Helpers.swift
deleted file mode 100644
index d099bf7750..0000000000
--- a/ios/BT/API/Helpers/DownloadPackage+Helpers.swift
+++ /dev/null
@@ -1,17 +0,0 @@
-import Foundation
-
-extension DownloadedPackage {
-
- func writeSignatureEntry(toDirectory directory: URL, filename: String) throws -> URL {
- let url = directory.appendingPathComponent(filename).appendingPathExtension("sig")
- try signature.write(to: url)
- return url
- }
-
- func writeKeysEntry(toDirectory directory: URL, filename: String) throws -> URL {
- let url = directory.appendingPathComponent(filename).appendingPathExtension("bin")
- try bin.write(to: url)
- return url
- }
-
-}
diff --git a/ios/BT/API/JSON.swift b/ios/BT/API/JSON.swift
deleted file mode 100644
index a806f12540..0000000000
--- a/ios/BT/API/JSON.swift
+++ /dev/null
@@ -1,41 +0,0 @@
-import Foundation
-
-typealias JSONObject = [String: Any]
-typealias JSONObjectArray = [JSONObject]
-
-protocol JSONSerializable {
-
- func toJson() throws -> JSONObject
-
-}
-
-protocol JSONDeserializable {
-
- init(json: JSONObject) throws
-
-}
-
-extension Encodable {
-
- func toJson() throws -> Any {
- let encoder = JSONEncoder()
- encoder.dateEncodingStrategy = .iso8601
- encoder.dataEncodingStrategy = .base64
-
- return try JSONSerialization.jsonObject(with: encoder.encode(self), options: [])
- }
-
-}
-
-extension Decodable {
-
- init(json: JSONObject) throws {
- let data = try JSONSerialization.data(withJSONObject: json, options: [])
-
- let decoder = JSONDecoder()
- decoder.dateDecodingStrategy = .iso8601
-
- self = try decoder.decode(Self.self, from: data)
- }
-
-}
diff --git a/ios/BT/API/Model/DownloadedPackage.swift b/ios/BT/API/Model/DownloadedPackage.swift
deleted file mode 100644
index b24086690e..0000000000
--- a/ios/BT/API/Model/DownloadedPackage.swift
+++ /dev/null
@@ -1,56 +0,0 @@
-import Foundation
-import ZIPFoundation
-import CryptoKit
-
-struct DownloadedPackage {
-
- init(keysBin: Data, signature: Data) {
- bin = keysBin
- self.signature = signature
- }
-
- init?(compressedData: Data) {
- guard let archive = Archive(data: compressedData, accessMode: .read) else {
- return nil
- }
- do {
- self = try archive.extractKeyPackage()
- } catch {
- return nil
- }
- }
-
- let bin: Data
- let signature: Data
-
-}
-
-private extension Archive {
- typealias KeyPackage = (bin: Data, sig: Data)
- enum KeyPackageError: Error {
- case binNotFound
- case sigNotFound
- case signatureCheckFailed
- }
-
- func extractData(from entry: Entry) throws -> Data {
- var data = Data()
- try _ = extract(entry) { slice in
- data.append(slice)
- }
- return data
- }
-
- func extractKeyPackage() throws -> DownloadedPackage {
- guard let binEntry = self["export.bin"] else {
- throw KeyPackageError.binNotFound
- }
- guard let sigEntry = self["export.sig"] else {
- throw KeyPackageError.sigNotFound
- }
- return DownloadedPackage(
- keysBin: try extractData(from: binEntry),
- signature: try extractData(from: sigEntry)
- )
- }
-}
diff --git a/ios/BT/API/Model/Exposure.swift b/ios/BT/API/Model/Exposure.swift
deleted file mode 100644
index f79346637d..0000000000
--- a/ios/BT/API/Model/Exposure.swift
+++ /dev/null
@@ -1,44 +0,0 @@
-import ExposureNotification
-import Foundation
-import RealmSwift
-
-@objcMembers
-class Exposure: Object, Codable {
- @objc dynamic var id: String = .default
- @objc dynamic var date: Int = 0
- @objc dynamic var duration: Double = 0.0
- @objc dynamic var totalRiskScore: Int = 0
- @objc dynamic var transmissionRiskLevel: Int = 0
-
- init(id: String,
- date: Int,
- duration: TimeInterval,
- totalRiskScore: ENRiskScore,
- transmissionRiskLevel: ENRiskScore) {
- self.id = id
- self.date = date
- self.duration = duration
- self.totalRiskScore = Int(totalRiskScore)
- self.transmissionRiskLevel = Int(transmissionRiskLevel)
- super.init()
- }
-
- required init() {
- super.init()
- }
-
- override class func primaryKey() -> String? {
- "id"
- }
-
- var asDictionary : [String: Any] {
- return [
- "id": id,
- "date": date,
- "duration": duration,
- "totalRiskScore": totalRiskScore,
- "transmissionRiskLevel": transmissionRiskLevel
- ]
- }
-
-}
diff --git a/ios/BT/API/Model/ExposureConfiguration.swift b/ios/BT/API/Model/ExposureConfiguration.swift
deleted file mode 100644
index 3571454fa9..0000000000
--- a/ios/BT/API/Model/ExposureConfiguration.swift
+++ /dev/null
@@ -1,36 +0,0 @@
-import Foundation
-import ExposureNotification
-
-struct ExposureConfiguration: Codable {
-
- let minimumRiskScore: ENRiskScore
- let attenuationDurationThresholds: [Int]
- let attenuationLevelValues: [ENRiskLevelValue]
- let daysSinceLastExposureLevelValues: [ENRiskLevelValue]
- let durationLevelValues: [ENRiskLevelValue]
- let transmissionRiskLevelValues: [ENRiskLevelValue]
-
-}
-
-extension ExposureConfiguration {
-
- static var placeholder: ExposureConfiguration = {
- ExposureConfiguration(minimumRiskScore: 0,
- attenuationDurationThresholds: [50, 70],
- attenuationLevelValues: [1, 2, 3, 4, 5, 6, 7, 8],
- daysSinceLastExposureLevelValues: [1, 2, 3, 4, 5, 6, 7, 8],
- durationLevelValues: [1, 2, 3, 4, 5, 6, 7, 8],
- transmissionRiskLevelValues: [1, 2, 3, 4, 5, 6, 7, 8])
- }()
-
- var asENExposureConfiguration: ENExposureConfiguration {
- let config = ENExposureConfiguration()
- config.metadata = ["attenuationDurationThresholds": attenuationDurationThresholds]
- config.attenuationLevelValues = attenuationLevelValues.map { NSNumber(value: $0) }
- config.daysSinceLastExposureLevelValues = daysSinceLastExposureLevelValues.map { NSNumber(value: $0) }
- config.durationLevelValues = durationLevelValues.map { NSNumber(value: $0) }
- config.transmissionRiskLevelValues = transmissionRiskLevelValues.map { NSNumber(value: $0) }
- return config
- }
-
-}
diff --git a/ios/BT/API/Model/ExposureKey.swift b/ios/BT/API/Model/ExposureKey.swift
deleted file mode 100644
index b80fa6514c..0000000000
--- a/ios/BT/API/Model/ExposureKey.swift
+++ /dev/null
@@ -1,11 +0,0 @@
-import Foundation
-import ExposureNotification
-
-struct ExposureKey: Codable {
-
- let key: Data
- let rollingPeriod: ENIntervalNumber
- let rollingStartNumber: ENIntervalNumber
- let transmissionRisk: ENRiskLevel
-
-}
diff --git a/ios/BT/API/Model/Region.swift b/ios/BT/API/Model/Region.swift
deleted file mode 100644
index c8971310a7..0000000000
--- a/ios/BT/API/Model/Region.swift
+++ /dev/null
@@ -1,3 +0,0 @@
-enum Region: String {
- case US
-}
diff --git a/ios/BT/API/Model/UserState.swift b/ios/BT/API/Model/UserState.swift
deleted file mode 100644
index 435137b3ae..0000000000
--- a/ios/BT/API/Model/UserState.swift
+++ /dev/null
@@ -1,19 +0,0 @@
-import Foundation
-import RealmSwift
-
-@objcMembers
-class UserState: Object {
- static let id = 0
-
- @objc dynamic var id: Int = UserState.id
- @objc dynamic var dateLastPerformedFileCapacityReset: Date? = nil
- @objc dynamic var remainingDailyFileProcessingCapacity: Int = Constants.dailyFileProcessingCapacity
- @objc dynamic var exposureDetectionErrorLocalizedDescription: String = .default
- @objc dynamic var urlOfMostRecentlyDetectedKeyFile: String = .default
- let exposures: List = List()
-
- override class func primaryKey() -> String? {
- "id"
- }
-
-}
diff --git a/ios/BT/API/Requests/DiagnosisKeyRequests.swift b/ios/BT/API/Requests/DiagnosisKeyRequests.swift
deleted file mode 100644
index c92fd9af89..0000000000
--- a/ios/BT/API/Requests/DiagnosisKeyRequests.swift
+++ /dev/null
@@ -1,67 +0,0 @@
-import Alamofire
-import ExposureNotification
-
-enum DiagnosisKeyRequest: APIRequest {
-
- typealias ResponseType = ExposureKey
-
- case get(URL),
- delete(URL)
-
- var method: HTTPMethod {
- switch self {
- case .get:
- return .get
- case .delete:
- return .delete
- }
- }
-
- var path: String {
- return ""
- }
-
- var parameters: Parameters? {
- return nil
- }
-
-}
-
-enum DiagnosisKeyListRequest: APIRequest {
-
- typealias ResponseType = Void
-
- case post([ExposureKey], [Region], String, String)
-
- var method: HTTPMethod {
- switch self {
- case .post:
- return .post
- }
- }
-
- var path: String {
- switch self {
- case .post:
- return ""
- }
- }
-
- var parameters: Parameters? {
- switch self {
- case .post(let diagnosisKeys,
- let regions,
- let certificate,
- let hmacKey):
- let keys = diagnosisKeys.map { try? $0.toJson() as? JSONObject }
- return [
- "temporaryExposureKeys": keys,
- "regions": regions.map { $0.rawValue },
- "appPackageName": Bundle.main.bundleIdentifier!,
- "verificationPayload": certificate,
- "hmackey": hmacKey,
- "padding": String(decoding: Data(), as: UTF8.self)
- ]
- }
- }
-}
diff --git a/ios/BT/API/Requests/DiagnosisKeyUrlRequests.swift b/ios/BT/API/Requests/DiagnosisKeyUrlRequests.swift
deleted file mode 100644
index 0882e4042d..0000000000
--- a/ios/BT/API/Requests/DiagnosisKeyUrlRequests.swift
+++ /dev/null
@@ -1,51 +0,0 @@
-import Alamofire
-import ExposureNotification
-
-enum DiagnosisKeyUrlRequest: APIRequest {
-
- typealias ResponseType = Void
-
- case get(String)
-
- var method: HTTPMethod {
- switch self {
- case .get:
- return .get
- }
- }
-
- var path: String {
- switch self {
- case .get(let path):
- return path
- }
- }
-
- var parameters: Parameters? {
- return nil
- }
-
-}
-
-enum DiagnosisKeyUrlListRequest: APIRequest {
-
- typealias ResponseType = [URL]
-
- case get(Int)
-
- var method: HTTPMethod {
- switch self {
- case .get:
- return .get
- }
- }
-
- var path: String {
- return ""
- }
-
- var parameters: Parameters? {
- return nil
- }
-
-}
diff --git a/ios/BT/API/Requests/ExposureConfigurationRequests.swift b/ios/BT/API/Requests/ExposureConfigurationRequests.swift
deleted file mode 100644
index 709a17e057..0000000000
--- a/ios/BT/API/Requests/ExposureConfigurationRequests.swift
+++ /dev/null
@@ -1,24 +0,0 @@
-import Alamofire
-import Foundation
-
-enum ExposureConfigurationRequest: APIRequest {
-
- typealias ResponseType = ExposureConfiguration
-
- case get
-
- var method: HTTPMethod {
- switch self {
- case .get:
- return .get
- }
- }
-
- var path: String {
- switch self {
- case .get:
- return ""
- }
- }
-
-}
diff --git a/ios/BT/API/Requests/IndexFileRequests.swift b/ios/BT/API/Requests/IndexFileRequests.swift
deleted file mode 100644
index f14f728d52..0000000000
--- a/ios/BT/API/Requests/IndexFileRequests.swift
+++ /dev/null
@@ -1,20 +0,0 @@
-import Alamofire
-
-enum IndexFileRequest: APIRequest {
-
- typealias ResponseType = String
-
- case get
-
- var method: HTTPMethod {
- switch self {
- case .get:
- return .get
- }
- }
-
- var path: String {
- (ReactNativeConfig.env(for: .downloadPath)) + "/index.txt"
- }
-
-}
diff --git a/ios/BT/API/Result.swift b/ios/BT/API/Result.swift
deleted file mode 100644
index 902141e3d8..0000000000
--- a/ios/BT/API/Result.swift
+++ /dev/null
@@ -1,82 +0,0 @@
-import Alamofire
-
-public enum Result {
-
- case success(T)
- case failure(Error)
-
-}
-
-public enum ExposureResult {
-
- case success(Int)
- case failure(ExposureError)
-
-}
-
-public enum GenericError: Error {
-
- case unknown
- case badRequest
- case cancelled
- case notFound
- case notImplemented
- case unauthorized
-
-}
-
-public enum ExposureError: LocalizedError {
-
- case `default`(String?)
- case dailyFileProcessingLimitExceeded
- case cancelled
-
- public var errorDescription: String? {
- switch self {
- case .default(message: let message):
- guard let unwrappedMessage = message else {
- return localizedDescription
- }
- return unwrappedMessage
- case .dailyFileProcessingLimitExceeded:
- return "Daily exposure detection file processing limit exceeded"
- case .cancelled:
- return "Exposure Detection Cancelled"
- }
- }
-
-}
-
-public enum APIError: LocalizedError {
- case `default`(message: String?)
-
- public var errorDescription: String? {
- switch self {
- case .default(message: let message):
- guard let unwrappedMessage = message else {
- return ""
- }
- return unwrappedMessage
- }
- }
-
-}
-
-public let GenericSuccess = GenericResult.success(())
-
-public func GenericFailure(_ error: GenericError) -> Result {
- return .failure(error)
-}
-
-extension Error {
-
- public var isCancellation: Bool {
- switch self {
- case let error as GenericError:
- return error == .cancelled
- case let error as NSError:
- return error.domain == NSURLErrorDomain && error.code == NSURLErrorCancelled
- }
- }
-
-}
diff --git a/ios/BT/API/StructuredError.swift b/ios/BT/API/StructuredError.swift
deleted file mode 100644
index fe3d112c13..0000000000
--- a/ios/BT/API/StructuredError.swift
+++ /dev/null
@@ -1,13 +0,0 @@
-import Foundation
-
-struct StructuredError: Error, Decodable {
-
- let title: String?
- let message: String
-
- init(title: String? = nil, message: String) {
- self.title = title
- self.message = message
- }
-
-}
diff --git a/ios/BT/API/TypeAliases.swift b/ios/BT/API/TypeAliases.swift
deleted file mode 100644
index 8d96228a70..0000000000
--- a/ios/BT/API/TypeAliases.swift
+++ /dev/null
@@ -1,3 +0,0 @@
-
-public typealias GenericResult = Result
-public typealias GenericCompletion = (GenericResult) -> Void
diff --git a/ios/BT/BT-Bridging-Header.h b/ios/BT/BT-Bridging-Header.h
deleted file mode 100644
index f99e7ec0c5..0000000000
--- a/ios/BT/BT-Bridging-Header.h
+++ /dev/null
@@ -1,11 +0,0 @@
-//
-// BT-Bridging-Header.h
-// BT
-//
-// Created by John Schoeman on 6/1/20.
-// Copyright © 2020 Path Check Inc. All rights reserved.
-//
-
-#import "React/RCTBridgeModule.h"
-#import
-#import "ReactNativeConfig.h"
diff --git a/ios/BT/BT-Development.entitlements b/ios/BT/BT-Development.entitlements
deleted file mode 100644
index f86fce9ef6..0000000000
--- a/ios/BT/BT-Development.entitlements
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
- com.apple.developer.exposure-notification-test
-
- com.apple.developer.exposure-notification-test-skip-file-verification
-
- com.apple.developer.exposure-notification-logging
-
- aps-environment
- Development
- com.apple.developer.exposure-notification
-
-
-
diff --git a/ios/BT/BT-Production.entitlements b/ios/BT/BT-Production.entitlements
deleted file mode 100644
index d525d0a851..0000000000
--- a/ios/BT/BT-Production.entitlements
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
- aps-environment
- Production
- com.apple.developer.exposure-notification
-
-
-
diff --git a/ios/BT/Config/Debug-BT.xcconfig b/ios/BT/Config/Debug-BT.xcconfig
deleted file mode 100644
index b76394efaf..0000000000
--- a/ios/BT/Config/Debug-BT.xcconfig
+++ /dev/null
@@ -1,17 +0,0 @@
-//
-// Debug-BT.xcconfig
-// COVIDSafePaths
-//
-// Created by Rob Visentin on 6/26/20.
-// Copyright © 2020 Path Check Inc. All rights reserved.
-//
-
-// Configuration settings file format documentation can be found at:
-// https://help.apple.com/xcode/#/dev745c5c974
-
-#include "Version.xcconfig"
-
-ASSETCATALOG_COMPILER_APPICON_NAME = AppIconDev
-PRODUCT_BUNDLE_IDENTIFIER = org.pathcheck.bt.dev
-
-ALLOW_INSECURE_HTTP = YES
diff --git a/ios/BT/Config/Release-BT.xcconfig b/ios/BT/Config/Release-BT.xcconfig
deleted file mode 100644
index 0f136e969b..0000000000
--- a/ios/BT/Config/Release-BT.xcconfig
+++ /dev/null
@@ -1,17 +0,0 @@
-//
-// Release-BT.xcconfig
-// COVIDSafePaths
-//
-// Created by Rob Visentin on 6/26/20.
-// Copyright © 2020 Path Check Inc. All rights reserved.
-//
-
-// Configuration settings file format documentation can be found at:
-// https://help.apple.com/xcode/#/dev745c5c974
-
-#include "Version.xcconfig"
-
-ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon
-PRODUCT_BUNDLE_IDENTIFIER = org.pathcheck.bt
-
-ALLOW_INSECURE_HTTP = NO
diff --git a/ios/BT/Config/Staging-BT.xcconfig b/ios/BT/Config/Staging-BT.xcconfig
deleted file mode 100644
index 059f88dd86..0000000000
--- a/ios/BT/Config/Staging-BT.xcconfig
+++ /dev/null
@@ -1,17 +0,0 @@
-//
-// Staging-BT.xcconfig
-// COVIDSafePaths
-//
-// Created by Rob Visentin on 6/26/20.
-// Copyright © 2020 Path Check Inc. All rights reserved.
-//
-
-// Configuration settings file format documentation can be found at:
-// https://help.apple.com/xcode/#/dev745c5c974
-
-#include "Version.xcconfig"
-
-ASSETCATALOG_COMPILER_APPICON_NAME = AppIconStaging
-PRODUCT_BUNDLE_IDENTIFIER = org.pathcheck.bt.staging
-
-ALLOW_INSECURE_HTTP = NO
diff --git a/ios/BT/Config/Version.xcconfig b/ios/BT/Config/Version.xcconfig
deleted file mode 100644
index 97a7221d72..0000000000
--- a/ios/BT/Config/Version.xcconfig
+++ /dev/null
@@ -1,18 +0,0 @@
-//
-// Version.xcconfig
-// COVIDSafePaths
-//
-// Created by Rob Visentin on 6/26/20.
-// Copyright © 2020 Path Check Inc. All rights reserved.
-//
-
-// Configuration settings file format documentation can be found at:
-// https://help.apple.com/xcode/#/dev745c5c974
-
-// Staging
-MARKETING_VERSION = 1.0.0
-CURRENT_PROJECT_VERSION = 1
-
-// Release
-MARKETING_VERSION[config=Release-BT] = 1.0.29
-CURRENT_PROJECT_VERSION[config=Release-BT] = 3
diff --git a/ios/BT/Constants.swift b/ios/BT/Constants.swift
deleted file mode 100644
index 0f97e059af..0000000000
--- a/ios/BT/Constants.swift
+++ /dev/null
@@ -1,5 +0,0 @@
-enum Constants {
- static let intervalsPerRollingPeriod: Int = 144
- static let exposureLifetimeHours: Int = 336
- static let dailyFileProcessingCapacity: Int = 15
-}
diff --git a/ios/BT/DebugAction.swift b/ios/BT/DebugAction.swift
deleted file mode 100644
index 0b26cc0f38..0000000000
--- a/ios/BT/DebugAction.swift
+++ /dev/null
@@ -1,11 +0,0 @@
-@objc enum DebugAction: Int {
- case fetchDiagnosisKeys,
- detectExposuresNow,
- simulateExposureDetectionError,
- simulateExposure,
- fetchExposures,
- getAndPostDiagnosisKeys,
- resetExposures,
- toggleENAuthorization,
- showLastProcessedFilePath
-}
diff --git a/ios/BT/ExposureManager.swift b/ios/BT/ExposureManager.swift
deleted file mode 100644
index a8b26f05f8..0000000000
--- a/ios/BT/ExposureManager.swift
+++ /dev/null
@@ -1,432 +0,0 @@
-import Foundation
-import ExposureNotification
-import RealmSwift
-import UserNotifications
-import BackgroundTasks
-
-@objc(ExposureManager)
-final class ExposureManager: NSObject {
-
- enum EnabledState: String {
- case enabled = "ENABLED"
- case disabled = "DISABLED"
- }
-
- enum AuthorizationState: String {
- case authorized = "AUTHORIZED"
- case unauthorized = "UNAUTHORIZED"
- }
-
- @objc static let shared = ExposureManager()
-
- private static let backgroundTaskIdentifier = "\(Bundle.main.bundleIdentifier!).exposure-notification"
-
- let manager = ENManager()
-
- var enabledState: EnabledState {
- return manager.exposureNotificationEnabled ? .enabled : .disabled
- }
-
- var authorizationState: AuthorizationState {
- return (ENManager.authorizationStatus == .authorized) ? .authorized : .unauthorized
- }
-
- @objc var currentExposures: String {
- return Array(BTSecureStorage.shared.userState.exposures).jsonStringRepresentation()
- }
-
- private var isDetectingExposures = false
-
- /// Downloaded archives from the GAEN server
- private var downloadedPackages = [DownloadedPackage]()
-
- /// Local urls of the bin/sig files from each archive
- private var localUncompressedURLs = [URL]()
-
- override init() {
- super.init()
- manager.activate { _ in
- // Ensure exposure notifications are enabled if the app is authorized. The app
- // could get into a state where it is authorized, but exposure
- // notifications are not enabled, if the user initially denied Exposure Notifications
- // during onboarding, but then flipped on the "COVID-19 Exposure Notifications" switch
- // in Settings.
- if self.authorizationState == .authorized && self.enabledState == .disabled {
- self.manager.setExposureNotificationEnabled(true) { _ in
- // No error handling for attempts to enable on launch
- }
- }
- }
-
- // Schedule background task if needed whenever EN authorization status changes
- NotificationCenter.default.addObserver(
- self,
- selector: #selector(scheduleBackgroundTaskIfNeeded),
- name: .AuthorizationStatusDidChange,
- object: nil
- )
- }
-
- deinit {
- manager.invalidate()
- }
-
- @objc func requestExposureNotificationAuthorization(enabled: Bool, callback: @escaping RCTResponseSenderBlock) {
- // Ensure exposure notifications are enabled if the app is authorized. The app
- // could get into a state where it is authorized, but exposure
- // notifications are not enabled, if the user initially denied Exposure Notifications
- // during onboarding, but then flipped on the "COVID-19 Exposure Notifications" switch
- // in Settings.
- manager.setExposureNotificationEnabled(enabled) { error in
- if let error = error {
- callback([error])
- } else {
- NotificationCenter.default.post(Notification(
- name: .AuthorizationStatusDidChange,
- object: self,
- userInfo: [
- Notification.UserInfoKey.enabledState: self.enabledState.rawValue,
- Notification.UserInfoKey.authorizationState: self.authorizationState.rawValue
- ]
- ))
- callback([String.genericSuccess])
- }
- }
- }
-
- @objc func getCurrentENPermissionsStatus(callback: @escaping RCTResponseSenderBlock) {
- callback([[authorizationState.rawValue, enabledState.rawValue]])
- }
-
- @discardableResult func detectExposures(completionHandler: @escaping ((ExposureResult) -> Void)) -> Progress {
-
- let progress = Progress()
-
- var lastProcessedUrlPath: String = .default
- var processedFileCount: Int = 0
-
- // Disallow concurrent exposure detection, because if allowed we might try to detect the same diagnosis keys more than once
- guard !isDetectingExposures else {
- finish(
- .failure(ExposureError.default("Detection Already in Progress")),
- processedFileCount: processedFileCount,
- lastProcessedUrlPath: lastProcessedUrlPath,
- progress: progress,
- completionHandler: completionHandler
- )
- return progress
- }
-
- isDetectingExposures = true
-
- // Reset file capacity to 15 if > 24 hours have elapsed since last reset
- ExposureManager.updateRemainingFileCapacity()
-
- // Abort if daily file capacity is exceeded
- guard BTSecureStorage.shared.userState.remainingDailyFileProcessingCapacity > 0 else {
- finish(
- .success([]),
- processedFileCount: processedFileCount,
- lastProcessedUrlPath: lastProcessedUrlPath,
- progress: progress,
- completionHandler: completionHandler
- )
- return progress
- }
-
- APIClient.shared.requestString(IndexFileRequest.get, requestType: .downloadKeys) { result in
- let dispatchGroup = DispatchGroup()
-
- switch result {
- case let .success(indexFileString):
- let remoteURLs = indexFileString.gaenFilePaths
- let targetUrls = ExposureManager.urlPathsToProcess(remoteURLs)
- lastProcessedUrlPath = targetUrls.last ?? .default
- processedFileCount = targetUrls.count
- for remoteURL in targetUrls {
- dispatchGroup.enter()
- APIClient.shared.downloadRequest(DiagnosisKeyUrlRequest.get(remoteURL), requestType: .downloadKeys) { result in
- switch result {
- case .success (let package):
- self.downloadedPackages.append(package)
- case .failure(let error):
- self.finish(.failure(error),
- processedFileCount: processedFileCount,
- lastProcessedUrlPath: lastProcessedUrlPath,
- progress: progress,
- completionHandler: completionHandler)
- return
- }
- dispatchGroup.leave()
- }
- }
-
- case let .failure(error):
- self.finish(.failure(error),
- processedFileCount: processedFileCount,
- lastProcessedUrlPath: lastProcessedUrlPath,
- progress: progress,
- completionHandler: completionHandler)
- return
- }
- dispatchGroup.notify(queue: .main) {
- do {
- try self.downloadedPackages.unpack { urls in
- self.localUncompressedURLs = urls
-
- // TODO: Fetch configuration from API
- let enConfiguration = ExposureConfiguration.placeholder.asENExposureConfiguration
- ExposureManager.shared.manager.detectExposures(configuration: enConfiguration, diagnosisKeyURLs: self.localUncompressedURLs) { summary, error in
- if let error = error {
- self.finish(.failure(error),
- processedFileCount: processedFileCount,
- lastProcessedUrlPath: lastProcessedUrlPath,
- progress: progress,
- completionHandler: completionHandler)
- return
- }
- let userExplanation = NSLocalizedString(String.newExposureNotificationBody, comment: .default)
- ExposureManager.shared.manager.getExposureInfo(summary: summary!, userExplanation: userExplanation) { exposures, error in
- if let error = error {
- self.finish(.failure(error),
- processedFileCount: processedFileCount,
- lastProcessedUrlPath: lastProcessedUrlPath,
- progress: progress,
- completionHandler: completionHandler)
- return
- }
- let newExposures = (exposures ?? []).map { exposure in
- Exposure(id: UUID().uuidString,
- date: exposure.date.posixRepresentation,
- duration: exposure.duration,
- totalRiskScore: exposure.totalRiskScore,
- transmissionRiskLevel: exposure.transmissionRiskLevel)
- }
- self.finish(.success(newExposures),
- processedFileCount: processedFileCount,
- lastProcessedUrlPath: lastProcessedUrlPath,
- progress: progress,
- completionHandler: completionHandler)
- }
- }
- }
- } catch(let error) {
- self.finish(.failure(error),
- processedFileCount: processedFileCount,
- lastProcessedUrlPath: lastProcessedUrlPath,
- progress: progress,
- completionHandler: completionHandler)
- }
- }
- }
- return progress
- }
-
- func finish(_ result: Result<[Exposure]>,
- processedFileCount: Int,
- lastProcessedUrlPath: String,
- progress: Progress,
- completionHandler: ((ExposureResult) -> Void)) {
-
- cleanup()
-
- isDetectingExposures = false
-
- if progress.isCancelled {
- BTSecureStorage.shared.exposureDetectionErrorLocalizedDescription = GenericError.unknown.localizedDescription
- completionHandler(.failure(ExposureError.cancelled))
- } else {
- switch result {
- case let .success(newExposures):
- BTSecureStorage.shared.exposureDetectionErrorLocalizedDescription = .default
- BTSecureStorage.shared.remainingDailyFileProcessingCapacity -= processedFileCount
- if lastProcessedUrlPath != .default {
- BTSecureStorage.shared.urlOfMostRecentlyDetectedKeyFile = lastProcessedUrlPath
- }
- BTSecureStorage.shared.storeExposures(newExposures)
- completionHandler(.success(processedFileCount))
- case let .failure(error):
- let exposureError = ExposureError.default(error.localizedDescription)
- BTSecureStorage.shared.exposureDetectionErrorLocalizedDescription = error.localizedDescription
- postExposureDetectionErrorNotification(exposureError.errorDescription)
- completionHandler(.failure(exposureError))
- }
- }
- }
-
- @objc func registerBackgroundTask() {
- notifyUserBlueToothOffIfNeeded()
- BGTaskScheduler.shared.register(forTaskWithIdentifier: ExposureManager.backgroundTaskIdentifier, using: .main) { [weak self] task in
-
- // Notify the user if bluetooth is off
- self?.notifyUserBlueToothOffIfNeeded()
-
- // Perform the exposure detection
- let progress = ExposureManager.shared.detectExposures { result in
- switch result {
- case .success:
- task.setTaskCompleted(success: true)
- case .failure:
- task.setTaskCompleted(success: false)
- }
- }
-
- // Handle running out of time
- task.expirationHandler = {
- progress.cancel()
- BTSecureStorage.shared.exposureDetectionErrorLocalizedDescription = NSLocalizedString("BACKGROUND_TIMEOUT", comment: "Error")
- }
-
- // Schedule the next background task
- self?.scheduleBackgroundTaskIfNeeded()
- }
- }
-
- @objc func scheduleBackgroundTaskIfNeeded() {
- guard ENManager.authorizationStatus == .authorized else { return }
- let taskRequest = BGProcessingTaskRequest(identifier: ExposureManager.backgroundTaskIdentifier)
- taskRequest.requiresNetworkConnectivity = true
- do {
- try BGTaskScheduler.shared.submit(taskRequest)
- } catch {
- print("Unable to schedule background task: \(error)")
- }
- }
-
- @objc func getAndPostDiagnosisKeys(certificate: String,
- HMACKey: String,
- resolve: @escaping RCTPromiseResolveBlock,
- reject: @escaping RCTPromiseRejectBlock) {
- manager.getDiagnosisKeys { temporaryExposureKeys, error in
- if let error = error {
- reject(String.noExposureKeysFound, "Failed to get exposure keys", error)
- } else {
-
- let allKeys = (temporaryExposureKeys ?? [])
-
- // Filter keys > 350 hrs old
- let currentKeys = allKeys.current()
-
- APIClient.shared.request(DiagnosisKeyListRequest.post(currentKeys.compactMap { $0.asCodableKey }, [.US], certificate, HMACKey),
- requestType: .postKeys) { result in
- switch result {
- case .success:
- resolve("Submitted: \(currentKeys.count) keys.")
- case .failure(let error):
- reject(String.networkFailure, "Failed to post exposure keys \(error.localizedDescription)", error)
- }
- }
- }
- }
- }
-
- func postExposureDetectionErrorNotification(_ errorString: String?) {
- #if DEBUG
- let identifier = String.exposureDetectionErrorNotificationIdentifier
-
- let content = UNMutableNotificationContent()
- content.title = String.exposureDetectionErrorNotificationTitle.localized
- content.body = errorString ?? String.exposureDetectionErrorNotificationBody.localized
- content.sound = .default
- let request = UNNotificationRequest(identifier: identifier, content: content, trigger: nil)
- UNUserNotificationCenter.current().add(request) { error in
- DispatchQueue.main.async {
- if let error = error {
- print("Error showing error user notification: \(error)")
- }
- }
- }
- #endif
- }
-
- @objc func fetchExposureKeys(resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
- manager.getDiagnosisKeys { (keys, error) in
- if let error = error {
- print(error)
- reject("no_exposure_keys", "There was an error fetching the exposure keys \(error)", error);
- } else {
- resolve((keys ?? []).map { $0.asDictionary })
- }
- }
- }
-
-}
-
-// MARK: - FileProcessing
-
-extension ExposureManager {
-
- static func startIndex(for urlPaths: [String]) -> Int {
- let path = BTSecureStorage.shared.userState.urlOfMostRecentlyDetectedKeyFile
- if let lastIdx = urlPaths.firstIndex(of: path) {
- return min(lastIdx + 1, urlPaths.count)
- }
- return 0
- }
-
- static func urlPathsToProcess(_ urlPaths: [String]) -> [String] {
- let startIdx = startIndex(for: urlPaths)
- let endIdx = min(startIdx + BTSecureStorage.shared.userState.remainingDailyFileProcessingCapacity, urlPaths.count)
- return Array(urlPaths[startIdx.. 24 {
- BTSecureStorage.shared.remainingDailyFileProcessingCapacity = Constants.dailyFileProcessingCapacity
- BTSecureStorage.shared.dateLastPerformedFileCapacityReset = Date()
- }
- }
-
- @objc func fetchLastDetectionDate(
- resolve: @escaping RCTPromiseResolveBlock,
- reject: @escaping RCTPromiseRejectBlock
- ) {
- guard let lastResetDate = BTSecureStorage.shared.userState.dateLastPerformedFileCapacityReset else {
- reject(.detectionNeverPerformed, "No lastResetDate available", GenericError.unknown);
- return
- }
- resolve(lastResetDate.posixRepresentation)
- }
-}
-
-// MARK: - Private
-
-private extension ExposureManager {
-
- func notifyUserBlueToothOffIfNeeded() {
- let identifier = String.bluetoothNotificationIdentifier
-
- // Bluetooth must be enabled in order for the device to exchange keys with other devices
- if ENManager.authorizationStatus == .authorized && manager.exposureNotificationStatus == .bluetoothOff {
- let content = UNMutableNotificationContent()
- content.title = String.bluetoothNotificationTitle.localized
- content.body = String.bluetoothNotificationBody.localized
- content.sound = .default
- let request = UNNotificationRequest(identifier: identifier, content: content, trigger: nil)
- UNUserNotificationCenter.current().add(request) { error in
- DispatchQueue.main.async {
- if let error = error {
- print("Error showing error user notification: \(error)")
- }
- }
- }
- } else {
- UNUserNotificationCenter.current().removeDeliveredNotifications(withIdentifiers: [identifier])
- }
- }
-
- func cleanup() {
- // Delete downloaded files from file system
- localUncompressedURLs.cleanup()
- localUncompressedURLs = []
- downloadedPackages = []
- }
-
-}
diff --git a/ios/BT/Extensions/Exposure Notifications/ENTemporaryExposureKey+Extensions.swift b/ios/BT/Extensions/Exposure Notifications/ENTemporaryExposureKey+Extensions.swift
deleted file mode 100644
index 7b6c355d90..0000000000
--- a/ios/BT/Extensions/Exposure Notifications/ENTemporaryExposureKey+Extensions.swift
+++ /dev/null
@@ -1,26 +0,0 @@
-import Foundation
-import ExposureNotification
-
-extension ENTemporaryExposureKey {
-
- var asCodableKey: ExposureKey {
- ExposureKey(key: keyData,
- rollingPeriod: rollingPeriod,
- rollingStartNumber: rollingStartNumber,
- transmissionRisk: transmissionRiskLevel)
- }
-
- var asDictionary : [String: Any] {
- return [
- "key": keyData,
- "rollingPeriod": rollingPeriod,
- "rollingStartNumber": rollingStartNumber,
- "transmissionRisk": transmissionRiskLevel
- ]
- }
-
- static func rollingStartNumber(_ date: Date) -> UInt32 {
- UInt32(Int(date.timeIntervalSince1970 / (24 * 60 * 60)) * Constants.intervalsPerRollingPeriod)
- }
-
-}
diff --git a/ios/BT/Extensions/Foundation/Array+Extensions.swift b/ios/BT/Extensions/Foundation/Array+Extensions.swift
deleted file mode 100644
index a7b5cf73c3..0000000000
--- a/ios/BT/Extensions/Foundation/Array+Extensions.swift
+++ /dev/null
@@ -1,55 +0,0 @@
-import ExposureNotification
-import Foundation
-
-extension Array where Element == DownloadedPackage {
-
- func unpack(_ completion: @escaping (([URL]) -> Void)) throws {
- guard count > 0 else {
- completion([])
- return
- }
- var uncompressedFileUrls = [URL]()
- do {
- for idx in (0.. UInt32 {
- let date = Calendar.current.date(byAdding: .hour, value: -Constants.exposureLifetimeHours, to: Date())!
- return ENTemporaryExposureKey.rollingStartNumber(date)
- }
-
- func current() -> [ENTemporaryExposureKey] {
- filter { $0.rollingStartNumber > self.minRollingStartNumber() }
- }
-
-}
-
-extension Array where Element == URL {
-
- func cleanup() {
- forEach { try? FileManager.default.removeItem(at: $0) }
- }
-
-}
-
-private extension String {
- static let binPath: String = "/export.bin"
- static let sigPath: String = "/export.sig"
-}
diff --git a/ios/BT/Extensions/Foundation/Date+Extensions.swift b/ios/BT/Extensions/Foundation/Date+Extensions.swift
deleted file mode 100644
index 6bed35281e..0000000000
--- a/ios/BT/Extensions/Foundation/Date+Extensions.swift
+++ /dev/null
@@ -1,10 +0,0 @@
-extension Date {
- var posixRepresentation: Int {
- Int(timeIntervalSince1970) * 1000
- }
-
- static func hourDifference(from startDate: Date, to endDate: Date) -> Int {
- Calendar.current.dateComponents([.hour], from: startDate, to: endDate).hour ?? 0
- }
-
-}
diff --git a/ios/BT/Extensions/Foundation/Encodable+Extensions.swift b/ios/BT/Extensions/Foundation/Encodable+Extensions.swift
deleted file mode 100644
index d6839d74d4..0000000000
--- a/ios/BT/Extensions/Foundation/Encodable+Extensions.swift
+++ /dev/null
@@ -1,7 +0,0 @@
-extension Encodable {
- func jsonStringRepresentation() -> String {
- let encodedValue = try! JSONEncoder().encode(self)
- let string = String(data: encodedValue, encoding: .utf8)!
- return string
- }
-}
diff --git a/ios/BT/Extensions/Foundation/List+Extensions.swift b/ios/BT/Extensions/Foundation/List+Extensions.swift
deleted file mode 100644
index ecb08390b6..0000000000
--- a/ios/BT/Extensions/Foundation/List+Extensions.swift
+++ /dev/null
@@ -1,8 +0,0 @@
-import RealmSwift
-
-extension List where Element: Encodable {
- public func encode(to coder: Encoder) throws {
- var container = coder.unkeyedContainer()
- try container.encode(contentsOf: self)
- }
-}
diff --git a/ios/BT/Extensions/Foundation/Notification+Extensions.swift b/ios/BT/Extensions/Foundation/Notification+Extensions.swift
deleted file mode 100644
index d9b286a561..0000000000
--- a/ios/BT/Extensions/Foundation/Notification+Extensions.swift
+++ /dev/null
@@ -1,20 +0,0 @@
-extension Notification.Name {
- public static let StorageTestResultsDidChange = Notification.Name(rawValue: "BTSecureStorageTestResultsDidChange")
- public static let StorageExposureDetectionErrorLocalizedDescriptionDidChange = Notification.Name(rawValue: "BTSecureStorageExposureDetectionErrorLocalizedDescriptionDidChange")
- public static let dateLastPerformedFileCapacityResetDidChange = Notification.Name(rawValue: "BTSecureStorageDateLastPerformedExposureDetectionDidChange")
- public static let HMACKeyDidChange = Notification.Name(rawValue: "BTSecureStorageHMACKeyDidChange")
- public static let ExposuresDidChange = Notification.Name(rawValue: "onExposureRecordUpdated")
- public static let AuthorizationStatusDidChange = Notification.Name(rawValue: "onEnabledStatusUpdated")
- public static let remainingDailyFileProcessingCapacityDidChange = Notification.Name(rawValue: "remainingDailyFileProcessingCapacityDidChange")
- public static let UrlOfMostRecentlyDetectedKeyFileDidChange = Notification.Name(rawValue: "UrlOfMostRecentlyDetectedKeyFileDidChange")
-}
-
-extension Notification {
-
- public enum UserInfoKey {
- public static let enabledState = "enabledState"
- public static let authorizationState = "authorizationState"
- }
-
-}
-
diff --git a/ios/BT/Extensions/Foundation/String+Extensions.swift b/ios/BT/Extensions/Foundation/String+Extensions.swift
deleted file mode 100644
index 274c6c4a91..0000000000
--- a/ios/BT/Extensions/Foundation/String+Extensions.swift
+++ /dev/null
@@ -1,54 +0,0 @@
-import Foundation
-
-extension String {
-
- static let `default` = ""
-
- // EN
- static let notAuthorized = "notAuthorized"
- static let authorized = "authorized"
-
- // Realm
- static let remainingDailyFileProcessingCapacity = "remainingDailyFileProcessingCapacity"
- static let urlOfMostRecentlyDetectedKeyFile = "urlOfMostRecentlyDetectedKeyFile"
-
- // Persisted
- static let keyPathTestResults = "testResults"
- static let keyPathExposureDetectionErrorLocalizedDescription = "exposureDetectionErrorLocalizedDescription"
- static let keyPathdateLastPerformedFileCapacityReset = "dateLastPerformedFileCapacityReset"
- static let keyPathExposures = "exposures"
- static let keyPathHMACKey = "HMACKey"
-
- // .env
- static let postKeysUrl = "POST_DIAGNOSIS_KEYS_URL"
- static let downloadBaseUrl = "DOWNLOAD_BASE_URL"
- static let downloadPath = "DOWNLOAD_PATH"
- static let hmackey = "HMAC_KEY"
-
- // Notifications
- static let bluetoothNotificationTitle = "Bluetooth Off"
- static let bluetoothNotificationBody = "You must enable bluetooth to receive Exposure Notifications."
- static let bluetoothNotificationIdentifier = "bluetooth-off"
- static let exposureDetectionErrorNotificationTitle = "Error Detecting Exposures"
- static let exposureDetectionErrorNotificationBody = "An error occurred while attempting to detect exposures."
- static let newExposureNotificationBody = "Someone you were near recently has been diagnosed with COVID-19. Tap for more details."
- static let exposureDetectionErrorNotificationIdentifier = "expososure-notification-error"
-
- // JS Layer
- static let genericSuccess = "success"
-
- // ErrorCodes
- static let networkFailure = "network_request_error"
- static let noExposureKeysFound = "no_exposure_keys_found"
- static let detectionNeverPerformed = "no_last_detection_date"
-
- // Computed Properties
- var gaenFilePaths: [String] {
- split(separator: "\n").map { String($0) }
- }
-
- var localized: String {
- NSLocalizedString(self, comment: .default)
- }
-
-}
diff --git a/ios/BT/Extensions/Other/ExposureManager+Extensions.swift b/ios/BT/Extensions/Other/ExposureManager+Extensions.swift
deleted file mode 100644
index ce7c8202d7..0000000000
--- a/ios/BT/Extensions/Other/ExposureManager+Extensions.swift
+++ /dev/null
@@ -1,64 +0,0 @@
-import ExposureNotification
-import Foundation
-import RealmSwift
-
-extension ExposureManager {
-
- @objc func handleDebugAction(_ action: DebugAction,
- resolve: @escaping RCTPromiseResolveBlock,
- reject: @escaping RCTPromiseRejectBlock) {
- switch action {
- case .fetchDiagnosisKeys:
- manager.getDiagnosisKeys { (keys, error) in
- if let error = error {
- reject(error.localizedDescription, "Failed to get exposure keys", error)
- } else {
- resolve(keys!.map { $0.asDictionary })
- }
- }
- case .detectExposuresNow:
- guard BTSecureStorage.shared.userState.remainingDailyFileProcessingCapacity > 0 else {
- let hoursRemaining = 24 - Date.hourDifference(from: BTSecureStorage.shared.userState.dateLastPerformedFileCapacityReset ?? Date(), to: Date())
- reject("Time window Error.", "You have reached the exposure file submission limit. Please wait \(hoursRemaining) hours before detecting exposures again.", GenericError.unknown)
- return
- }
-
- detectExposures { result in
- switch result {
- case .success(let numberOfFilesProcessed):
- resolve("Exposure detection successfully executed. Processed \(numberOfFilesProcessed) files.")
- case .failure(let exposureError):
- reject(exposureError.localizedDescription, exposureError.errorDescription, exposureError)
- }
- }
- case .simulateExposureDetectionError:
- BTSecureStorage.shared.exposureDetectionErrorLocalizedDescription = "Unable to connect to server."
- ExposureManager.shared.postExposureDetectionErrorNotification("Simulated Error")
- resolve(String.genericSuccess)
- case .simulateExposure:
- let exposure = Exposure(id: UUID().uuidString,
- date: Date().posixRepresentation - Int(TimeInterval.random(in: 0...13)) * 24 * 60 * 60 * 1000,
- duration: TimeInterval(1),
- totalRiskScore: .random(in: 1...8),
- transmissionRiskLevel: .random(in: 0...7))
- BTSecureStorage.shared.storeExposures([exposure])
- resolve("Exposures: \(BTSecureStorage.shared.userState.exposures)")
- case .fetchExposures:
- resolve(currentExposures)
- case .getAndPostDiagnosisKeys:
- getAndPostDiagnosisKeys(certificate: .default, HMACKey: .default, resolve: resolve, reject: reject)
- case .resetExposures:
- BTSecureStorage.shared.exposures = List()
- resolve("Exposures: \(BTSecureStorage.shared.exposures.count)")
- case .toggleENAuthorization:
- let enabled = manager.exposureNotificationEnabled ? false : true
- requestExposureNotificationAuthorization(enabled: enabled) { result in
- resolve("EN Enabled: \(self.manager.exposureNotificationEnabled)")
- }
- case .showLastProcessedFilePath:
- let path = BTSecureStorage.shared.userState.urlOfMostRecentlyDetectedKeyFile
- resolve(path)
- }
- }
-
-}
diff --git a/ios/BT/Images.xcassets/AppIcon.appiconset/Contents.json b/ios/BT/Images.xcassets/AppIcon.appiconset/Contents.json
deleted file mode 100644
index f3cbfbed15..0000000000
--- a/ios/BT/Images.xcassets/AppIcon.appiconset/Contents.json
+++ /dev/null
@@ -1,62 +0,0 @@
-{
- "images" : [
- {
- "filename" : "bt-ios-icon-20@2x.png",
- "idiom" : "iphone",
- "scale" : "2x",
- "size" : "20x20"
- },
- {
- "filename" : "bt-ios-icon-20@3x.png",
- "idiom" : "iphone",
- "scale" : "3x",
- "size" : "20x20"
- },
- {
- "filename" : "bt-ios-icon-29@2x.png",
- "idiom" : "iphone",
- "scale" : "2x",
- "size" : "29x29"
- },
- {
- "filename" : "bt-ios-icon-29@3x.png",
- "idiom" : "iphone",
- "scale" : "3x",
- "size" : "29x29"
- },
- {
- "filename" : "bt-ios-icon-40@2x.png",
- "idiom" : "iphone",
- "scale" : "2x",
- "size" : "40x40"
- },
- {
- "filename" : "bt-ios-icon-40@3x.png",
- "idiom" : "iphone",
- "scale" : "3x",
- "size" : "40x40"
- },
- {
- "filename" : "bt-ios-icon-60@2x.png",
- "idiom" : "iphone",
- "scale" : "2x",
- "size" : "60x60"
- },
- {
- "filename" : "bt-ios-icon-60@3x.png",
- "idiom" : "iphone",
- "scale" : "3x",
- "size" : "60x60"
- },
- {
- "filename" : "bt-ios-icon-1024@1x.png",
- "idiom" : "ios-marketing",
- "scale" : "1x",
- "size" : "1024x1024"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/ios/BT/Images.xcassets/AppIcon.appiconset/bt-ios-icon-1024@1x.png b/ios/BT/Images.xcassets/AppIcon.appiconset/bt-ios-icon-1024@1x.png
deleted file mode 100644
index e71db06ce3..0000000000
Binary files a/ios/BT/Images.xcassets/AppIcon.appiconset/bt-ios-icon-1024@1x.png and /dev/null differ
diff --git a/ios/BT/Images.xcassets/AppIcon.appiconset/bt-ios-icon-20@2x.png b/ios/BT/Images.xcassets/AppIcon.appiconset/bt-ios-icon-20@2x.png
deleted file mode 100644
index 843ae3dba8..0000000000
Binary files a/ios/BT/Images.xcassets/AppIcon.appiconset/bt-ios-icon-20@2x.png and /dev/null differ
diff --git a/ios/BT/Images.xcassets/AppIcon.appiconset/bt-ios-icon-20@3x.png b/ios/BT/Images.xcassets/AppIcon.appiconset/bt-ios-icon-20@3x.png
deleted file mode 100644
index 270a2e7497..0000000000
Binary files a/ios/BT/Images.xcassets/AppIcon.appiconset/bt-ios-icon-20@3x.png and /dev/null differ
diff --git a/ios/BT/Images.xcassets/AppIcon.appiconset/bt-ios-icon-29@2x.png b/ios/BT/Images.xcassets/AppIcon.appiconset/bt-ios-icon-29@2x.png
deleted file mode 100644
index 23a1b687e8..0000000000
Binary files a/ios/BT/Images.xcassets/AppIcon.appiconset/bt-ios-icon-29@2x.png and /dev/null differ
diff --git a/ios/BT/Images.xcassets/AppIcon.appiconset/bt-ios-icon-29@3x.png b/ios/BT/Images.xcassets/AppIcon.appiconset/bt-ios-icon-29@3x.png
deleted file mode 100644
index b02241f07d..0000000000
Binary files a/ios/BT/Images.xcassets/AppIcon.appiconset/bt-ios-icon-29@3x.png and /dev/null differ
diff --git a/ios/BT/Images.xcassets/AppIcon.appiconset/bt-ios-icon-40@2x.png b/ios/BT/Images.xcassets/AppIcon.appiconset/bt-ios-icon-40@2x.png
deleted file mode 100644
index e5c3f49fa3..0000000000
Binary files a/ios/BT/Images.xcassets/AppIcon.appiconset/bt-ios-icon-40@2x.png and /dev/null differ
diff --git a/ios/BT/Images.xcassets/AppIcon.appiconset/bt-ios-icon-40@3x.png b/ios/BT/Images.xcassets/AppIcon.appiconset/bt-ios-icon-40@3x.png
deleted file mode 100644
index 1de297a0f1..0000000000
Binary files a/ios/BT/Images.xcassets/AppIcon.appiconset/bt-ios-icon-40@3x.png and /dev/null differ
diff --git a/ios/BT/Images.xcassets/AppIcon.appiconset/bt-ios-icon-60@2x.png b/ios/BT/Images.xcassets/AppIcon.appiconset/bt-ios-icon-60@2x.png
deleted file mode 100644
index 1c3d2b1d58..0000000000
Binary files a/ios/BT/Images.xcassets/AppIcon.appiconset/bt-ios-icon-60@2x.png and /dev/null differ
diff --git a/ios/BT/Images.xcassets/AppIcon.appiconset/bt-ios-icon-60@3x.png b/ios/BT/Images.xcassets/AppIcon.appiconset/bt-ios-icon-60@3x.png
deleted file mode 100644
index 27a5122725..0000000000
Binary files a/ios/BT/Images.xcassets/AppIcon.appiconset/bt-ios-icon-60@3x.png and /dev/null differ
diff --git a/ios/BT/Images.xcassets/AppIconDev.appiconset/Contents.json b/ios/BT/Images.xcassets/AppIconDev.appiconset/Contents.json
deleted file mode 100644
index f3cbfbed15..0000000000
--- a/ios/BT/Images.xcassets/AppIconDev.appiconset/Contents.json
+++ /dev/null
@@ -1,62 +0,0 @@
-{
- "images" : [
- {
- "filename" : "bt-ios-icon-20@2x.png",
- "idiom" : "iphone",
- "scale" : "2x",
- "size" : "20x20"
- },
- {
- "filename" : "bt-ios-icon-20@3x.png",
- "idiom" : "iphone",
- "scale" : "3x",
- "size" : "20x20"
- },
- {
- "filename" : "bt-ios-icon-29@2x.png",
- "idiom" : "iphone",
- "scale" : "2x",
- "size" : "29x29"
- },
- {
- "filename" : "bt-ios-icon-29@3x.png",
- "idiom" : "iphone",
- "scale" : "3x",
- "size" : "29x29"
- },
- {
- "filename" : "bt-ios-icon-40@2x.png",
- "idiom" : "iphone",
- "scale" : "2x",
- "size" : "40x40"
- },
- {
- "filename" : "bt-ios-icon-40@3x.png",
- "idiom" : "iphone",
- "scale" : "3x",
- "size" : "40x40"
- },
- {
- "filename" : "bt-ios-icon-60@2x.png",
- "idiom" : "iphone",
- "scale" : "2x",
- "size" : "60x60"
- },
- {
- "filename" : "bt-ios-icon-60@3x.png",
- "idiom" : "iphone",
- "scale" : "3x",
- "size" : "60x60"
- },
- {
- "filename" : "bt-ios-icon-1024@1x.png",
- "idiom" : "ios-marketing",
- "scale" : "1x",
- "size" : "1024x1024"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/ios/BT/Images.xcassets/AppIconDev.appiconset/bt-ios-icon-1024@1x.png b/ios/BT/Images.xcassets/AppIconDev.appiconset/bt-ios-icon-1024@1x.png
deleted file mode 100644
index e71db06ce3..0000000000
Binary files a/ios/BT/Images.xcassets/AppIconDev.appiconset/bt-ios-icon-1024@1x.png and /dev/null differ
diff --git a/ios/BT/Images.xcassets/AppIconDev.appiconset/bt-ios-icon-20@2x.png b/ios/BT/Images.xcassets/AppIconDev.appiconset/bt-ios-icon-20@2x.png
deleted file mode 100644
index 843ae3dba8..0000000000
Binary files a/ios/BT/Images.xcassets/AppIconDev.appiconset/bt-ios-icon-20@2x.png and /dev/null differ
diff --git a/ios/BT/Images.xcassets/AppIconDev.appiconset/bt-ios-icon-20@3x.png b/ios/BT/Images.xcassets/AppIconDev.appiconset/bt-ios-icon-20@3x.png
deleted file mode 100644
index 270a2e7497..0000000000
Binary files a/ios/BT/Images.xcassets/AppIconDev.appiconset/bt-ios-icon-20@3x.png and /dev/null differ
diff --git a/ios/BT/Images.xcassets/AppIconDev.appiconset/bt-ios-icon-29@2x.png b/ios/BT/Images.xcassets/AppIconDev.appiconset/bt-ios-icon-29@2x.png
deleted file mode 100644
index 23a1b687e8..0000000000
Binary files a/ios/BT/Images.xcassets/AppIconDev.appiconset/bt-ios-icon-29@2x.png and /dev/null differ
diff --git a/ios/BT/Images.xcassets/AppIconDev.appiconset/bt-ios-icon-29@3x.png b/ios/BT/Images.xcassets/AppIconDev.appiconset/bt-ios-icon-29@3x.png
deleted file mode 100644
index b02241f07d..0000000000
Binary files a/ios/BT/Images.xcassets/AppIconDev.appiconset/bt-ios-icon-29@3x.png and /dev/null differ
diff --git a/ios/BT/Images.xcassets/AppIconDev.appiconset/bt-ios-icon-40@2x.png b/ios/BT/Images.xcassets/AppIconDev.appiconset/bt-ios-icon-40@2x.png
deleted file mode 100644
index e5c3f49fa3..0000000000
Binary files a/ios/BT/Images.xcassets/AppIconDev.appiconset/bt-ios-icon-40@2x.png and /dev/null differ
diff --git a/ios/BT/Images.xcassets/AppIconDev.appiconset/bt-ios-icon-40@3x.png b/ios/BT/Images.xcassets/AppIconDev.appiconset/bt-ios-icon-40@3x.png
deleted file mode 100644
index 1de297a0f1..0000000000
Binary files a/ios/BT/Images.xcassets/AppIconDev.appiconset/bt-ios-icon-40@3x.png and /dev/null differ
diff --git a/ios/BT/Images.xcassets/AppIconDev.appiconset/bt-ios-icon-60@2x.png b/ios/BT/Images.xcassets/AppIconDev.appiconset/bt-ios-icon-60@2x.png
deleted file mode 100644
index 1c3d2b1d58..0000000000
Binary files a/ios/BT/Images.xcassets/AppIconDev.appiconset/bt-ios-icon-60@2x.png and /dev/null differ
diff --git a/ios/BT/Images.xcassets/AppIconDev.appiconset/bt-ios-icon-60@3x.png b/ios/BT/Images.xcassets/AppIconDev.appiconset/bt-ios-icon-60@3x.png
deleted file mode 100644
index 27a5122725..0000000000
Binary files a/ios/BT/Images.xcassets/AppIconDev.appiconset/bt-ios-icon-60@3x.png and /dev/null differ
diff --git a/ios/BT/Images.xcassets/AppIconStaging.appiconset/Contents.json b/ios/BT/Images.xcassets/AppIconStaging.appiconset/Contents.json
deleted file mode 100644
index 52a59612db..0000000000
--- a/ios/BT/Images.xcassets/AppIconStaging.appiconset/Contents.json
+++ /dev/null
@@ -1,62 +0,0 @@
-{
- "images" : [
- {
- "size" : "20x20",
- "idiom" : "iphone",
- "filename" : "bt-ios-icon-20@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "20x20",
- "idiom" : "iphone",
- "filename" : "bt-ios-icon-20@3x.png",
- "scale" : "3x"
- },
- {
- "size" : "29x29",
- "idiom" : "iphone",
- "filename" : "bt-ios-icon-29@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "29x29",
- "idiom" : "iphone",
- "filename" : "bt-ios-icon-29@3x.png",
- "scale" : "3x"
- },
- {
- "size" : "40x40",
- "idiom" : "iphone",
- "filename" : "bt-ios-icon-40@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "40x40",
- "idiom" : "iphone",
- "filename" : "bt-ios-icon-40@3x.png",
- "scale" : "3x"
- },
- {
- "size" : "60x60",
- "idiom" : "iphone",
- "filename" : "bt-ios-icon-60@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "60x60",
- "idiom" : "iphone",
- "filename" : "bt-ios-icon-60@3x.png",
- "scale" : "3x"
- },
- {
- "size" : "1024x1024",
- "idiom" : "ios-marketing",
- "filename" : "bt-ios-icon-1024@1x.png",
- "scale" : "1x"
- }
- ],
- "info" : {
- "version" : 1,
- "author" : "xcode"
- }
-}
\ No newline at end of file
diff --git a/ios/BT/Images.xcassets/AppIconStaging.appiconset/bt-ios-icon-1024@1x.png b/ios/BT/Images.xcassets/AppIconStaging.appiconset/bt-ios-icon-1024@1x.png
deleted file mode 100644
index e71db06ce3..0000000000
Binary files a/ios/BT/Images.xcassets/AppIconStaging.appiconset/bt-ios-icon-1024@1x.png and /dev/null differ
diff --git a/ios/BT/Images.xcassets/AppIconStaging.appiconset/bt-ios-icon-20@2x.png b/ios/BT/Images.xcassets/AppIconStaging.appiconset/bt-ios-icon-20@2x.png
deleted file mode 100644
index 843ae3dba8..0000000000
Binary files a/ios/BT/Images.xcassets/AppIconStaging.appiconset/bt-ios-icon-20@2x.png and /dev/null differ
diff --git a/ios/BT/Images.xcassets/AppIconStaging.appiconset/bt-ios-icon-20@3x.png b/ios/BT/Images.xcassets/AppIconStaging.appiconset/bt-ios-icon-20@3x.png
deleted file mode 100644
index 270a2e7497..0000000000
Binary files a/ios/BT/Images.xcassets/AppIconStaging.appiconset/bt-ios-icon-20@3x.png and /dev/null differ
diff --git a/ios/BT/Images.xcassets/AppIconStaging.appiconset/bt-ios-icon-29@2x.png b/ios/BT/Images.xcassets/AppIconStaging.appiconset/bt-ios-icon-29@2x.png
deleted file mode 100644
index 23a1b687e8..0000000000
Binary files a/ios/BT/Images.xcassets/AppIconStaging.appiconset/bt-ios-icon-29@2x.png and /dev/null differ
diff --git a/ios/BT/Images.xcassets/AppIconStaging.appiconset/bt-ios-icon-29@3x.png b/ios/BT/Images.xcassets/AppIconStaging.appiconset/bt-ios-icon-29@3x.png
deleted file mode 100644
index b02241f07d..0000000000
Binary files a/ios/BT/Images.xcassets/AppIconStaging.appiconset/bt-ios-icon-29@3x.png and /dev/null differ
diff --git a/ios/BT/Images.xcassets/AppIconStaging.appiconset/bt-ios-icon-40@2x.png b/ios/BT/Images.xcassets/AppIconStaging.appiconset/bt-ios-icon-40@2x.png
deleted file mode 100644
index e5c3f49fa3..0000000000
Binary files a/ios/BT/Images.xcassets/AppIconStaging.appiconset/bt-ios-icon-40@2x.png and /dev/null differ
diff --git a/ios/BT/Images.xcassets/AppIconStaging.appiconset/bt-ios-icon-40@3x.png b/ios/BT/Images.xcassets/AppIconStaging.appiconset/bt-ios-icon-40@3x.png
deleted file mode 100644
index 1de297a0f1..0000000000
Binary files a/ios/BT/Images.xcassets/AppIconStaging.appiconset/bt-ios-icon-40@3x.png and /dev/null differ
diff --git a/ios/BT/Images.xcassets/AppIconStaging.appiconset/bt-ios-icon-60@2x.png b/ios/BT/Images.xcassets/AppIconStaging.appiconset/bt-ios-icon-60@2x.png
deleted file mode 100644
index 1c3d2b1d58..0000000000
Binary files a/ios/BT/Images.xcassets/AppIconStaging.appiconset/bt-ios-icon-60@2x.png and /dev/null differ
diff --git a/ios/BT/Images.xcassets/AppIconStaging.appiconset/bt-ios-icon-60@3x.png b/ios/BT/Images.xcassets/AppIconStaging.appiconset/bt-ios-icon-60@3x.png
deleted file mode 100644
index 27a5122725..0000000000
Binary files a/ios/BT/Images.xcassets/AppIconStaging.appiconset/bt-ios-icon-60@3x.png and /dev/null differ
diff --git a/ios/BT/Images.xcassets/BgImage.imageset/Contents.json b/ios/BT/Images.xcassets/BgImage.imageset/Contents.json
deleted file mode 100644
index 0b5c985d83..0000000000
--- a/ios/BT/Images.xcassets/BgImage.imageset/Contents.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "images" : [
- {
- "filename" : "bgImage.png",
- "idiom" : "universal",
- "scale" : "1x"
- },
- {
- "filename" : "bgImage@2x.png",
- "idiom" : "universal",
- "scale" : "2x"
- },
- {
- "filename" : "bgImage@3x.png",
- "idiom" : "universal",
- "scale" : "3x"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/ios/BT/Images.xcassets/BgImage.imageset/bgImage.png b/ios/BT/Images.xcassets/BgImage.imageset/bgImage.png
deleted file mode 100644
index f9d90578b3..0000000000
Binary files a/ios/BT/Images.xcassets/BgImage.imageset/bgImage.png and /dev/null differ
diff --git a/ios/BT/Images.xcassets/BgImage.imageset/bgImage@2x.png b/ios/BT/Images.xcassets/BgImage.imageset/bgImage@2x.png
deleted file mode 100644
index b124988376..0000000000
Binary files a/ios/BT/Images.xcassets/BgImage.imageset/bgImage@2x.png and /dev/null differ
diff --git a/ios/BT/Images.xcassets/BgImage.imageset/bgImage@3x.png b/ios/BT/Images.xcassets/BgImage.imageset/bgImage@3x.png
deleted file mode 100644
index 840c4242d4..0000000000
Binary files a/ios/BT/Images.xcassets/BgImage.imageset/bgImage@3x.png and /dev/null differ
diff --git a/ios/BT/Images.xcassets/logoImage.imageset/Contents.json b/ios/BT/Images.xcassets/logoImage.imageset/Contents.json
deleted file mode 100644
index fc1189127b..0000000000
--- a/ios/BT/Images.xcassets/logoImage.imageset/Contents.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "images" : [
- {
- "filename" : "bt-logo-512.png",
- "idiom" : "universal",
- "scale" : "1x"
- },
- {
- "filename" : "bt-logo-512@2x.png",
- "idiom" : "universal",
- "scale" : "2x"
- },
- {
- "filename" : "bt-logo-512@3x.png",
- "idiom" : "universal",
- "scale" : "3x"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/ios/BT/Images.xcassets/logoImage.imageset/bt-logo-512.png b/ios/BT/Images.xcassets/logoImage.imageset/bt-logo-512.png
deleted file mode 100644
index 7f9fe2f6b3..0000000000
Binary files a/ios/BT/Images.xcassets/logoImage.imageset/bt-logo-512.png and /dev/null differ
diff --git a/ios/BT/Images.xcassets/logoImage.imageset/bt-logo-512@2x.png b/ios/BT/Images.xcassets/logoImage.imageset/bt-logo-512@2x.png
deleted file mode 100644
index 81e274c429..0000000000
Binary files a/ios/BT/Images.xcassets/logoImage.imageset/bt-logo-512@2x.png and /dev/null differ
diff --git a/ios/BT/Images.xcassets/logoImage.imageset/bt-logo-512@3x.png b/ios/BT/Images.xcassets/logoImage.imageset/bt-logo-512@3x.png
deleted file mode 100644
index 038fc0224f..0000000000
Binary files a/ios/BT/Images.xcassets/logoImage.imageset/bt-logo-512@3x.png and /dev/null differ
diff --git a/ios/BT/Info.plist b/ios/BT/Info.plist
deleted file mode 100644
index 7a1f58885c..0000000000
--- a/ios/BT/Info.plist
+++ /dev/null
@@ -1,104 +0,0 @@
-
-
-
-
- BGTaskSchedulerPermittedIdentifiers
-
- com.transistorsoft.fetch
- $(PRODUCT_BUNDLE_IDENTIFIER).exposure-notification
-
- CFBundleDevelopmentRegion
- en
- CFBundleDisplayName
- PathCheck BT
- CFBundleExecutable
- $(EXECUTABLE_NAME)
- CFBundleIdentifier
- $(PRODUCT_BUNDLE_IDENTIFIER)
- CFBundleInfoDictionaryVersion
- 6.0
- CFBundleName
- $(PRODUCT_NAME)
- CFBundlePackageType
- APPL
- CFBundleShortVersionString
- $(MARKETING_VERSION)
- CFBundleSignature
- ????
- CFBundleVersion
- $(CURRENT_PROJECT_VERSION)
- LSApplicationCategoryType
-
- LSApplicationQueriesSchemes
-
- itms-apps
-
- LSRequiresIPhoneOS
-
- NSAppTransportSecurity
-
- NSAllowsArbitraryLoads
-
- NSExceptionDomains
-
-
- NSCameraUsageDescription
- To simulate sharing diagnosis keys between a central server by scanning QR codes.
- NSMainNibFile
- LaunchScreen
- UIAppFonts
-
- IBMPlexSans-Bold.ttf
- IBMPlexSans-BoldItalic.ttf
- IBMPlexSans-ExtraLight.ttf
- IBMPlexSans-ExtraLightItalic.ttf
- IBMPlexSans-Italic.ttf
- IBMPlexSans-Light.ttf
- IBMPlexSans-LightItalic.ttf
- IBMPlexSans-Medium.ttf
- IBMPlexSans-MediumItalic.ttf
- IBMPlexSans.ttf
- IBMPlexSans-SemiBold.ttf
- IBMPlexSans-SemiBoldItalic.ttf
- IBMPlexSans-Thin.ttf
- IBMPlexSans-ThinItalic.ttf
- IBMPlexMono-Bold.ttf
- IBMPlexMono-BoldItalic.ttf
- IBMPlexMono-ExtraLight.ttf
- IBMPlexMono-ExtraLightItalic.ttf
- IBMPlexMono-Italic.ttf
- IBMPlexMono-Light.ttf
- IBMPlexMono-LightItalic.ttf
- IBMPlexMono-Medium.ttf
- IBMPlexMono-MediumItalic.ttf
- IBMPlexMono.ttf
- IBMPlexMono-SemiBold.ttf
- IBMPlexMono-SemiBoldItalic.ttf
- IBMPlexMono-Thin.ttf
- IBMPlexMono-ThinItalic.ttf
-
- UIBackgroundModes
-
- fetch
- processing
-
- UILaunchStoryboardName
- LaunchScreen
- UIRequiredDeviceCapabilities
-
- armv7
- bluetooth-le
- telephony
-
- UIStatusBarStyle
- UIStatusBarStyleLightContent
- UISupportedInterfaceOrientations
-
- UIInterfaceOrientationPortrait
-
- UIUserInterfaceStyle
- Light
- UIViewControllerBasedStatusBarAppearance
-
-
-
diff --git a/ios/BT/Storage/BTSecureStorage.swift b/ios/BT/Storage/BTSecureStorage.swift
deleted file mode 100644
index 3d0688183c..0000000000
--- a/ios/BT/Storage/BTSecureStorage.swift
+++ /dev/null
@@ -1,102 +0,0 @@
-import ExposureNotification
-import Foundation
-import RealmSwift
-
-final class BTSecureStorage: SafePathsSecureStorage {
-
- static let shared = BTSecureStorage(inMemory: false)
-
- override var keychainIdentifier: String {
- "\(Bundle.main.bundleIdentifier!).realm"
- }
-
- private lazy var realmConfig: Realm.Configuration = {
- guard let realmConfig = getRealmConfig() else {
- fatalError("Missing realm configuration")
- }
- return realmConfig
- }()
-
- override init(inMemory: Bool = false) {
- super.init(inMemory: inMemory)
- if !userStateExists {
- resetUserState({ _ in })
- }
- }
-
- override func getRealmConfig() -> Realm.Configuration? {
- if let key = getEncryptionKey() {
- if (inMemory) {
- return Realm.Configuration(inMemoryIdentifier: identifier, encryptionKey: key as Data, schemaVersion: 4,
- migrationBlock: { _, _ in }, objectTypes: [UserState.self, Exposure.self])
- } else {
- return Realm.Configuration(encryptionKey: key as Data, schemaVersion: 4,
- migrationBlock: { _, _ in }, objectTypes: [UserState.self, Exposure.self])
- }
- } else {
- return nil
- }
- }
-
- var userState: UserState {
- let realm = try! Realm(configuration: realmConfig)
- return realm.object(ofType: UserState.self, forPrimaryKey: 0) ?? UserState()
- }
-
- var userStateExists: Bool {
- let realm = try! Realm(configuration: realmConfig)
- return realm.object(ofType: UserState.self, forPrimaryKey: 0) != nil
- }
-
- func setUserValue(value: Value, keyPath: String, notificationName: Notification.Name) {
- let realm = try! Realm(configuration: realmConfig)
- try! realm.write {
- realm.create(UserState.self, value: [keyPath: value], update: .modified)
- let jsonString = value.jsonStringRepresentation()
- NotificationCenter.default.post(name: notificationName, object: jsonString)
- }
- }
-
- func resetUserState(_ completion: ((UserState) -> Void)) {
- guard let realmConfig = getRealmConfig() else {
- return
- }
- let realm = try! Realm(configuration: realmConfig)
- try! realm.write {
- let userState = UserState()
- realm.add(userState, update: .modified)
- completion(userState)
- }
- }
-
- func storeExposures(_ exposures: [Exposure]) {
- let realm = try! Realm(configuration: realmConfig)
- try! realm.write {
- userState.exposures.append(objectsIn: exposures)
- let jsonString = userState.exposures.jsonStringRepresentation()
- NotificationCenter.default.post(name: .ExposuresDidChange, object: jsonString)
- }
- }
-
- @Persisted(keyPath: .remainingDailyFileProcessingCapacity, notificationName: .remainingDailyFileProcessingCapacityDidChange, defaultValue: Constants.dailyFileProcessingCapacity)
- var remainingDailyFileProcessingCapacity: Int
-
- @Persisted(keyPath: .urlOfMostRecentlyDetectedKeyFile, notificationName: .UrlOfMostRecentlyDetectedKeyFileDidChange, defaultValue: .default)
- var urlOfMostRecentlyDetectedKeyFile: String
-
- @Persisted(keyPath: .keyPathExposures, notificationName: .ExposuresDidChange, defaultValue: List())
- var exposures: List
-
- @Persisted(keyPath: .keyPathdateLastPerformedFileCapacityReset,
- notificationName: .dateLastPerformedFileCapacityResetDidChange, defaultValue: nil)
- var dateLastPerformedFileCapacityReset: Date?
-
- @Persisted(keyPath: .keyPathHMACKey,
- notificationName: .HMACKeyDidChange, defaultValue: "")
- var HMACKey: String
-
- @Persisted(keyPath: .keyPathExposureDetectionErrorLocalizedDescription, notificationName:
- .StorageExposureDetectionErrorLocalizedDescriptionDidChange, defaultValue: .default)
- var exposureDetectionErrorLocalizedDescription: String
-
-}
diff --git a/ios/BT/Storage/Persisted.swift b/ios/BT/Storage/Persisted.swift
deleted file mode 100644
index bed17c777f..0000000000
--- a/ios/BT/Storage/Persisted.swift
+++ /dev/null
@@ -1,29 +0,0 @@
-import Foundation
-import RealmSwift
-
-@propertyWrapper
-class Persisted {
-
- init(keyPath: String, notificationName: Notification.Name, defaultValue: Value) {
- self.keyPath = keyPath
- self.notificationName = notificationName
- self.wrappedValue = defaultValue
- }
-
- let keyPath: String
- let notificationName: Notification.Name
-
- var wrappedValue: Value {
- didSet {
- BTSecureStorage.shared.setUserValue(value: wrappedValue, keyPath: keyPath, notificationName: notificationName)
- }
- }
-
- var projectedValue: Persisted { self }
-
- func addObserver(using block: @escaping () -> Void) -> NSObjectProtocol {
- return NotificationCenter.default.addObserver(forName: notificationName, object: nil, queue: nil) { _ in
- block()
- }
- }
-}
diff --git a/ios/BT/bridge/DebugMenuModule.m b/ios/BT/bridge/DebugMenuModule.m
deleted file mode 100644
index 521033c4f4..0000000000
--- a/ios/BT/bridge/DebugMenuModule.m
+++ /dev/null
@@ -1,78 +0,0 @@
-#import
-#import
-#import "BT-Swift.h"
-
-@interface DebugMenuModule: NSObject
-@end
-
-@implementation DebugMenuModule
-
-RCT_EXPORT_MODULE();
-
-RCT_REMAP_METHOD(fetchDiagnosisKeys,
- fetchDiagnosisKeysWithResolver:(RCTPromiseResolveBlock)resolve
- rejecter:(RCTPromiseRejectBlock)reject)
-{
- [[ExposureManager shared] handleDebugAction:DebugActionFetchDiagnosisKeys resolve:resolve reject:reject];
-}
-
-RCT_REMAP_METHOD(detectExposuresNow,
- detectExposuresNowWithResolver:(RCTPromiseResolveBlock)resolve
- rejecter:(RCTPromiseRejectBlock)reject)
-{
- [[ExposureManager shared] handleDebugAction:DebugActionDetectExposuresNow resolve:resolve reject:reject];
-}
-
-RCT_REMAP_METHOD(simulateExposureDetectionError,
- simulateExposureDetectionErrorWithResolver:(RCTPromiseResolveBlock)resolve
- rejecter:(RCTPromiseRejectBlock)reject)
-{
- [[ExposureManager shared] handleDebugAction:DebugActionSimulateExposureDetectionError resolve:resolve reject:reject];
-
-}
-
-RCT_REMAP_METHOD(simulateExposure,
- simulateExposureWithResolver:(RCTPromiseResolveBlock)resolve
- rejecter:(RCTPromiseRejectBlock)reject)
-{
- [[ExposureManager shared] handleDebugAction:DebugActionSimulateExposure resolve:resolve reject:reject];
-}
-
-
-RCT_REMAP_METHOD(fetchExposures,
- fetchExposuresWithResolver:(RCTPromiseResolveBlock)resolve
- rejecter:(RCTPromiseRejectBlock)reject)
-{
- [[ExposureManager shared] handleDebugAction:DebugActionSimulateExposure resolve:resolve reject:reject];
-}
-
-RCT_REMAP_METHOD(toggleExposureNotifications,
- toggleExposureNotificationsWithResolver:(RCTPromiseResolveBlock)resolve
- rejecter:(RCTPromiseRejectBlock)reject)
-{
- [[ExposureManager shared] handleDebugAction:DebugActionToggleENAuthorization resolve:resolve reject:reject];
-}
-
-RCT_REMAP_METHOD(resetExposures,
- resetExposuresWithResolver:(RCTPromiseResolveBlock)resolve
- rejecter:(RCTPromiseRejectBlock)reject)
-{
- [[ExposureManager shared] handleDebugAction:DebugActionResetExposures resolve:resolve reject:reject];
-}
-
-RCT_REMAP_METHOD(submitExposureKeys,
- submitExposureKeysResolver:(RCTPromiseResolveBlock)resolve
- rejecter:(RCTPromiseRejectBlock)reject)
-{
- [[ExposureManager shared] handleDebugAction:DebugActionGetAndPostDiagnosisKeys resolve:resolve reject:reject];
-}
-
-
-RCT_REMAP_METHOD(showLastProcessedFilePath,
- showLastProcessedFilePathResolver:(RCTPromiseResolveBlock)resolve
- rejecter:(RCTPromiseRejectBlock)reject)
-{
- [[ExposureManager shared] handleDebugAction:DebugActionShowLastProcessedFilePath resolve:resolve reject:reject];
-}
-
-@end
diff --git a/ios/BT/bridge/ENPermissionsModule.m b/ios/BT/bridge/ENPermissionsModule.m
deleted file mode 100644
index 3b479dbfd4..0000000000
--- a/ios/BT/bridge/ENPermissionsModule.m
+++ /dev/null
@@ -1,20 +0,0 @@
-#import
-#import
-#import "BT-Swift.h"
-
-@interface ENPermissionsModule: NSObject
-@end
-
-@implementation ENPermissionsModule
-
-RCT_EXPORT_MODULE();
-
-RCT_EXPORT_METHOD(requestExposureNotificationAuthorization: (RCTResponseSenderBlock)callback) {
- [[ExposureManager shared] requestExposureNotificationAuthorizationWithEnabled:YES callback:callback];
-}
-
-RCT_EXPORT_METHOD(getCurrentENPermissionsStatus: (RCTResponseSenderBlock)callback) {
- [[ExposureManager shared] getCurrentENPermissionsStatusWithCallback:callback];
-}
-
-@end
diff --git a/ios/BT/bridge/ExposureEventEmitter.m b/ios/BT/bridge/ExposureEventEmitter.m
deleted file mode 100644
index f469c35dc4..0000000000
--- a/ios/BT/bridge/ExposureEventEmitter.m
+++ /dev/null
@@ -1,59 +0,0 @@
-#import
-#import
-
-// Notification/Event Names
-NSString *const onEnabledStatusUpdated = @"onEnabledStatusUpdated";
-NSString *const onExposuresChanged = @"onExposureRecordUpdated";
-
-@interface ExposureEventEmitter : RCTEventEmitter
-@end
-
-@implementation ExposureEventEmitter
-
-+ (BOOL)requiresMainQueueSetup
-{
- return YES; // only do this if your module initialization relies on calling UIKit!
-}
-
-RCT_EXPORT_MODULE();
-
-- (instancetype)init
-{
- self = [super init];
- if (self) {
- [self startObserving];
- }
- return self;
-}
-
-
-- (NSArray *)supportedEvents {
- return @[
- onExposuresChanged,
- onEnabledStatusUpdated
- ];
-}
-
-- (void)startObserving {
- [self stopObserving];
- for (NSString *event in [self supportedEvents]) {
- [[NSNotificationCenter defaultCenter] addObserver:self
- selector:@selector(handleNotification:)
- name:event
- object:nil];
- }
-}
-
-- (void)stopObserving {
- [[NSNotificationCenter defaultCenter] removeObserver:self];
-}
-
-# pragma mark Private
-
-- (void)handleNotification:(NSNotification *)notification {
-
- [self sendEventWithName:notification.name body: notification.object];
-
-}
-
-@end
diff --git a/ios/BT/bridge/ExposureHistoryModule.m b/ios/BT/bridge/ExposureHistoryModule.m
deleted file mode 100644
index 3c868fe5cb..0000000000
--- a/ios/BT/bridge/ExposureHistoryModule.m
+++ /dev/null
@@ -1,24 +0,0 @@
-#import
-#import
-#import
-#import "BT-Swift.h"
-
-@interface ExposureHistoryModule: NSObject
-@end
-
-@implementation ExposureHistoryModule
-
-RCT_EXPORT_MODULE();
-
-RCT_EXPORT_METHOD(getCurrentExposures: (RCTResponseSenderBlock)callback) {
- callback(@[[[ExposureManager shared] currentExposures]]);
-}
-
-RCT_REMAP_METHOD(fetchLastDetectionDate,
- fetchLastDetectionDateWithResolver:(RCTPromiseResolveBlock)resolve
- rejecter:(RCTPromiseRejectBlock)reject)
-{
- [[ExposureManager shared] fetchLastDetectionDateWithResolve:resolve reject:reject];
-}
-
-@end
diff --git a/ios/BT/bridge/ExposureKeyModule.m b/ios/BT/bridge/ExposureKeyModule.m
deleted file mode 100644
index ad834f4492..0000000000
--- a/ios/BT/bridge/ExposureKeyModule.m
+++ /dev/null
@@ -1,30 +0,0 @@
-#import
-#import
-#import
-#import "BT-Swift.h"
-
-@interface ExposureKeyModule: NSObject
-@end
-
-@implementation ExposureKeyModule
-
-RCT_EXPORT_MODULE();
-
-RCT_REMAP_METHOD(fetchExposureKeys,
- fetchExposureKeysWithResolver:(RCTPromiseResolveBlock)resolve
- rejecter:(RCTPromiseRejectBlock)reject)
-{
- [[ExposureManager shared] fetchExposureKeysWithResolve:resolve reject:reject];
-}
-
-RCT_REMAP_METHOD(postDiagnosisKeys,
- certificate: (NSString *)certificate
- hmacKey: (NSString *)HMACKey
- resolver:(RCTPromiseResolveBlock)resolve
- rejecter:(RCTPromiseRejectBlock)reject)
-{
- [[ExposureManager shared] getAndPostDiagnosisKeysWithCertificate:certificate HMACKey:HMACKey resolve:resolve reject:reject];
-}
-
-
-@end
diff --git a/ios/BT/main.m b/ios/BT/main.m
deleted file mode 100644
index 5732e9a03a..0000000000
--- a/ios/BT/main.m
+++ /dev/null
@@ -1,18 +0,0 @@
-//
-// main.m
-// BT
-//
-// Created by John Schoeman on 5/28/20.
-// Copyright © 2020 Path Check Inc. All rights reserved.
-//
-
-#import
-
-#import "AppDelegate.h"
-
-int main(int argc, char * argv[]) {
- @autoreleasepool {
- return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
- }
-}
-
diff --git a/ios/BTTestsInfo.plist b/ios/BTTestsInfo.plist
deleted file mode 100644
index 66f61f3829..0000000000
--- a/ios/BTTestsInfo.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
-
- CFBundleDevelopmentRegion
- en
- CFBundleExecutable
- $(EXECUTABLE_NAME)
- CFBundleIdentifier
- $(PRODUCT_BUNDLE_IDENTIFIER)
- CFBundleInfoDictionaryVersion
- 6.0
- CFBundleName
- $(PRODUCT_NAME)
- CFBundlePackageType
- BNDL
- CFBundleShortVersionString
- 1.0.28
- CFBundleSignature
- ????
- CFBundleVersion
- 1.0.28
-
-
diff --git a/ios/COVIDSafePaths.xcodeproj/project.pbxproj b/ios/COVIDSafePaths.xcodeproj/project.pbxproj
index 119dc74f70..d82bb97d3d 100644
--- a/ios/COVIDSafePaths.xcodeproj/project.pbxproj
+++ b/ios/COVIDSafePaths.xcodeproj/project.pbxproj
@@ -9,7 +9,6 @@
/* Begin PBXBuildFile section */
00E356F31AD99517003FC87E /* COVIDSafePathsTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* COVIDSafePathsTests.m */; };
0814DA4E882656978623FE96 /* libPods-GPS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 6D04E3B4F6078718D8B62A9D /* libPods-GPS.a */; };
- 0835F8922441054A00E95AE3 /* RNBackgroundFetch+AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 0835F8902441054900E95AE3 /* RNBackgroundFetch+AppDelegate.m */; };
08445F4C24283AFF008754AC /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 08445F4B24283AFF008754AC /* Accelerate.framework */; };
08445F4E24283B0B008754AC /* CoreData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 08445F4D24283B0B008754AC /* CoreData.framework */; };
08445F50242849C1008754AC /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 08445F4F242849C1008754AC /* CoreGraphics.framework */; };
@@ -27,134 +26,51 @@
08445F6824284A52008754AC /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 08445F6724284A52008754AC /* UIKit.framework */; };
12922BC2C16E4BCCB3F4EA44 /* IBMPlexSans-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 668BDA050EF549C6B0759425 /* IBMPlexSans-Bold.ttf */; };
1360D7CA70F14549967C9912 /* IBMPlexMono-ThinItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 3918820E06534ED8B0C3323C /* IBMPlexMono-ThinItalic.ttf */; };
- 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; };
- 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB11A68108700A75B9A /* LaunchScreen.xib */; };
- 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
25004E4C90704C6B807B88C7 /* IBMPlexMono-MediumItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 71F26FBF5BDA423184286546 /* IBMPlexMono-MediumItalic.ttf */; };
2606D1B2B11C4D419867361F /* IBMPlexSans-MediumItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = A57577D96B89452694B53982 /* IBMPlexSans-MediumItalic.ttf */; };
271089B024698720009AC76F /* LocationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 271089AF24698720009AC76F /* LocationTests.swift */; };
271881C02461AF76001DE067 /* SafePathsSecureStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 271881BF2461AF76001DE067 /* SafePathsSecureStorage.swift */; };
271881C32461BF19001DE067 /* RealmSecureStorageTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 271881C22461BF19001DE067 /* RealmSecureStorageTest.swift */; };
276AB15C245291DE00D39B58 /* Location.swift in Sources */ = {isa = PBXBuildFile; fileRef = 276AB15B245291DE00D39B58 /* Location.swift */; };
- 27F931572459E28800E1024C /* SecureStorageManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F931562459E28800E1024C /* SecureStorageManager.m */; };
- 27F9315A2459E2BD00E1024C /* SecureStorageManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27F931592459E2BD00E1024C /* SecureStorageManager.swift */; };
3AD7E092BBC64F37879D040B /* IBMPlexMono.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 08F2A97BB10A459D962AB877 /* IBMPlexMono.ttf */; };
3C14AE6C1C3B4428A17E7616 /* IBMPlexSans-LightItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = C98841A50F7B43E5987C2D4A /* IBMPlexSans-LightItalic.ttf */; };
3E97D87FD88C42B79836C314 /* IBMPlexMono-Italic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 8CA5CB7E2A134220AB62370B /* IBMPlexMono-Italic.ttf */; };
- 49C5264730115D459DEB65DA /* libPods-BT.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B7372C03D7AA19943931FCE4 /* libPods-BT.a */; };
4B96C998B698BEF36609E7BA /* libPods-GPSTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 6A9CA53C8BA83132D03AD65C /* libPods-GPSTests.a */; };
522B6187A48A4AF3A676D5A0 /* IBMPlexSans-Thin.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 1423A22FF9E04F88BEEE42D6 /* IBMPlexSans-Thin.ttf */; };
527CA705E5514AF9BEAC9A2F /* IBMPlexMono-Medium.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 6C8CF282C4264C88A4ED8ABF /* IBMPlexMono-Medium.ttf */; };
57693D8BEF8A40C289F7168A /* IBMPlexSans-ExtraLightItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 3A582C62ABAC478BBD976037 /* IBMPlexSans-ExtraLightItalic.ttf */; };
6858E21561F14E61A6A85280 /* IBMPlexSans-SemiBoldItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 747AA5DBBC684319A8273F2C /* IBMPlexSans-SemiBoldItalic.ttf */; };
68D8970624809AA50091A254 /* Scrypt in Frameworks */ = {isa = PBXBuildFile; productRef = 68D8970524809AA50091A254 /* Scrypt */; };
- 68D8970C24809B4E0091A254 /* MAURLocation+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68D8970B24809B4E0091A254 /* MAURLocation+Extension.swift */; };
68D8970F24809CEB0091A254 /* Geohash.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68D8970E24809CEB0091A254 /* Geohash.swift */; };
- 68D8971224809DAE0091A254 /* Array+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68D8971124809DAE0091A254 /* Array+Extension.swift */; };
- 68D8971524809E4B0091A254 /* String+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68D8971424809E4B0091A254 /* String+Extension.swift */; };
68D8971824809F5C0091A254 /* MARULocation+ExtensionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68D8971724809F5C0091A254 /* MARULocation+ExtensionTests.swift */; };
68D8971A24809F9C0091A254 /* GeohashTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68D8971924809F9C0091A254 /* GeohashTests.swift */; };
68D8971C24809FB50091A254 /* Array+ExtensionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68D8971B24809FB50091A254 /* Array+ExtensionTests.swift */; };
- 68EFB21324856EC6003D84F3 /* Scrypt in Frameworks */ = {isa = PBXBuildFile; productRef = 68EFB21224856EC6003D84F3 /* Scrypt */; };
- 68EFB215248570C2003D84F3 /* Log.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68EFB214248570C2003D84F3 /* Log.swift */; };
7A2281C376904F23BCA10FCA /* IBMPlexSans.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 89D241005D9647C4B0586127 /* IBMPlexSans.ttf */; };
8A5B44AA7D724388B70F100B /* IBMPlexSans-ExtraLight.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 36B22BAB357B44949D2E168C /* IBMPlexSans-ExtraLight.ttf */; };
8CB0C49FEC0F493D95420B30 /* IBMPlexMono-ExtraLight.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 3053DF05D78949A09366B85D /* IBMPlexMono-ExtraLight.ttf */; };
966BF87C9654448280E34CD8 /* IBMPlexSans-Italic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 210E5F50B07048118538B796 /* IBMPlexSans-Italic.ttf */; };
A0DE2282B6A14351BC318062 /* IBMPlexMono-Thin.ttf in Resources */ = {isa = PBXBuildFile; fileRef = DF7DA7FE28F84E9EA7A6E4D4 /* IBMPlexMono-Thin.ttf */; };
A5EA4480D4CC4B468D4B4DDC /* IBMPlexMono-SemiBoldItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 997AE6137471448A99893BC8 /* IBMPlexMono-SemiBoldItalic.ttf */; };
- B01CF5299E2C4108F39C1232 /* libPods-BTTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D74339326986C2F8EE1F59BA /* libPods-BTTests.a */; };
- B2A58219244CE80C000F39A6 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = B2A5821B244CE80C000F39A6 /* InfoPlist.strings */; };
- B507A9EE24A197FF00E039D5 /* DownloadedPackage.swift in Sources */ = {isa = PBXBuildFile; fileRef = B507A9ED24A197FF00E039D5 /* DownloadedPackage.swift */; };
- B507AA0724A2533200E039D5 /* DownloadPackage+Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = B507AA0624A2533200E039D5 /* DownloadPackage+Helpers.swift */; };
- B52D88C0248F0FC00071ED51 /* SafePathsSecureStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 271881BF2461AF76001DE067 /* SafePathsSecureStorage.swift */; };
B52D88C2248F0FD90071ED51 /* GPSSecureStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = B52D88C1248F0FD90071ED51 /* GPSSecureStorage.swift */; };
- B52D88C4248F10FD0071ED51 /* BTSecureStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = B52D88C3248F10FD0071ED51 /* BTSecureStorage.swift */; };
- B54CBF26249A72E700218477 /* Region.swift in Sources */ = {isa = PBXBuildFile; fileRef = B54CBF25249A72E700218477 /* Region.swift */; };
- B54CBF32249A738500218477 /* IndexFileRequests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B54CBF31249A738500218477 /* IndexFileRequests.swift */; };
- B5582D47249943E5001458A9 /* ExposureEventEmitter.m in Sources */ = {isa = PBXBuildFile; fileRef = B5582D43249943DE001458A9 /* ExposureEventEmitter.m */; };
- B576CC4324993F5200CDD9D9 /* Date+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = B576CC3D24993F4C00CDD9D9 /* Date+Extensions.swift */; };
- B576CC4424993F5200CDD9D9 /* Encodable+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = B576CC4024993F4C00CDD9D9 /* Encodable+Extensions.swift */; };
- B596C0722488127D00943B79 /* ENPermissionsModule.m in Sources */ = {isa = PBXBuildFile; fileRef = B596C0712488127D00943B79 /* ENPermissionsModule.m */; };
- B59F4C3524BDF879007B09D5 /* ExposureHistoryModule.m in Sources */ = {isa = PBXBuildFile; fileRef = B59F4C3424BDF879007B09D5 /* ExposureHistoryModule.m */; };
- B59F4C3724BE0658007B09D5 /* List+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = B59F4C3624BE0658007B09D5 /* List+Extensions.swift */; };
- B5A6FD6E24BC9E69007D328C /* ExposureManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5A6FD6A24BC9E54007D328C /* ExposureManagerTests.swift */; };
- B5C9723024B8A909007F4C0B /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5C9722F24B8A909007F4C0B /* Constants.swift */; };
- B5E29D54249E3BE100E686DC /* ExposureManager+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5E29D53249E3BE100E686DC /* ExposureManager+Extensions.swift */; };
- B5E79437249E666B00BD8596 /* Array+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5E79436249E666B00BD8596 /* Array+Extensions.swift */; };
- B5FB3B43248BD61A001DB1D5 /* DebugMenuModule.m in Sources */ = {isa = PBXBuildFile; fileRef = B5FB3B42248BD61A001DB1D5 /* DebugMenuModule.m */; };
- B5FBB0BD2490339900433980 /* DiagnosisKeyUrlRequests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5FBB0BC2490339900433980 /* DiagnosisKeyUrlRequests.swift */; };
- B5FBB0CF24916A4C00433980 /* DebugAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5FBB0CE24916A4C00433980 /* DebugAction.swift */; };
- B5FBB0D124916A7200433980 /* Persisted.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5FBB0D024916A7200433980 /* Persisted.swift */; };
- B5FBB0D324916B3600433980 /* String+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5FBB0D224916B3600433980 /* String+Extensions.swift */; };
- B5FBB0D524916D8900433980 /* UserState.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5FBB0D424916D8900433980 /* UserState.swift */; };
- B5FBB0D724916DE100433980 /* Notification+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5FBB0D624916DE100433980 /* Notification+Extensions.swift */; };
- B5FC37C12489B075006474EB /* APIClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5FC37C02489B075006474EB /* APIClient.swift */; };
- B5FC37C62489B1B3006474EB /* APIRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5FC37C52489B1B3006474EB /* APIRequest.swift */; };
- B5FC37CA2489B1C1006474EB /* JSON.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5FC37C92489B1C1006474EB /* JSON.swift */; };
- B5FC37CC2489B251006474EB /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5FC37CB2489B251006474EB /* Result.swift */; };
- B5FC37CE2489B359006474EB /* TypeAliases.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5FC37CD2489B359006474EB /* TypeAliases.swift */; };
- B5FC37D02489B3DE006474EB /* StructuredError.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5FC37CF2489B3DE006474EB /* StructuredError.swift */; };
- B5FC37D8248A784F006474EB /* DiagnosisKeyRequests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5FC37D7248A784F006474EB /* DiagnosisKeyRequests.swift */; };
- B5FC37DD248A78D2006474EB /* ExposureKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5FC37DC248A78D2006474EB /* ExposureKey.swift */; };
- B5FC37DF248A78FC006474EB /* ExposureConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5FC37DE248A78FC006474EB /* ExposureConfiguration.swift */; };
- B5FC37E1248A7EED006474EB /* ExposureConfigurationRequests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5FC37E0248A7EED006474EB /* ExposureConfigurationRequests.swift */; };
- B5FC37E3248A82AE006474EB /* Exposure.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5FC37E2248A82AE006474EB /* Exposure.swift */; };
- B5FC37F6248A9968006474EB /* ENTemporaryExposureKey+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5FC37F5248A9968006474EB /* ENTemporaryExposureKey+Extensions.swift */; };
BB916399F2D64D8D89249A05 /* IBMPlexSans-Light.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 5D98D5DA5B77459FACDD673D /* IBMPlexSans-Light.ttf */; };
BEA401E86568452A9E8FF210 /* IBMPlexSans-Medium.ttf in Resources */ = {isa = PBXBuildFile; fileRef = C42F32AF52974EE8ADEE67B5 /* IBMPlexSans-Medium.ttf */; };
- C53FD08B24719AD1006D3268 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 08445F6724284A52008754AC /* UIKit.framework */; };
- C53FD08C24719AD1006D3268 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 08445F6524284A42008754AC /* SystemConfiguration.framework */; };
- C53FD08D24719AD1006D3268 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 08445F6324284A36008754AC /* QuartzCore.framework */; };
- C53FD08E24719AD1006D3268 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 08445F6124284A2C008754AC /* OpenGLES.framework */; };
- C53FD08F24719AD1006D3268 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 08445F5F24284A22008754AC /* libz.tbd */; };
- C53FD09024719AD1006D3268 /* libc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 08445F5D24284A15008754AC /* libc++.tbd */; };
- C53FD09124719AD1006D3268 /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 08445F5B24284A08008754AC /* ImageIO.framework */; };
- C53FD09224719AD1006D3268 /* GLKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 08445F59242849FD008754AC /* GLKit.framework */; };
- C53FD09324719AD1006D3268 /* CoreText.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 08445F57242849F1008754AC /* CoreText.framework */; };
- C53FD09424719AD1006D3268 /* CoreTelephony.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 08445F55242849E5008754AC /* CoreTelephony.framework */; };
- C53FD09524719AD1006D3268 /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 08445F53242849D8008754AC /* CoreLocation.framework */; };
- C53FD09624719AD1006D3268 /* CoreImage.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 08445F51242849CF008754AC /* CoreImage.framework */; };
- C53FD09724719AD1006D3268 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 08445F4F242849C1008754AC /* CoreGraphics.framework */; };
- C53FD09824719AD1006D3268 /* CoreData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 08445F4D24283B0B008754AC /* CoreData.framework */; };
- C53FD09924719AD1006D3268 /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 08445F4B24283AFF008754AC /* Accelerate.framework */; };
- C53FD09E24719AD1006D3268 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB11A68108700A75B9A /* LaunchScreen.xib */; };
- C53FD09F24719AD1006D3268 /* IBMPlexMono-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = AE25A1CE9ED048DC83FAE7B0 /* IBMPlexMono-Bold.ttf */; };
- C53FD0A024719AD1006D3268 /* IBMPlexMono-BoldItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 9B4A262ECA724F9CAB9A2C70 /* IBMPlexMono-BoldItalic.ttf */; };
- C53FD0A124719AD1006D3268 /* IBMPlexMono-ExtraLight.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 3053DF05D78949A09366B85D /* IBMPlexMono-ExtraLight.ttf */; };
- C53FD0A224719AD1006D3268 /* IBMPlexMono-ExtraLightItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 167DF82F84E242A39CBEB042 /* IBMPlexMono-ExtraLightItalic.ttf */; };
- C53FD0A324719AD1006D3268 /* IBMPlexMono-Italic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 8CA5CB7E2A134220AB62370B /* IBMPlexMono-Italic.ttf */; };
- C53FD0A424719AD1006D3268 /* IBMPlexMono-Light.ttf in Resources */ = {isa = PBXBuildFile; fileRef = E5C8EDCCEFCE4874A747E404 /* IBMPlexMono-Light.ttf */; };
- C53FD0A524719AD1006D3268 /* IBMPlexMono-LightItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = CF0DA9BBE69043D2BD80FF3B /* IBMPlexMono-LightItalic.ttf */; };
- C53FD0A624719AD1006D3268 /* IBMPlexMono-Medium.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 6C8CF282C4264C88A4ED8ABF /* IBMPlexMono-Medium.ttf */; };
- C53FD0A724719AD1006D3268 /* IBMPlexMono-MediumItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 71F26FBF5BDA423184286546 /* IBMPlexMono-MediumItalic.ttf */; };
- C53FD0A824719AD1006D3268 /* IBMPlexMono-SemiBold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = BF6254720C1D4A3288ECE351 /* IBMPlexMono-SemiBold.ttf */; };
- C53FD0A924719AD1006D3268 /* IBMPlexMono-SemiBoldItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 997AE6137471448A99893BC8 /* IBMPlexMono-SemiBoldItalic.ttf */; };
- C53FD0AA24719AD1006D3268 /* IBMPlexMono-Thin.ttf in Resources */ = {isa = PBXBuildFile; fileRef = DF7DA7FE28F84E9EA7A6E4D4 /* IBMPlexMono-Thin.ttf */; };
- C53FD0AB24719AD1006D3268 /* IBMPlexMono-ThinItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 3918820E06534ED8B0C3323C /* IBMPlexMono-ThinItalic.ttf */; };
- C53FD0AC24719AD1006D3268 /* IBMPlexMono.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 08F2A97BB10A459D962AB877 /* IBMPlexMono.ttf */; };
- C53FD0AD24719AD1006D3268 /* IBMPlexSans-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 668BDA050EF549C6B0759425 /* IBMPlexSans-Bold.ttf */; };
- C53FD0AE24719AD1006D3268 /* IBMPlexSans-BoldItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = C6CBA4DBBF104AC1AB920555 /* IBMPlexSans-BoldItalic.ttf */; };
- C53FD0AF24719AD1006D3268 /* IBMPlexSans-ExtraLight.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 36B22BAB357B44949D2E168C /* IBMPlexSans-ExtraLight.ttf */; };
- C53FD0B024719AD1006D3268 /* IBMPlexSans-ExtraLightItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 3A582C62ABAC478BBD976037 /* IBMPlexSans-ExtraLightItalic.ttf */; };
- C53FD0B124719AD1006D3268 /* IBMPlexSans-Italic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 210E5F50B07048118538B796 /* IBMPlexSans-Italic.ttf */; };
- C53FD0B224719AD1006D3268 /* IBMPlexSans-Light.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 5D98D5DA5B77459FACDD673D /* IBMPlexSans-Light.ttf */; };
- C53FD0B324719AD1006D3268 /* IBMPlexSans-LightItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = C98841A50F7B43E5987C2D4A /* IBMPlexSans-LightItalic.ttf */; };
- C53FD0B424719AD1006D3268 /* IBMPlexSans-Medium.ttf in Resources */ = {isa = PBXBuildFile; fileRef = C42F32AF52974EE8ADEE67B5 /* IBMPlexSans-Medium.ttf */; };
- C53FD0B524719AD1006D3268 /* IBMPlexSans-MediumItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = A57577D96B89452694B53982 /* IBMPlexSans-MediumItalic.ttf */; };
- C53FD0B624719AD1006D3268 /* IBMPlexSans-SemiBold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 4904B061CC24439783E20928 /* IBMPlexSans-SemiBold.ttf */; };
- C53FD0B724719AD1006D3268 /* IBMPlexSans-SemiBoldItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 747AA5DBBC684319A8273F2C /* IBMPlexSans-SemiBoldItalic.ttf */; };
- C53FD0B824719AD1006D3268 /* IBMPlexSans-Thin.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 1423A22FF9E04F88BEEE42D6 /* IBMPlexSans-Thin.ttf */; };
- C53FD0B924719AD1006D3268 /* IBMPlexSans-ThinItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = FF7D8132928346A2904ED363 /* IBMPlexSans-ThinItalic.ttf */; };
- C53FD0BA24719AD1006D3268 /* IBMPlexSans.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 89D241005D9647C4B0586127 /* IBMPlexSans.ttf */; };
- C550A66624B7906F002CA7F2 /* ExposureKeyModule.m in Sources */ = {isa = PBXBuildFile; fileRef = C550A66524B7906F002CA7F2 /* ExposureKeyModule.m */; };
- C58463E42486C51100BCB842 /* ExposureManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C58463E32486C51100BCB842 /* ExposureManager.swift */; };
- C5850A64247D5A41007A596B /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C5850A63247D5A41007A596B /* Images.xcassets */; };
- C5AA24D824768FFF00BA0A99 /* COVIDSafePathsTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* COVIDSafePathsTests.m */; };
- C5C850C7248014F700A494CA /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = C5C850C6248014F700A494CA /* main.m */; };
- C5C850CA2480156200A494CA /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = C5C850C92480156200A494CA /* AppDelegate.m */; };
- C5EF723724864F8500AA39D5 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = C5EF72202485D0E600AA39D5 /* main.m */; };
D43E27B6F1E045D798270A11 /* IBMPlexSans-SemiBold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 4904B061CC24439783E20928 /* IBMPlexSans-SemiBold.ttf */; };
+ D4B4A85F24C8A16400E00A99 /* Log.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4B4A85A24C8A16400E00A99 /* Log.swift */; };
+ D4B4A86024C8A16400E00A99 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = D4B4A85B24C8A16400E00A99 /* main.m */; };
+ D4B4A86124C8A16400E00A99 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = D4B4A85D24C8A16400E00A99 /* AppDelegate.m */; };
+ D4B4A88B24C8A17300E00A99 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = D4B4A86424C8A17300E00A99 /* Localizable.strings */; };
+ D4B4A88C24C8A17300E00A99 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = D4B4A86624C8A17300E00A99 /* InfoPlist.strings */; };
+ D4B4A89124C8A18E00E00A99 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = D4B4A88E24C8A18E00E00A99 /* LaunchScreen.xib */; };
+ D4B4A89224C8A18E00E00A99 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D4B4A89024C8A18E00E00A99 /* Images.xcassets */; };
+ D4B4A8A024C8A1A700E00A99 /* MAURLocation+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4B4A89424C8A1A700E00A99 /* MAURLocation+Extension.swift */; };
+ D4B4A8A124C8A1A700E00A99 /* String+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4B4A89524C8A1A700E00A99 /* String+Extension.swift */; };
+ D4B4A8A224C8A1A700E00A99 /* Array+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4B4A89624C8A1A700E00A99 /* Array+Extension.swift */; };
+ D4B4A8A324C8A1A700E00A99 /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = D4B4A89824C8A1A700E00A99 /* Debug.xcconfig */; };
+ D4B4A8A424C8A1A700E00A99 /* Release.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = D4B4A89924C8A1A700E00A99 /* Release.xcconfig */; };
+ D4B4A8A524C8A1A700E00A99 /* Version.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = D4B4A89A24C8A1A700E00A99 /* Version.xcconfig */; };
+ D4B4A8A624C8A1A700E00A99 /* Staging.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = D4B4A89B24C8A1A700E00A99 /* Staging.xcconfig */; };
+ D4B4A8A724C8A1A700E00A99 /* SecureStorageManager.m in Sources */ = {isa = PBXBuildFile; fileRef = D4B4A89D24C8A1A700E00A99 /* SecureStorageManager.m */; };
+ D4B4A8A824C8A1A700E00A99 /* SecureStorageManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4B4A89F24C8A1A700E00A99 /* SecureStorageManager.swift */; };
D668C3DAB08B4FCBB01E8C2D /* IBMPlexMono-Light.ttf in Resources */ = {isa = PBXBuildFile; fileRef = E5C8EDCCEFCE4874A747E404 /* IBMPlexMono-Light.ttf */; };
D7E714F18C9C4172BC01ADF8 /* IBMPlexMono-SemiBold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = BF6254720C1D4A3288ECE351 /* IBMPlexMono-SemiBold.ttf */; };
DED6BB86437B4610B1CD3302 /* IBMPlexSans-ThinItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = FF7D8132928346A2904ED363 /* IBMPlexSans-ThinItalic.ttf */; };
@@ -180,13 +96,6 @@
remoteGlobalIDString = 3D7682761D8E76B80014119E;
remoteInfo = SplashScreen;
};
- C5AA24E32476901700BA0A99 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = C53FD07D24719AD1006D3268;
- remoteInfo = BT;
- };
C5C850E024804A0300A494CA /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = C5C850DC24804A0300A494CA /* RCTBackgroundGeolocation.xcodeproj */;
@@ -197,11 +106,9 @@
/* End PBXContainerItemProxy section */
/* Begin PBXFileReference section */
- 008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = ""; };
00E356EE1AD99517003FC87E /* GPSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GPSTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
00E356F21AD99517003FC87E /* COVIDSafePathsTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = COVIDSafePathsTests.m; sourceTree = ""; };
- 0835F8902441054900E95AE3 /* RNBackgroundFetch+AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "RNBackgroundFetch+AppDelegate.m"; path = "../../node_modules/react-native-background-fetch/ios/RNBackgroundFetch/RNBackgroundFetch+AppDelegate.m"; sourceTree = ""; };
08445F4324283A2F008754AC /* GoogleMapsBase.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GoogleMapsBase.framework; path = "GoogleMaps-3.8.0/Base/Frameworks/GoogleMapsBase.framework"; sourceTree = ""; };
08445F4524283A40008754AC /* GoogleMaps.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GoogleMaps.framework; path = "GoogleMaps-3.8.0/Maps/Frameworks/GoogleMaps.framework"; sourceTree = ""; };
08445F4724283A46008754AC /* GoogleMapsCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GoogleMapsCore.framework; path = "GoogleMaps-3.8.0/Maps/Frameworks/GoogleMapsCore.framework"; sourceTree = ""; };
@@ -224,12 +131,8 @@
08F2A97BB10A459D962AB877 /* IBMPlexMono.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = IBMPlexMono.ttf; path = ../shared/assets/fonts/IBMPlexMono.ttf; sourceTree = ""; };
0AB0A08F38494307BF6F0EBC /* IBMPlexMono-ThinItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "IBMPlexMono-ThinItalic.ttf"; path = "../app/assets/fonts/IBMPlexMono-ThinItalic.ttf"; sourceTree = ""; };
0DD29292C60B45029B7823D6 /* IBMPlexSans-ExtraLight.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "IBMPlexSans-ExtraLight.ttf"; path = "../app/assets/fonts/IBMPlexSans-ExtraLight.ttf"; sourceTree = ""; };
+ 0EA86B049D0BB9D221E6F627 /* Pods-GPSTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-GPSTests.debug.xcconfig"; path = "Target Support Files/Pods-GPSTests/Pods-GPSTests.debug.xcconfig"; sourceTree = ""; };
13B07F961A680F5B00A75B9A /* GPS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = GPS.app; sourceTree = BUILT_PRODUCTS_DIR; };
- 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; };
- 13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; };
- 13B07FB21A68108700A75B9A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; };
- 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; };
- 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
141B3702EDB77175BCFE1BA2 /* Pods-BTTests.release-bt.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BTTests.release-bt.xcconfig"; path = "Target Support Files/Pods-BTTests/Pods-BTTests.release-bt.xcconfig"; sourceTree = ""; };
1423A22FF9E04F88BEEE42D6 /* IBMPlexSans-Thin.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "IBMPlexSans-Thin.ttf"; path = "../shared/assets/fonts/IBMPlexSans-Thin.ttf"; sourceTree = ""; };
145476A32A7724DCC004C292 /* Pods-GPS.staging-gps.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-GPS.staging-gps.xcconfig"; path = "Target Support Files/Pods-GPS/Pods-GPS.staging-gps.xcconfig"; sourceTree = ""; };
@@ -241,8 +144,6 @@
271881BF2461AF76001DE067 /* SafePathsSecureStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SafePathsSecureStorage.swift; sourceTree = ""; };
271881C22461BF19001DE067 /* RealmSecureStorageTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RealmSecureStorageTest.swift; sourceTree = ""; };
276AB15B245291DE00D39B58 /* Location.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Location.swift; sourceTree = ""; };
- 27F931562459E28800E1024C /* SecureStorageManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SecureStorageManager.m; sourceTree = ""; };
- 27F931592459E2BD00E1024C /* SecureStorageManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecureStorageManager.swift; sourceTree = ""; };
2CE99177C2D5C9E6462639A1 /* Pods-GPS.staging-bt.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-GPS.staging-bt.xcconfig"; path = "Target Support Files/Pods-GPS/Pods-GPS.staging-bt.xcconfig"; sourceTree = ""; };
2E9077612439A903005C98DE /* SplashScreen.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = SplashScreen.xcodeproj; path = "../node_modules/react-native-splash-screen/ios/SplashScreen.xcodeproj"; sourceTree = ""; };
2F42C67AFB6A35F87118053B /* Pods-GPSTests.release-gps.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-GPSTests.release-gps.xcconfig"; path = "Target Support Files/Pods-GPSTests/Pods-GPSTests.release-gps.xcconfig"; sourceTree = ""; };
@@ -257,6 +158,7 @@
450B58D199444B7D8DEE6A0A /* IBMPlexSans-Italic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "IBMPlexSans-Italic.ttf"; path = "../app/assets/fonts/IBMPlexSans-Italic.ttf"; sourceTree = ""; };
4904B061CC24439783E20928 /* IBMPlexSans-SemiBold.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "IBMPlexSans-SemiBold.ttf"; path = "../shared/assets/fonts/IBMPlexSans-SemiBold.ttf"; sourceTree = ""; };
4E3ED4D343165DDCF8CF6F14 /* Pods-GPS.debug-bt.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-GPS.debug-bt.xcconfig"; path = "Target Support Files/Pods-GPS/Pods-GPS.debug-bt.xcconfig"; sourceTree = ""; };
+ 500296CFBBD33FA70F4403EF /* Pods-GPS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-GPS.debug.xcconfig"; path = "Target Support Files/Pods-GPS/Pods-GPS.debug.xcconfig"; sourceTree = ""; };
530526E48807C46118B2B9B7 /* Pods-GPSTests.staging-bt.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-GPSTests.staging-bt.xcconfig"; path = "Target Support Files/Pods-GPSTests/Pods-GPSTests.staging-bt.xcconfig"; sourceTree = ""; };
53A0C1C57CED4660822FE560 /* IBMPlexMono-Medium.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "IBMPlexMono-Medium.ttf"; path = "../app/assets/fonts/IBMPlexMono-Medium.ttf"; sourceTree = ""; };
542F7FB7FF534DC2A7D428AE /* IBMPlexSans.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = file; name = IBMPlexSans.ttf; path = ../app/assets/fonts/IBMPlexSans.ttf; sourceTree = ""; };
@@ -265,17 +167,15 @@
56E8CDA04E244E24A9781CA8 /* IBMPlexSans-SemiBoldItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "IBMPlexSans-SemiBoldItalic.ttf"; path = "../app/assets/fonts/IBMPlexSans-SemiBoldItalic.ttf"; sourceTree = ""; };
5D1446DDD4674BFAA520C0E8 /* IBMPlexMono-ExtraLight.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "IBMPlexMono-ExtraLight.ttf"; path = "../app/assets/fonts/IBMPlexMono-ExtraLight.ttf"; sourceTree = ""; };
5D98D5DA5B77459FACDD673D /* IBMPlexSans-Light.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "IBMPlexSans-Light.ttf"; path = "../shared/assets/fonts/IBMPlexSans-Light.ttf"; sourceTree = ""; };
+ 606EB844E7D64AB33707A02E /* Pods-GPSTests.staging.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-GPSTests.staging.xcconfig"; path = "Target Support Files/Pods-GPSTests/Pods-GPSTests.staging.xcconfig"; sourceTree = ""; };
667ABCBB6E3FBF03F44D3672 /* Pods-GPS.debug-gps.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-GPS.debug-gps.xcconfig"; path = "Target Support Files/Pods-GPS/Pods-GPS.debug-gps.xcconfig"; sourceTree = ""; };
668BDA050EF549C6B0759425 /* IBMPlexSans-Bold.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "IBMPlexSans-Bold.ttf"; path = "../shared/assets/fonts/IBMPlexSans-Bold.ttf"; sourceTree = ""; };
67DC43BDE1EF8997F26F2108 /* Pods-BT.release-bt.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BT.release-bt.xcconfig"; path = "Target Support Files/Pods-BT/Pods-BT.release-bt.xcconfig"; sourceTree = ""; };
- 68D8970B24809B4E0091A254 /* MAURLocation+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MAURLocation+Extension.swift"; sourceTree = ""; };
68D8970E24809CEB0091A254 /* Geohash.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Geohash.swift; sourceTree = ""; };
- 68D8971124809DAE0091A254 /* Array+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Array+Extension.swift"; sourceTree = ""; };
- 68D8971424809E4B0091A254 /* String+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+Extension.swift"; sourceTree = ""; };
68D8971724809F5C0091A254 /* MARULocation+ExtensionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MARULocation+ExtensionTests.swift"; sourceTree = ""; };
68D8971924809F9C0091A254 /* GeohashTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GeohashTests.swift; sourceTree = ""; };
68D8971B24809FB50091A254 /* Array+ExtensionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Array+ExtensionTests.swift"; sourceTree = ""; };
- 68EFB214248570C2003D84F3 /* Log.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Log.swift; sourceTree = ""; };
+ 69C0CB99A1291E1928585D63 /* Pods-GPS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-GPS.release.xcconfig"; path = "Target Support Files/Pods-GPS/Pods-GPS.release.xcconfig"; sourceTree = ""; };
6A9CA53C8BA83132D03AD65C /* libPods-GPSTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-GPSTests.a"; sourceTree = BUILT_PRODUCTS_DIR; };
6BA94CE8425944B8990A49B3 /* IBMPlexSans-Bold.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "IBMPlexSans-Bold.ttf"; path = "../app/assets/fonts/IBMPlexSans-Bold.ttf"; sourceTree = ""; };
6C8CF282C4264C88A4ED8ABF /* IBMPlexMono-Medium.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "IBMPlexMono-Medium.ttf"; path = "../shared/assets/fonts/IBMPlexMono-Medium.ttf"; sourceTree = ""; };
@@ -283,6 +183,7 @@
71F26FBF5BDA423184286546 /* IBMPlexMono-MediumItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "IBMPlexMono-MediumItalic.ttf"; path = "../shared/assets/fonts/IBMPlexMono-MediumItalic.ttf"; sourceTree = ""; };
747AA5DBBC684319A8273F2C /* IBMPlexSans-SemiBoldItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "IBMPlexSans-SemiBoldItalic.ttf"; path = "../shared/assets/fonts/IBMPlexSans-SemiBoldItalic.ttf"; sourceTree = ""; };
751F8AE184B9709A8C3817BF /* Pods-BTTests.staging-gps.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BTTests.staging-gps.xcconfig"; path = "Target Support Files/Pods-BTTests/Pods-BTTests.staging-gps.xcconfig"; sourceTree = ""; };
+ 78335934CC8BDA43BF1F4759 /* Pods-GPS.staging.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-GPS.staging.xcconfig"; path = "Target Support Files/Pods-GPS/Pods-GPS.staging.xcconfig"; sourceTree = ""; };
844C843F62B5585C2F2346EA /* Pods-BT.staging-bt.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BT.staging-bt.xcconfig"; path = "Target Support Files/Pods-BT/Pods-BT.staging-bt.xcconfig"; sourceTree = ""; };
89D241005D9647C4B0586127 /* IBMPlexSans.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = IBMPlexSans.ttf; path = ../shared/assets/fonts/IBMPlexSans.ttf; sourceTree = ""; };
8CA5CB7E2A134220AB62370B /* IBMPlexMono-Italic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "IBMPlexMono-Italic.ttf"; path = "../shared/assets/fonts/IBMPlexMono-Italic.ttf"; sourceTree = ""; };
@@ -295,106 +196,85 @@
A74024E269FF63C56B1025EA /* Pods-BTTests.release-gps.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BTTests.release-gps.xcconfig"; path = "Target Support Files/Pods-BTTests/Pods-BTTests.release-gps.xcconfig"; sourceTree = ""; };
AE25A1CE9ED048DC83FAE7B0 /* IBMPlexMono-Bold.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "IBMPlexMono-Bold.ttf"; path = "../shared/assets/fonts/IBMPlexMono-Bold.ttf"; sourceTree = ""; };
B27E26E7076641EFB4386943 /* IBMPlexSans-ExtraLightItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "IBMPlexSans-ExtraLightItalic.ttf"; path = "../app/assets/fonts/IBMPlexSans-ExtraLightItalic.ttf"; sourceTree = ""; };
- B2A58213244CE76C000F39A6 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; };
- B2A58216244CE778000F39A6 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Localizable.strings; sourceTree = ""; };
- B2A5821A244CE80C000F39A6 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; };
- B2A5821C244CE8D6000F39A6 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/InfoPlist.strings; sourceTree = ""; };
- B2A5821D244CE988000F39A6 /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/InfoPlist.strings; sourceTree = ""; };
- B2A5821E244CE988000F39A6 /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/Localizable.strings; sourceTree = ""; };
- B2A5821F244CE9EB000F39A6 /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/InfoPlist.strings; sourceTree = ""; };
- B2A58220244CE9EB000F39A6 /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/Localizable.strings; sourceTree = ""; };
- B2A58221244CE9F7000F39A6 /* id */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = id; path = id.lproj/InfoPlist.strings; sourceTree = ""; };
- B2A58222244CE9F7000F39A6 /* id */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = id; path = id.lproj/Localizable.strings; sourceTree = ""; };
- B2A58223244CEA20000F39A6 /* fr-HT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "fr-HT"; path = "fr-HT.lproj/InfoPlist.strings"; sourceTree = ""; };
- B2A58224244CEA20000F39A6 /* fr-HT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "fr-HT"; path = "fr-HT.lproj/Localizable.strings"; sourceTree = ""; };
- B2A58225244CEA6C000F39A6 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/InfoPlist.strings"; sourceTree = ""; };
- B2A58226244CEA6C000F39A6 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/Localizable.strings"; sourceTree = ""; };
- B2A58227244CEA7B000F39A6 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/InfoPlist.strings; sourceTree = ""; };
- B2A58228244CEA7B000F39A6 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = ""; };
- B2A58229244CEA84000F39A6 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/InfoPlist.strings; sourceTree = ""; };
- B2A5822A244CEA84000F39A6 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = ""; };
- B2A5822B244CEA8F000F39A6 /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = vi.lproj/InfoPlist.strings; sourceTree = ""; };
- B2A5822C244CEA8F000F39A6 /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = vi.lproj/Localizable.strings; sourceTree = ""; };
- B2A5822D244CEA9F000F39A6 /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant"; path = "zh-Hant.lproj/InfoPlist.strings"; sourceTree = ""; };
- B2A5822E244CEA9F000F39A6 /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant"; path = "zh-Hant.lproj/Localizable.strings"; sourceTree = ""; };
B3D0B8224679467D85423742 /* IBMPlexMono-Italic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "IBMPlexMono-Italic.ttf"; path = "../app/assets/fonts/IBMPlexMono-Italic.ttf"; sourceTree = ""; };
B3ED5E905B1401FCBA420CFF /* Pods-GPSTests.debug-gps.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-GPSTests.debug-gps.xcconfig"; path = "Target Support Files/Pods-GPSTests/Pods-GPSTests.debug-gps.xcconfig"; sourceTree = ""; };
- B507A9ED24A197FF00E039D5 /* DownloadedPackage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DownloadedPackage.swift; sourceTree = ""; };
- B507AA0624A2533200E039D5 /* DownloadPackage+Helpers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DownloadPackage+Helpers.swift"; sourceTree = ""; };
B52D88C1248F0FD90071ED51 /* GPSSecureStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GPSSecureStorage.swift; sourceTree = ""; };
- B52D88C3248F10FD0071ED51 /* BTSecureStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BTSecureStorage.swift; sourceTree = ""; };
- B54CBF25249A72E700218477 /* Region.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Region.swift; sourceTree = ""; };
- B54CBF31249A738500218477 /* IndexFileRequests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IndexFileRequests.swift; sourceTree = ""; };
- B5582D43249943DE001458A9 /* ExposureEventEmitter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ExposureEventEmitter.m; sourceTree = ""; };
- B576CC3D24993F4C00CDD9D9 /* Date+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Date+Extensions.swift"; sourceTree = ""; };
- B576CC4024993F4C00CDD9D9 /* Encodable+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Encodable+Extensions.swift"; sourceTree = ""; };
- B596C0712488127D00943B79 /* ENPermissionsModule.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ENPermissionsModule.m; sourceTree = ""; };
- B59F4C3424BDF879007B09D5 /* ExposureHistoryModule.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ExposureHistoryModule.m; sourceTree = ""; };
- B59F4C3624BE0658007B09D5 /* List+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "List+Extensions.swift"; sourceTree = ""; };
B5A6FD6A24BC9E54007D328C /* ExposureManagerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExposureManagerTests.swift; sourceTree = ""; };
B5C490A72498F84000588A5F /* Region.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Region.swift; sourceTree = ""; };
- B5C9722F24B8A909007F4C0B /* Constants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = ""; };
- B5E29D53249E3BE100E686DC /* ExposureManager+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ExposureManager+Extensions.swift"; sourceTree = ""; };
- B5E79436249E666B00BD8596 /* Array+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Array+Extensions.swift"; sourceTree = ""; };
- B5FB3B42248BD61A001DB1D5 /* DebugMenuModule.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DebugMenuModule.m; sourceTree = ""; };
- B5FBB0BC2490339900433980 /* DiagnosisKeyUrlRequests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiagnosisKeyUrlRequests.swift; sourceTree = ""; };
- B5FBB0CE24916A4C00433980 /* DebugAction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DebugAction.swift; sourceTree = ""; };
- B5FBB0D024916A7200433980 /* Persisted.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Persisted.swift; sourceTree = ""; };
- B5FBB0D224916B3600433980 /* String+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+Extensions.swift"; sourceTree = ""; };
- B5FBB0D424916D8900433980 /* UserState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserState.swift; sourceTree = ""; };
- B5FBB0D624916DE100433980 /* Notification+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Notification+Extensions.swift"; sourceTree = ""; };
- B5FC37C02489B075006474EB /* APIClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APIClient.swift; sourceTree = ""; };
- B5FC37C52489B1B3006474EB /* APIRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APIRequest.swift; sourceTree = ""; };
- B5FC37C92489B1C1006474EB /* JSON.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JSON.swift; sourceTree = ""; };
- B5FC37CB2489B251006474EB /* Result.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Result.swift; sourceTree = ""; };
- B5FC37CD2489B359006474EB /* TypeAliases.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TypeAliases.swift; sourceTree = ""; };
- B5FC37CF2489B3DE006474EB /* StructuredError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StructuredError.swift; sourceTree = ""; };
- B5FC37D7248A784F006474EB /* DiagnosisKeyRequests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiagnosisKeyRequests.swift; sourceTree = ""; };
- B5FC37DC248A78D2006474EB /* ExposureKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExposureKey.swift; sourceTree = ""; };
- B5FC37DE248A78FC006474EB /* ExposureConfiguration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExposureConfiguration.swift; sourceTree = ""; };
- B5FC37E0248A7EED006474EB /* ExposureConfigurationRequests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExposureConfigurationRequests.swift; sourceTree = ""; };
- B5FC37E2248A82AE006474EB /* Exposure.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Exposure.swift; sourceTree = ""; };
- B5FC37F5248A9968006474EB /* ENTemporaryExposureKey+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ENTemporaryExposureKey+Extensions.swift"; sourceTree = ""; };
B7372C03D7AA19943931FCE4 /* libPods-BT.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-BT.a"; sourceTree = BUILT_PRODUCTS_DIR; };
BF6254720C1D4A3288ECE351 /* IBMPlexMono-SemiBold.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "IBMPlexMono-SemiBold.ttf"; path = "../shared/assets/fonts/IBMPlexMono-SemiBold.ttf"; sourceTree = ""; };
BFBEC306069776E19FE33586 /* Pods-BT.debug-gps.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BT.debug-gps.xcconfig"; path = "Target Support Files/Pods-BT/Pods-BT.debug-gps.xcconfig"; sourceTree = ""; };
C42F32AF52974EE8ADEE67B5 /* IBMPlexSans-Medium.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "IBMPlexSans-Medium.ttf"; path = "../shared/assets/fonts/IBMPlexSans-Medium.ttf"; sourceTree = ""; };
- C504FDC1249D15260024219C /* BT-Production.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "BT-Production.entitlements"; sourceTree = ""; };
- C504FDC4249D155D0024219C /* BT-Development.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "BT-Development.entitlements"; sourceTree = ""; };
- C504FDC5249D15990024219C /* GPS-Production.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "GPS-Production.entitlements"; sourceTree = ""; };
- C53FD0C124719AD1006D3268 /* BT.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = BT.app; sourceTree = BUILT_PRODUCTS_DIR; };
- C53FD0C224719AD2006D3268 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
- C550A66524B7906F002CA7F2 /* ExposureKeyModule.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ExposureKeyModule.m; sourceTree = ""; };
- C56190A12485332E009A6756 /* BT-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "BT-Bridging-Header.h"; sourceTree = ""; };
- C58463E32486C51100BCB842 /* ExposureManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExposureManager.swift; sourceTree = ""; };
- C5850A63247D5A41007A596B /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; };
- C5AA24E124768FFF00BA0A99 /* BTTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = BTTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
- C5C850C6248014F700A494CA /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; };
- C5C850C92480156200A494CA /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = SOURCE_ROOT; };
C5C850DC24804A0300A494CA /* RCTBackgroundGeolocation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTBackgroundGeolocation.xcodeproj; path = "../node_modules/@mauron85/react-native-background-geolocation/ios/RCTBackgroundGeolocation.xcodeproj"; sourceTree = ""; };
C5C850E324804A5200A494CA /* libBackgroundGeolocation.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libBackgroundGeolocation.a; sourceTree = BUILT_PRODUCTS_DIR; };
C5C850F8248125A800A494CA /* libBackgroundGeolocation.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libBackgroundGeolocation.a; sourceTree = BUILT_PRODUCTS_DIR; };
- C5C850FB24812AAB00A494CA /* GPS-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "GPS-Bridging-Header.h"; sourceTree = ""; };
- C5EF72202485D0E600AA39D5 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = main.m; path = bridge/main.m; sourceTree = ""; };
C6CBA4DBBF104AC1AB920555 /* IBMPlexSans-BoldItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "IBMPlexSans-BoldItalic.ttf"; path = "../shared/assets/fonts/IBMPlexSans-BoldItalic.ttf"; sourceTree = ""; };
C840FB7884D64E6FA97ECC2C /* IBMPlexSans-Medium.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "IBMPlexSans-Medium.ttf"; path = "../app/assets/fonts/IBMPlexSans-Medium.ttf"; sourceTree = ""; };
C98841A50F7B43E5987C2D4A /* IBMPlexSans-LightItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "IBMPlexSans-LightItalic.ttf"; path = "../shared/assets/fonts/IBMPlexSans-LightItalic.ttf"; sourceTree = ""; };
CC1EBAC6486247BFA5EF04EB /* IBMPlexSans-SemiBold.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "IBMPlexSans-SemiBold.ttf"; path = "../app/assets/fonts/IBMPlexSans-SemiBold.ttf"; sourceTree = ""; };
CF0DA9BBE69043D2BD80FF3B /* IBMPlexMono-LightItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "IBMPlexMono-LightItalic.ttf"; path = "../shared/assets/fonts/IBMPlexMono-LightItalic.ttf"; sourceTree = ""; };
D04E298A8C92F0D267143C3A /* Pods-BTTests.staging-bt.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BTTests.staging-bt.xcconfig"; path = "Target Support Files/Pods-BTTests/Pods-BTTests.staging-bt.xcconfig"; sourceTree = ""; };
- D4CB500824A66A2900405D61 /* Version.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Version.xcconfig; sourceTree = ""; };
- D4CB500924A66ACB00405D61 /* Debug-GPS.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Debug-GPS.xcconfig"; sourceTree = ""; };
- D4CB500A24A66B6400405D61 /* Staging-GPS.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Staging-GPS.xcconfig"; sourceTree = ""; };
- D4CB500B24A66B8700405D61 /* Release-GPS.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Release-GPS.xcconfig"; sourceTree = ""; };
- D4CB502824A66C5D00405D61 /* Version.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Version.xcconfig; sourceTree = ""; };
- D4CB502A24A66C7500405D61 /* Debug-BT.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Debug-BT.xcconfig"; sourceTree = ""; };
- D4CB502B24A66C7500405D61 /* Release-BT.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Release-BT.xcconfig"; sourceTree = ""; };
- D4CB502C24A66C7500405D61 /* Staging-BT.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Staging-BT.xcconfig"; sourceTree = ""; };
+ D4B4A85924C8A16400E00A99 /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; };
+ D4B4A85A24C8A16400E00A99 /* Log.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Log.swift; sourceTree = ""; };
+ D4B4A85B24C8A16400E00A99 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; };
+ D4B4A85C24C8A16400E00A99 /* GPS-Production.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = "GPS-Production.entitlements"; sourceTree = ""; };
+ D4B4A85D24C8A16400E00A99 /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; };
+ D4B4A85E24C8A16400E00A99 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ D4B4A86524C8A17300E00A99 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/Localizable.strings; sourceTree = ""; };
+ D4B4A86724C8A17300E00A99 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/InfoPlist.strings; sourceTree = ""; };
+ D4B4A86824C8A17300E00A99 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; };
+ D4B4A86924C8A17300E00A99 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; };
+ D4B4A86A24C8A17300E00A99 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = ""; };
+ D4B4A86B24C8A17300E00A99 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/InfoPlist.strings; sourceTree = ""; };
+ D4B4A86C24C8A17300E00A99 /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/Localizable.strings; sourceTree = ""; };
+ D4B4A86D24C8A17300E00A99 /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/InfoPlist.strings; sourceTree = ""; };
+ D4B4A86E24C8A17300E00A99 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Localizable.strings; sourceTree = ""; };
+ D4B4A86F24C8A17300E00A99 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/InfoPlist.strings; sourceTree = ""; };
+ D4B4A87024C8A17300E00A99 /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/Localizable.strings; sourceTree = ""; };
+ D4B4A87124C8A17300E00A99 /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/InfoPlist.strings; sourceTree = ""; };
+ D4B4A87224C8A17300E00A99 /* ml */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ml; path = ml.lproj/Localizable.strings; sourceTree = ""; };
+ D4B4A87324C8A17300E00A99 /* ml */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ml; path = ml.lproj/InfoPlist.strings; sourceTree = ""; };
+ D4B4A87424C8A17300E00A99 /* fr-HT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "fr-HT"; path = "fr-HT.lproj/Localizable.strings"; sourceTree = ""; };
+ D4B4A87524C8A17300E00A99 /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant"; path = "zh-Hant.lproj/Localizable.strings"; sourceTree = ""; };
+ D4B4A87624C8A17300E00A99 /* es-PR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-PR"; path = "es-PR.lproj/Localizable.strings"; sourceTree = ""; };
+ D4B4A87724C8A17300E00A99 /* es-PR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-PR"; path = "es-PR.lproj/InfoPlist.strings"; sourceTree = ""; };
+ D4B4A87824C8A17300E00A99 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Localizable.strings; sourceTree = ""; };
+ D4B4A87924C8A17300E00A99 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/InfoPlist.strings; sourceTree = ""; };
+ D4B4A87A24C8A17300E00A99 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/Localizable.strings"; sourceTree = ""; };
+ D4B4A87B24C8A17300E00A99 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/InfoPlist.strings"; sourceTree = ""; };
+ D4B4A87C24C8A17300E00A99 /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = vi.lproj/Localizable.strings; sourceTree = ""; };
+ D4B4A87D24C8A17300E00A99 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = ""; };
+ D4B4A87E24C8A17300E00A99 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/InfoPlist.strings; sourceTree = ""; };
+ D4B4A87F24C8A17300E00A99 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = ""; };
+ D4B4A88024C8A17300E00A99 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/InfoPlist.strings; sourceTree = ""; };
+ D4B4A88124C8A17300E00A99 /* id */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = id; path = id.lproj/Localizable.strings; sourceTree = ""; };
+ D4B4A88224C8A17300E00A99 /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Localizable.strings; sourceTree = ""; };
+ D4B4A88324C8A17300E00A99 /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/InfoPlist.strings; sourceTree = ""; };
+ D4B4A88424C8A17300E00A99 /* zz-ZZ */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zz-ZZ"; path = "zz-ZZ.lproj/Localizable.strings"; sourceTree = ""; };
+ D4B4A88524C8A17300E00A99 /* zz-ZZ */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zz-ZZ"; path = "zz-ZZ.lproj/InfoPlist.strings"; sourceTree = ""; };
+ D4B4A88624C8A17300E00A99 /* ht */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ht; path = ht.lproj/Localizable.strings; sourceTree = ""; };
+ D4B4A88724C8A17300E00A99 /* ht */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ht; path = ht.lproj/InfoPlist.strings; sourceTree = ""; };
+ D4B4A88824C8A17300E00A99 /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/Localizable.strings; sourceTree = ""; };
+ D4B4A88924C8A17300E00A99 /* tl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tl; path = tl.lproj/Localizable.strings; sourceTree = ""; };
+ D4B4A88A24C8A17300E00A99 /* tl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tl; path = tl.lproj/InfoPlist.strings; sourceTree = ""; };
+ D4B4A88F24C8A18E00E00A99 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = "