From 01bd1a3fe0ca42a7c923d7ec5ab4ea49278ca878 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Herculano?= Date: Thu, 29 Feb 2024 17:08:31 +0100 Subject: [PATCH 1/6] make SPUSNatCnsent.CosnentString fields public --- ConsentViewController/Classes/Consents/SPUSNatConsent.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ConsentViewController/Classes/Consents/SPUSNatConsent.swift b/ConsentViewController/Classes/Consents/SPUSNatConsent.swift index 889e48c9d..ecf5b582c 100644 --- a/ConsentViewController/Classes/Consents/SPUSNatConsent.swift +++ b/ConsentViewController/Classes/Consents/SPUSNatConsent.swift @@ -9,8 +9,8 @@ import Foundation @objcMembers public class SPUSNatConsent: NSObject, Codable, CampaignConsent, NSCopying { public struct ConsentString: Codable, Equatable { - let sectionId: Int - let sectionName, consentString: String + public let sectionId: Int + public let sectionName, consentString: String } public var uuid: String? From f771d77ad92623247d96ba35f68ceab44c2bcafc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Herculano?= Date: Thu, 29 Feb 2024 17:09:22 +0100 Subject: [PATCH 2/6] introduce SPConsentables as categories and vendors to SPUSNatConsent --- .../Classes/Consents/SPConsentable.swift | 38 +++++++ .../Classes/Consents/SPUSNatConsent.swift | 41 ++++--- .../SourcePointClient/ChoiceResponses.swift | 10 -- .../ConsentStatusResponse.swift | 2 +- .../SourcePointClient/MessagesResponse.swift | 1 + .../SourcePointClient/SourcePointClient.swift | 2 +- .../SourcepointClientCoordinator.swift | 8 +- .../Helpers/SourcePointClientMock.swift | 11 +- .../SPUSNatConsentSpec.swift | 40 +++++-- Example/Pods/Pods.xcodeproj/project.pbxproj | 105 ++++++++---------- 10 files changed, 147 insertions(+), 111 deletions(-) create mode 100644 ConsentViewController/Classes/Consents/SPConsentable.swift diff --git a/ConsentViewController/Classes/Consents/SPConsentable.swift b/ConsentViewController/Classes/Consents/SPConsentable.swift new file mode 100644 index 000000000..e02e6ffe6 --- /dev/null +++ b/ConsentViewController/Classes/Consents/SPConsentable.swift @@ -0,0 +1,38 @@ +// +// SPConsentable.swift +// Pods +// +// Created by Andre Herculano on 29.02.24. +// + +import Foundation + +protocol Consentable { + var id: String { get } + var consented: Bool { get } +} + +@objcMembers public class SPConsentable: NSObject, Consentable, Codable { + enum CodingKeys: String, CodingKey { + case id = "_id" + case consented + } + + public let id: String + public let consented: Bool + + override open var description: String { + "SPConsentable(id: \(id), consented: \(consented))" + } + + init(id: String, consented: Bool) { + self.id = id + self.consented = consented + } + + override public func isEqual(_ object: Any?) -> Bool { + guard let other = object as? SPConsentable else { return false } + + return other.id == id && other.consented == consented + } +} diff --git a/ConsentViewController/Classes/Consents/SPUSNatConsent.swift b/ConsentViewController/Classes/Consents/SPUSNatConsent.swift index ecf5b582c..056c301b0 100644 --- a/ConsentViewController/Classes/Consents/SPUSNatConsent.swift +++ b/ConsentViewController/Classes/Consents/SPUSNatConsent.swift @@ -8,11 +8,19 @@ import Foundation @objcMembers public class SPUSNatConsent: NSObject, Codable, CampaignConsent, NSCopying { + struct UserConsents: Codable, Equatable { + let vendors, categories: [SPConsentable] + } + public struct ConsentString: Codable, Equatable { public let sectionId: Int public let sectionName, consentString: String } + public var vendors: [SPConsentable] { userConsents.vendors } + + public var categories: [SPConsentable] { userConsents.categories } + public var uuid: String? public var applies: Bool @@ -22,8 +30,6 @@ import Foundation /// A dictionary with all GPP related data public var GPPData: SPJson? - let categories: [String] - var dateCreated, expirationDate: SPDate /// Required by SP endpoints @@ -34,6 +40,8 @@ import Foundation var consentStatus: ConsentStatus + var userConsents: UserConsents + override open var description: String { """ SPUSNatConsent( @@ -41,6 +49,7 @@ import Foundation - applies: \(applies) - consentStrings: \(consentStrings) - categories: \(categories) + - vendors: \(vendors) - dateCreated: \(dateCreated) - expirationDate: \(expirationDate) ) @@ -55,7 +64,8 @@ import Foundation consentStrings: [ConsentString], webConsentPayload: SPWebConsentPayload? = nil, lastMessage: LastMessageData? = nil, - categories: [String], + categories: [SPConsentable], + vendors: [SPConsentable], consentStatus: ConsentStatus, GPPData: SPJson? = nil ) { @@ -66,9 +76,9 @@ import Foundation self.consentStrings = consentStrings self.webConsentPayload = webConsentPayload self.lastMessage = lastMessage - self.categories = [] self.consentStatus = consentStatus self.GPPData = GPPData + self.userConsents = UserConsents(vendors: vendors, categories: categories) } required public init(from decoder: Decoder) throws { @@ -80,9 +90,9 @@ import Foundation consentStrings = try container.decode([ConsentString].self, forKey: .consentStrings) webConsentPayload = try container.decodeIfPresent(SPWebConsentPayload.self, forKey: .webConsentPayload) lastMessage = try container.decodeIfPresent(LastMessageData.self, forKey: .lastMessage) - categories = try container.decode([String].self, forKey: .categories) consentStatus = try container.decode(ConsentStatus.self, forKey: .consentStatus) GPPData = try container.decodeIfPresent(SPJson.self, forKey: .GPPData) + userConsents = try container.decodeIfPresent(UserConsents.self, forKey: .userConsents) ?? UserConsents(vendors: [], categories: []) } public static func empty() -> SPUSNatConsent { SPUSNatConsent( @@ -91,20 +101,20 @@ import Foundation expirationDate: .distantFuture(), consentStrings: [], categories: [], + vendors: [], consentStatus: ConsentStatus() )} override public func isEqual(_ object: Any?) -> Bool { - if let other = object as? SPUSNatConsent { - return other.uuid == uuid && - other.applies == applies && - other.consentStrings.count == consentStrings.count && - other.consentStrings.sorted(by: { $0.sectionId > $1.sectionId }) == - other.consentStrings.sorted(by: { $0.sectionId > $1.sectionId }) && - other.categories == categories - } else { - return false - } + guard let other = object as? SPUSNatConsent else { return false } + + return other.uuid == uuid && + other.applies == applies && + other.consentStrings.count == consentStrings.count && + other.consentStrings.sorted(by: { $0.sectionId > $1.sectionId }) == + other.consentStrings.sorted(by: { $0.sectionId > $1.sectionId }) && + other.categories == categories && + other.vendors == vendors } public func copy(with zone: NSZone? = nil) -> Any { SPUSNatConsent( @@ -116,6 +126,7 @@ import Foundation webConsentPayload: webConsentPayload, lastMessage: lastMessage, categories: categories, + vendors: vendors, consentStatus: consentStatus, GPPData: GPPData )} diff --git a/ConsentViewController/Classes/SourcePointClient/ChoiceResponses.swift b/ConsentViewController/Classes/SourcePointClient/ChoiceResponses.swift index 96aa5063d..5348b2b7c 100644 --- a/ConsentViewController/Classes/SourcePointClient/ChoiceResponses.swift +++ b/ConsentViewController/Classes/SourcePointClient/ChoiceResponses.swift @@ -37,16 +37,6 @@ struct CCPAChoiceResponse: Equatable { let GPPData: SPJson } -struct USNatChoiceResponse: Equatable, Decodable { - let uuid: String - let consentStrings: [SPUSNatConsent.ConsentString] - let categories: [String] - let dateCreated, expirationDate: SPDate - let webConsentPayload: SPWebConsentPayload? - let consentStatus: ConsentStatus - let GPPData: SPJson? -} - extension CCPAChoiceResponse: Decodable { enum CodingKeys: CodingKey { case uuid, dateCreated, consentedAll, rejectedAll, diff --git a/ConsentViewController/Classes/SourcePointClient/ConsentStatusResponse.swift b/ConsentViewController/Classes/SourcePointClient/ConsentStatusResponse.swift index de505cb1a..cb17d12a9 100644 --- a/ConsentViewController/Classes/SourcePointClient/ConsentStatusResponse.swift +++ b/ConsentViewController/Classes/SourcePointClient/ConsentStatusResponse.swift @@ -39,9 +39,9 @@ struct ConsentStatusResponse: Decodable, Equatable { let consentStrings: [SPUSNatConsent.ConsentString] let dateCreated, expirationDate: SPDate let consentStatus: ConsentStatus - let categories: [String] let webConsentPayload: SPWebConsentPayload? let GPPData: SPJson? + let userConsents: SPUSNatConsent.UserConsents } let gdpr: GDPR? diff --git a/ConsentViewController/Classes/SourcePointClient/MessagesResponse.swift b/ConsentViewController/Classes/SourcePointClient/MessagesResponse.swift index a468a0a5c..208895a6d 100644 --- a/ConsentViewController/Classes/SourcePointClient/MessagesResponse.swift +++ b/ConsentViewController/Classes/SourcePointClient/MessagesResponse.swift @@ -164,6 +164,7 @@ extension Consent: Codable { webConsentPayload: consents.webConsentPayload, lastMessage: LastMessageData(from: messageMetaData), categories: consents.categories, + vendors: consents.vendors, consentStatus: consents.consentStatus, GPPData: consents.GPPData ) diff --git a/ConsentViewController/Classes/SourcePointClient/SourcePointClient.swift b/ConsentViewController/Classes/SourcePointClient/SourcePointClient.swift index 2bed628b2..2c13515e5 100644 --- a/ConsentViewController/Classes/SourcePointClient/SourcePointClient.swift +++ b/ConsentViewController/Classes/SourcePointClient/SourcePointClient.swift @@ -39,7 +39,7 @@ typealias CCPAPrivacyManagerViewHandler = (Result) -> Void typealias CCPAConsentHandler = (Result) -> Void typealias GDPRConsentHandler = (Result) -> Void -typealias USNatConsentHandler = (Result) -> Void +typealias USNatConsentHandler = (Result) -> Void typealias ConsentHandler = (Result<(SPJson, T), SPError>) -> Void typealias AddOrDeleteCustomConsentHandler = (Result) -> Void typealias ConsentStatusHandler = (Result) -> Void diff --git a/ConsentViewController/Classes/SourcePointClient/SourcepointClientCoordinator.swift b/ConsentViewController/Classes/SourcePointClient/SourcepointClientCoordinator.swift index b6547daa0..e0cce474b 100644 --- a/ConsentViewController/Classes/SourcePointClient/SourcepointClientCoordinator.swift +++ b/ConsentViewController/Classes/SourcePointClient/SourcepointClientCoordinator.swift @@ -560,7 +560,8 @@ class SourcepointClientCoordinator: SPClientCoordinator { expirationDate: usnat.expirationDate, consentStrings: usnat.consentStrings, webConsentPayload: usnat.webConsentPayload, - categories: usnat.categories, + categories: usnat.userConsents.categories, + vendors: usnat.userConsents.vendors, consentStatus: usnat.consentStatus, GPPData: usnat.GPPData ) @@ -839,7 +840,7 @@ class SourcepointClientCoordinator: SPClientCoordinator { func postChoice( _ action: SPAction, - handler: @escaping (Result) -> Void + handler: @escaping (Result) -> Void ) { spClient.postUSNatAction( actionType: action.type, @@ -932,7 +933,7 @@ class SourcepointClientCoordinator: SPClientCoordinator { func handleUSNatPostChoice( _ action: SPAction, - _ postResponse: USNatChoiceResponse + _ postResponse: SPUSNatConsent ) { state.usnat = SPUSNatConsent( uuid: postResponse.uuid, @@ -942,6 +943,7 @@ class SourcepointClientCoordinator: SPClientCoordinator { consentStrings: postResponse.consentStrings, webConsentPayload: postResponse.webConsentPayload, categories: postResponse.categories, + vendors: postResponse.vendors, consentStatus: postResponse.consentStatus, GPPData: postResponse.GPPData ) diff --git a/Example/ConsentViewController_ExampleTests/Helpers/SourcePointClientMock.swift b/Example/ConsentViewController_ExampleTests/Helpers/SourcePointClientMock.swift index d1e4115a6..9ff49934c 100644 --- a/Example/ConsentViewController_ExampleTests/Helpers/SourcePointClientMock.swift +++ b/Example/ConsentViewController_ExampleTests/Helpers/SourcePointClientMock.swift @@ -173,16 +173,7 @@ class SourcePointClientMock: SourcePointProtocol { if let error = error { handler(.failure(error)) } else { - handler(.success(USNatChoiceResponse( - uuid: "", - consentStrings: [], - categories: [], - dateCreated: .now(), - expirationDate: .distantFuture(), - webConsentPayload: nil, - consentStatus: .init(), - GPPData: nil - ))) + handler(.success(SPUSNatConsent.empty())) } } diff --git a/Example/ConsentViewController_ExampleTests/SPUSNatConsentSpec.swift b/Example/ConsentViewController_ExampleTests/SPUSNatConsentSpec.swift index 1cc242b5d..3ecb6ddfe 100644 --- a/Example/ConsentViewController_ExampleTests/SPUSNatConsentSpec.swift +++ b/Example/ConsentViewController_ExampleTests/SPUSNatConsentSpec.swift @@ -18,7 +18,7 @@ class SPUSNatConsentsSpec: QuickSpec { let consents = SPUSNatConsent.empty() expect(consents.uuid).to(beNil()) expect(consents.applies).to(beFalse()) - expect(consents.dateCreated.date.doubleValue).to(beCloseTo(SPDate(date: Date()).date.doubleValue, within: 0.001)) + expect(consents.dateCreated.date.doubleValue).to(beCloseTo(SPDate(date: Date()).date.doubleValue, within: 0.01)) } } @@ -33,7 +33,16 @@ class SPUSNatConsentsSpec: QuickSpec { "sectionName": "abc", "consentString": "xyz" }], - "categories": ["foo"], + "userConsents": { + "categories": [{ + "_id": "categoryId", + "consented": false + }], + "vendors": [{ + "_id": "vendorId", + "consented": false + }] + }, "consentStatus": { "granularStatus": {}, "hasConsentData": false @@ -44,16 +53,23 @@ class SPUSNatConsentsSpec: QuickSpec { } """.data(using: .utf8) } - let consent = try usnatConsents.decoded() as SPUSNatConsent - expect(consent.applies).to(beTrue()) - expect(consent.categories).to(equal(["foo"])) - expect(consent.GPPData).to(equal(try? SPJson(["foo": "bar"]))) - expect(consent.consentStrings).to(equal([ - .init(sectionId: 99, sectionName: "abc", consentString: "xyz") - ])) - expect(consent.dateCreated).to(equal(year: 2023, month: 2, day: 6)) - expect(consent.expirationDate).to(equal(year: 2024, month: 2, day: 6)) - expect(consent.consentStatus).to(equal(ConsentStatus())) + do { + let consent = try usnatConsents.decoded() as SPUSNatConsent + expect(consent.applies).to(beTrue()) + expect(consent.categories) + .to(equal([SPConsentable(id: "categoryId", consented: false)])) + expect(consent.vendors) + .to(equal([SPConsentable(id: "vendorId", consented: false)])) + expect(consent.GPPData).to(equal(try? SPJson(["foo": "bar"]))) + expect(consent.consentStrings).to(equal([ + .init(sectionId: 99, sectionName: "abc", consentString: "xyz") + ])) + expect(consent.dateCreated).to(equal(year: 2023, month: 2, day: 6)) + expect(consent.expirationDate).to(equal(year: 2024, month: 2, day: 6)) + expect(consent.consentStatus).to(equal(ConsentStatus())) + } catch { + fail(String(describing: error)) + } } } } diff --git a/Example/Pods/Pods.xcodeproj/project.pbxproj b/Example/Pods/Pods.xcodeproj/project.pbxproj index 9bfe0d349..4c985a66d 100644 --- a/Example/Pods/Pods.xcodeproj/project.pbxproj +++ b/Example/Pods/Pods.xcodeproj/project.pbxproj @@ -15,6 +15,7 @@ dependencies = ( ); name = "SwiftLint-tvOS"; + productName = "SwiftLint-tvOS"; }; 2B03D5FD26A26B7D62142EA4492AEB83 /* SwiftLint-iOS */ = { isa = PBXAggregateTarget; @@ -24,6 +25,7 @@ dependencies = ( ); name = "SwiftLint-iOS"; + productName = "SwiftLint-iOS"; }; B53D977A951AFC38B21751B706C1DF83 /* GoogleAppMeasurement */ = { isa = PBXAggregateTarget; @@ -36,6 +38,7 @@ FC588D82108B51C116AB0B4B464D867E /* PBXTargetDependency */, ); name = GoogleAppMeasurement; + productName = GoogleAppMeasurement; }; C49E7A4D59E5C8BE8DE9FB1EFB150185 /* FirebaseAnalytics */ = { isa = PBXAggregateTarget; @@ -51,6 +54,7 @@ B7B6B55B322247A5221031D55F367F94 /* PBXTargetDependency */, ); name = FirebaseAnalytics; + productName = FirebaseAnalytics; }; /* End PBXAggregateTarget section */ @@ -494,6 +498,8 @@ 81A4772029D1F00672FC8F908A05BA97 /* GULMutableDictionary.h in Headers */ = {isa = PBXBuildFile; fileRef = 6BDF28B84E1635F8A5CCAEB4D3050804 /* GULMutableDictionary.h */; settings = {ATTRIBUTES = (Public, ); }; }; 820789C75F28EC015B7F1F5E7496EBF4 /* GULAppEnvironmentUtil.h in Headers */ = {isa = PBXBuildFile; fileRef = CFDB002BCEA7A2FD31F6C45B2BFF0F41 /* GULAppEnvironmentUtil.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8221C3243E69AFA10D63DE5DBF3ECE26 /* jest.config.json in Resources */ = {isa = PBXBuildFile; fileRef = 07E526D9C6FA185C9EBA29FFB8D681E9 /* jest.config.json */; }; + 827232B82B90C681007404F8 /* SPConsentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 827232B72B90C681007404F8 /* SPConsentable.swift */; }; + 827232B92B90C681007404F8 /* SPConsentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 827232B72B90C681007404F8 /* SPConsentable.swift */; }; 82A39E5EA67419BEC50788B8DE8D4562 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F54D6FD8B3A521F41EA087531836AACA /* XCTest.framework */; }; 82EAD813D80FC5EA2E5F25C5A45BA548 /* GULNetworkLoggerProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 31F98225A1968206C29D32BFE7E69AA6 /* GULNetworkLoggerProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; 833B3A659800BF00F896450F23D44FA2 /* OSLogger.swift in Sources */ = {isa = PBXBuildFile; fileRef = B97CA195606DA6B8C08C101642C12D22 /* OSLogger.swift */; }; @@ -1553,7 +1559,7 @@ /* Begin PBXFileReference section */ 00F80061C7120EE361F564A6D6476680 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/CoreGraphics.framework; sourceTree = DEVELOPER_DIR; }; - 011250C167D6FD56B74F959013231318 /* GoogleAppMeasurement.xcframework */ = {isa = PBXFileReference; includeInIndex = 1; name = GoogleAppMeasurement.xcframework; path = Frameworks/GoogleAppMeasurement.xcframework; sourceTree = ""; }; + 011250C167D6FD56B74F959013231318 /* GoogleAppMeasurement.xcframework */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = wrapper.xcframework; name = GoogleAppMeasurement.xcframework; path = Frameworks/GoogleAppMeasurement.xcframework; sourceTree = ""; }; 012B0044B59FDC21FE90DD5FEF57615C /* SwiftLint-iOS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "SwiftLint-iOS.debug.xcconfig"; sourceTree = ""; }; 0151EDECB7E223838B996286E4D2E773 /* JSONView-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "JSONView-dummy.m"; sourceTree = ""; }; 015AF38F6AC28657A8B2399E1FD4759E /* GULKeychainUtils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GULKeychainUtils.h; path = GoogleUtilities/Environment/Public/GoogleUtilities/GULKeychainUtils.h; sourceTree = ""; }; @@ -1575,7 +1581,7 @@ 03F5EB877FFB63001B6192CC383E5F09 /* JSONView-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "JSONView-prefix.pch"; sourceTree = ""; }; 048CF10E8172C05C64B6F3463AA4621F /* CCPAPMConsentSnapshot.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CCPAPMConsentSnapshot.swift; sourceTree = ""; }; 04C9A2BCFAB0AB95391F3B28369E5D40 /* FIRApp.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRApp.h; path = FirebaseCore/Sources/Public/FirebaseCore/FIRApp.h; sourceTree = ""; }; - 04D06A7D3628B85F970735D585E63AA2 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; path = README.md; sourceTree = ""; }; + 04D06A7D3628B85F970735D585E63AA2 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; 04D2954D4860BBB8DCCDA25061E20C2E /* FirebaseInstallations.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FirebaseInstallations.h; path = FirebaseInstallations/Source/Library/Public/FirebaseInstallations/FirebaseInstallations.h; sourceTree = ""; }; 05044106AEDFD9332186CFBA40248CD9 /* GoogleAppMeasurement.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = GoogleAppMeasurement.debug.xcconfig; sourceTree = ""; }; 0567D8F5D7F03077C7CED88F79C4040F /* Pods-NativeMessageExampleUITests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-NativeMessageExampleUITests-frameworks.sh"; sourceTree = ""; }; @@ -1590,7 +1596,7 @@ 07119758DEF66ABD6130F19A222EC9B6 /* CwlBadInstructionException.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CwlBadInstructionException.swift; path = Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/CwlBadInstructionException.swift; sourceTree = ""; }; 072EF8245904C2AA54CB012A980F0384 /* Pods-SPGDPRExampleAppUITests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-SPGDPRExampleAppUITests-dummy.m"; sourceTree = ""; }; 076A20E06EB7842B12F00C4D8BCB082E /* FIROptions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIROptions.m; path = FirebaseCore/Sources/FIROptions.m; sourceTree = ""; }; - 07E526D9C6FA185C9EBA29FFB8D681E9 /* jest.config.json */ = {isa = PBXFileReference; includeInIndex = 1; path = jest.config.json; sourceTree = ""; }; + 07E526D9C6FA185C9EBA29FFB8D681E9 /* jest.config.json */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.json; path = jest.config.json; sourceTree = ""; }; 08086AFA263CF86A1FAA6DDF7EE8FFCE /* DownErrors.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DownErrors.swift; path = "Sources/Down/Enums & Options/DownErrors.swift"; sourceTree = ""; }; 08C9E6FF3A6261F8FEC62A8F111A6BB8 /* BeWithin.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeWithin.swift; path = Sources/Nimble/Matchers/BeWithin.swift; sourceTree = ""; }; 0A06DF5FE5185C1C71EF3D79E091D09A /* JSONView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = JSONView.swift; path = Sources/JSONView/JSONView.swift; sourceTree = ""; }; @@ -1641,7 +1647,7 @@ 189FCCEF2FC13FC800CC83DCB5AE6519 /* SPGDPRPartnersViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SPGDPRPartnersViewController.swift; sourceTree = ""; }; 18ABA809D78E619F182D0052F3E8988F /* Pods-SourcePointMetaAppUITests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-SourcePointMetaAppUITests-frameworks.sh"; sourceTree = ""; }; 18ADEFB99A8D039A24FD104EDDEDDC35 /* FIRDependency.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRDependency.h; path = FirebaseCore/Extension/FIRDependency.h; sourceTree = ""; }; - 193BD38C736D9960798A33B633B90269 /* pb_encode.c */ = {isa = PBXFileReference; includeInIndex = 1; path = pb_encode.c; sourceTree = ""; }; + 193BD38C736D9960798A33B633B90269 /* pb_encode.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; path = pb_encode.c; sourceTree = ""; }; 19610ED44EE056B8495C003FC72E4EAD /* GULAppDelegateSwizzler.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GULAppDelegateSwizzler.m; path = GoogleUtilities/AppDelegateSwizzler/GULAppDelegateSwizzler.m; sourceTree = ""; }; 19981FF664427CF23B14D7B2FEC1F933 /* Down-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Down-prefix.pch"; sourceTree = ""; }; 19D22D099E510FB18BB851851B8FD99E /* FBLPromise+Retry.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "FBLPromise+Retry.m"; path = "Sources/FBLPromises/FBLPromise+Retry.m"; sourceTree = ""; }; @@ -1658,7 +1664,7 @@ 1E0E097B86F032C72E47638F7CDF45C4 /* FIRLoggerLevel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRLoggerLevel.h; path = FirebaseCore/Sources/Public/FirebaseCore/FIRLoggerLevel.h; sourceTree = ""; }; 1E3433621B7239589FBE78E167595D7E /* _ObjC_HeartbeatController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = _ObjC_HeartbeatController.swift; path = FirebaseCore/Internal/Sources/HeartbeatLogging/_ObjC_HeartbeatController.swift; sourceTree = ""; }; 1E53E58F99BCA493A90B8AE0904C028D /* WHNavigationController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WHNavigationController.swift; path = Sources/Subclasses/WHNavigationController.swift; sourceTree = ""; }; - 1E7C90004D7661625BBF6921AC7EDAD4 /* ConsentViewController.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; path = ConsentViewController.podspec; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + 1E7C90004D7661625BBF6921AC7EDAD4 /* ConsentViewController.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; path = ConsentViewController.podspec; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 1EBBA27E7001092FFB59966FF46D704D /* FirebaseCore-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "FirebaseCore-Info.plist"; sourceTree = ""; }; 1EED6811B82AE041AB823784B6E55C55 /* AssertionDispatcher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AssertionDispatcher.swift; path = Sources/Nimble/Adapters/AssertionDispatcher.swift; sourceTree = ""; }; 1F325F4304CF652DC6C02A8BBBE9D51B /* ExampleMetadata.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExampleMetadata.swift; path = Sources/Quick/ExampleMetadata.swift; sourceTree = ""; }; @@ -1696,7 +1702,7 @@ 26EBC256F0D9D11C0D4D536C51BC0E44 /* IQToolbar.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQToolbar.swift; path = IQKeyboardManagerSwift/IQToolbar/IQToolbar.swift; sourceTree = ""; }; 28C38ECF38F43FDD0E0DF398D3694B03 /* XCTestObservationCenter+Register.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "XCTestObservationCenter+Register.m"; path = "Sources/NimbleObjectiveC/XCTestObservationCenter+Register.m"; sourceTree = ""; }; 2923DD1548FAC456F41F10370BCD80E5 /* CGRect+Helpers.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "CGRect+Helpers.swift"; path = "Sources/Down/AST/Styling/Helpers/Extensions/CGRect+Helpers.swift"; sourceTree = ""; }; - 296A8B31EF953FC3BB0341271FA521EC /* mach_excServer.c */ = {isa = PBXFileReference; includeInIndex = 1; name = mach_excServer.c; path = Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlMachBadInstructionHandler/mach_excServer.c; sourceTree = ""; }; + 296A8B31EF953FC3BB0341271FA521EC /* mach_excServer.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = mach_excServer.c; path = Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlMachBadInstructionHandler/mach_excServer.c; sourceTree = ""; }; 2987F90DB9AB9247989D0B5984CF5495 /* RequestTitleSectionView.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = RequestTitleSectionView.xib; path = Sources/UI/Sections/RequestTitleSectionView.xib; sourceTree = ""; }; 29EBCDC7292088B1049AD138456EAA56 /* Pods-SourcepointFirebaseDemoTests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-SourcepointFirebaseDemoTests-acknowledgements.plist"; sourceTree = ""; }; 29F27AB43D6FE4A12CF0B016FC527C91 /* ConsentStatusMetadata.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ConsentStatusMetadata.swift; sourceTree = ""; }; @@ -1732,7 +1738,7 @@ 333806333AADE99507E2AAAD86A62B03 /* FileHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FileHandler.swift; path = Sources/Utils/FileHandler.swift; sourceTree = ""; }; 3347A1AB6546F0A3977529B8F199DC41 /* PromisesObjC */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = PromisesObjC; path = FBLPromises.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 33870645273F20E4E36E777203CED80F /* Pods-ConsentViewController_Example */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-ConsentViewController_Example"; path = Pods_ConsentViewController_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 33EC1B962165C4568BBDBCBA1C5ED2C1 /* render.c */ = {isa = PBXFileReference; includeInIndex = 1; name = render.c; path = Sources/cmark/render.c; sourceTree = ""; }; + 33EC1B962165C4568BBDBCBA1C5ED2C1 /* render.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = render.c; path = Sources/cmark/render.c; sourceTree = ""; }; 3424175246109A209B6320F951D87220 /* Quick-tvOS-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "Quick-tvOS-prefix.pch"; path = "../Quick-tvOS/Quick-tvOS-prefix.pch"; sourceTree = ""; }; 34B05E09C731D551BD389194FDD1E4E3 /* Pods-NativeMessageExampleUITests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-NativeMessageExampleUITests.modulemap"; sourceTree = ""; }; 34D93CBBF5AB12775C805B38FB5E463C /* NimbleEnvironment.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NimbleEnvironment.swift; path = Sources/Nimble/Adapters/NimbleEnvironment.swift; sourceTree = ""; }; @@ -1780,7 +1786,7 @@ 3F6E61DD1E8781F1ED102E1AA96660E1 /* FirebaseCore.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FirebaseCore.debug.xcconfig; sourceTree = ""; }; 3F7F20006182254670C10FA0E8AF8FE9 /* FIRCurrentDateProvider.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRCurrentDateProvider.m; path = FirebaseInstallations/Source/Library/InstallationsIDController/FIRCurrentDateProvider.m; sourceTree = ""; }; 3F8C4AB6D648644664EA639940866BA8 /* GULNSData+zlib.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "GULNSData+zlib.m"; path = "GoogleUtilities/NSData+zlib/GULNSData+zlib.m"; sourceTree = ""; }; - 3FD75D0CE9E48F9C2D9DC56158355BC9 /* GoogleAppMeasurementIdentitySupport.xcframework */ = {isa = PBXFileReference; includeInIndex = 1; name = GoogleAppMeasurementIdentitySupport.xcframework; path = Frameworks/GoogleAppMeasurementIdentitySupport.xcframework; sourceTree = ""; }; + 3FD75D0CE9E48F9C2D9DC56158355BC9 /* GoogleAppMeasurementIdentitySupport.xcframework */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = wrapper.xcframework; name = GoogleAppMeasurementIdentitySupport.xcframework; path = Frameworks/GoogleAppMeasurementIdentitySupport.xcframework; sourceTree = ""; }; 3FDA6CA66FA0B04A3CD3CDD0729684BE /* SPUserDefaults.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SPUserDefaults.swift; sourceTree = ""; }; 402250DC5110A8CA51B8FFA9F0B4C6E4 /* FIRLogger.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRLogger.m; path = FirebaseCore/Sources/FIRLogger.m; sourceTree = ""; }; 4079842096853309347DF898C2417B70 /* FirebaseCoreInternal-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FirebaseCoreInternal-umbrella.h"; sourceTree = ""; }; @@ -1789,7 +1795,7 @@ 40DB3E8C2348CCD61F0B26526613B924 /* GoogleUtilities-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "GoogleUtilities-umbrella.h"; sourceTree = ""; }; 410AE20F24B21AF38CD392DE64304469 /* FIRInstallationsItem+RegisterInstallationAPI.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FIRInstallationsItem+RegisterInstallationAPI.h"; path = "FirebaseInstallations/Source/Library/InstallationsAPI/FIRInstallationsItem+RegisterInstallationAPI.h"; sourceTree = ""; }; 411F612750AC480C4FC3F0FB6C96FAA9 /* FIRInstallationsIIDTokenStore.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRInstallationsIIDTokenStore.h; path = FirebaseInstallations/Source/Library/IIDMigration/FIRInstallationsIIDTokenStore.h; sourceTree = ""; }; - 4175089E471DDAE23518B16B29F14126 /* FirebaseAnalytics.xcframework */ = {isa = PBXFileReference; includeInIndex = 1; name = FirebaseAnalytics.xcframework; path = Frameworks/FirebaseAnalytics.xcframework; sourceTree = ""; }; + 4175089E471DDAE23518B16B29F14126 /* FirebaseAnalytics.xcframework */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = wrapper.xcframework; name = FirebaseAnalytics.xcframework; path = Frameworks/FirebaseAnalytics.xcframework; sourceTree = ""; }; 41C4F21A721DC643F6F27B55649580F3 /* CustomHTTPProtocol.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CustomHTTPProtocol.swift; path = Sources/CustomHTTPProtocol.swift; sourceTree = ""; }; 42515639A7A1FEB5A3DBC0A8C4716EDE /* Nimble-tvOS.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; name = "Nimble-tvOS.modulemap"; path = "../Nimble-tvOS/Nimble-tvOS.modulemap"; sourceTree = ""; }; 4278C6CAC86CFB794B576E436A9805B5 /* SPCampaignType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SPCampaignType.swift; path = ConsentViewController/Classes/SPCampaignType.swift; sourceTree = ""; }; @@ -1846,10 +1852,10 @@ 4F0525A50E1AA354810CD5060A11F459 /* PromisesObjC.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = PromisesObjC.release.xcconfig; sourceTree = ""; }; 4F1D2C14B0860B70E89E5834C82B26C2 /* Down-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Down-Info.plist"; sourceTree = ""; }; 4F82BF3657117F5154467A181CBB937A /* PMCategoryManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PMCategoryManager.swift; sourceTree = ""; }; - 503F983CB31279D66245ED3DB06A8F69 /* images */ = {isa = PBXFileReference; includeInIndex = 1; name = images; path = ConsentViewController/Assets/images; sourceTree = ""; }; + 503F983CB31279D66245ED3DB06A8F69 /* images */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = images; path = ConsentViewController/Assets/images; sourceTree = ""; }; 50511099B7F70FE466BA3F57EEA061C1 /* Pods-ObjC-ExampleAppUITests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-ObjC-ExampleAppUITests.modulemap"; sourceTree = ""; }; 5055E8973100AE7FB35B38DCDFF4EEA7 /* CwlCatchException.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CwlCatchException.m; path = Carthage/Checkouts/CwlCatchException/Sources/CwlCatchExceptionSupport/CwlCatchException.m; sourceTree = ""; }; - 507BA7A83B0FB5153AE25D0E64083DC5 /* houdini_href_e.c */ = {isa = PBXFileReference; includeInIndex = 1; name = houdini_href_e.c; path = Sources/cmark/houdini_href_e.c; sourceTree = ""; }; + 507BA7A83B0FB5153AE25D0E64083DC5 /* houdini_href_e.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = houdini_href_e.c; path = Sources/cmark/houdini_href_e.c; sourceTree = ""; }; 50D2D1A019411C867883EBD9246CB04B /* IQUIScrollView+Additions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQUIScrollView+Additions.swift"; path = "IQKeyboardManagerSwift/Categories/IQUIScrollView+Additions.swift"; sourceTree = ""; }; 50F888CF97E66F5B1BAB35A2E2DB809C /* JSONView-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "JSONView-umbrella.h"; sourceTree = ""; }; 510925CF4993719A64DA67893F88EE67 /* Pods-SPGDPRExampleAppUITests */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-SPGDPRExampleAppUITests"; path = Pods_SPGDPRExampleAppUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -1911,10 +1917,10 @@ 5F9AEBBBDCB370283E19153952980A82 /* SPCCPAVendorDetailsViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SPCCPAVendorDetailsViewController.swift; sourceTree = ""; }; 5FF892C2A33F9AB0E8A3FEE4F2A3D6F7 /* Pods-NativePMExampleApp.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-NativePMExampleApp.modulemap"; sourceTree = ""; }; 6035415BCCF4AD0A320A11DEC3C344C0 /* SPGPPConfig.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SPGPPConfig.swift; path = ConsentViewController/Classes/SPGPPConfig.swift; sourceTree = ""; }; - 6063A0CA08B5FB06587689AB1771E8BC /* pb_decode.c */ = {isa = PBXFileReference; includeInIndex = 1; path = pb_decode.c; sourceTree = ""; }; + 6063A0CA08B5FB06587689AB1771E8BC /* pb_decode.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; path = pb_decode.c; sourceTree = ""; }; 615EC950C85E47C403797207201DE40B /* JSONTreeView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = JSONTreeView.swift; path = Sources/JSONView/JSONTreeView.swift; sourceTree = ""; }; 6181ACE13D08B95AA345A61F6B577A7E /* Nimble-tvOS-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "Nimble-tvOS-dummy.m"; path = "../Nimble-tvOS/Nimble-tvOS-dummy.m"; sourceTree = ""; }; - 61C52027A514C3026C3D554AA8A1703D /* SPJSReceiver.spec.js */ = {isa = PBXFileReference; includeInIndex = 1; path = SPJSReceiver.spec.js; sourceTree = ""; }; + 61C52027A514C3026C3D554AA8A1703D /* SPJSReceiver.spec.js */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.javascript; path = SPJSReceiver.spec.js; sourceTree = ""; }; 61E8AA37F8FBA3B26CB3A45D3EDF89D5 /* Image.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Image.swift; path = Sources/Down/AST/Nodes/Image.swift; sourceTree = ""; }; 6243F8B74D2E0A9FB82505B293D04B92 /* SPCCPAVendorDetailsViewController.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; path = SPCCPAVendorDetailsViewController.xib; sourceTree = ""; }; 62D40508CDA21AF1F60BA23CCD8E0B30 /* BeCloseTo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeCloseTo.swift; path = Sources/Nimble/Matchers/BeCloseTo.swift; sourceTree = ""; }; @@ -1923,7 +1929,7 @@ 634D301C87A48EA347E1D159C65A54A4 /* Colors.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Colors.swift; path = "Sources/Support Files/Colors.swift"; sourceTree = ""; }; 644CF7A767956850D4ED925BD98C11D7 /* ConsentViewController-tvOS-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; name = "ConsentViewController-tvOS-Info.plist"; path = "../ConsentViewController-tvOS/ConsentViewController-tvOS-Info.plist"; sourceTree = ""; }; 64E02CE947FD8E8F8C86FBF46EDC4CE1 /* Pods-SourcepointFirebaseDemoUITests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-SourcepointFirebaseDemoUITests-acknowledgements.plist"; sourceTree = ""; }; - 654D1DA819D605BC2D567C2E11680D73 /* houdini_html_u.c */ = {isa = PBXFileReference; includeInIndex = 1; name = houdini_html_u.c; path = Sources/cmark/houdini_html_u.c; sourceTree = ""; }; + 654D1DA819D605BC2D567C2E11680D73 /* houdini_html_u.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = houdini_html_u.c; path = Sources/cmark/houdini_html_u.c; sourceTree = ""; }; 65652B75D8482B32265953F8948A9058 /* Styler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Styler.swift; path = Sources/Down/AST/Styling/Stylers/Styler.swift; sourceTree = ""; }; 6580FBCB1C422F94727F2BBED28A0230 /* SPCCPANativePrivacyManagerViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SPCCPANativePrivacyManagerViewController.swift; sourceTree = ""; }; 65B094540F2DBDA999D027097AC3DD3C /* Pods-SourcepointFirebaseDemoTests */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-SourcepointFirebaseDemoTests"; path = Pods_SourcepointFirebaseDemoTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -1942,7 +1948,7 @@ 69C7A2FDE02741DB3CA92165A22429F5 /* SPPrivacyPolicyViewController.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; path = SPPrivacyPolicyViewController.xib; sourceTree = ""; }; 6A469A63A79B8934E018F2739BA7F22B /* BeLessThanOrEqual.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeLessThanOrEqual.swift; path = Sources/Nimble/Matchers/BeLessThanOrEqual.swift; sourceTree = ""; }; 6AEF4767763535F0697C01F12245B3C7 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; - 6B4314FE8DD2B8E00DA49D2B47825BD5 /* html.c */ = {isa = PBXFileReference; includeInIndex = 1; name = html.c; path = Sources/cmark/html.c; sourceTree = ""; }; + 6B4314FE8DD2B8E00DA49D2B47825BD5 /* html.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = html.c; path = Sources/cmark/html.c; sourceTree = ""; }; 6BDF28B84E1635F8A5CCAEB4D3050804 /* GULMutableDictionary.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GULMutableDictionary.h; path = GoogleUtilities/Network/Public/GoogleUtilities/GULMutableDictionary.h; sourceTree = ""; }; 6C617555A66F9C3082AACA071E1FCB25 /* BlockQuote.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BlockQuote.swift; path = Sources/Down/AST/Nodes/BlockQuote.swift; sourceTree = ""; }; 6C7B094A5C99222FA474F1C83D65A19D /* FBLPromise.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBLPromise.m; path = Sources/FBLPromises/FBLPromise.m; sourceTree = ""; }; @@ -1987,7 +1993,7 @@ 7773CC8239ED259F587A7E2C0DA20F52 /* IQInvocation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQInvocation.swift; path = IQKeyboardManagerSwift/IQToolbar/IQInvocation.swift; sourceTree = ""; }; 783517CE453A49764EE085017DE5AD44 /* Pods-SourcepointFirebaseDemoUITests-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-SourcepointFirebaseDemoUITests-Info.plist"; sourceTree = ""; }; 78624810BFFBD980C011664E6B506850 /* SimpleClient.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SimpleClient.swift; sourceTree = ""; }; - 788B495A765462E25E07E6CCCDB7ED30 /* latex.c */ = {isa = PBXFileReference; includeInIndex = 1; name = latex.c; path = Sources/cmark/latex.c; sourceTree = ""; }; + 788B495A765462E25E07E6CCCDB7ED30 /* latex.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = latex.c; path = Sources/cmark/latex.c; sourceTree = ""; }; 78968672630394D48E10EB1C65ED4DE1 /* IQKeyboardManagerConstants.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardManagerConstants.swift; path = IQKeyboardManagerSwift/Constants/IQKeyboardManagerConstants.swift; sourceTree = ""; }; 78BE3B26DD953BDBEB3255708EB6A134 /* Pods-SourcePointMetaAppUITests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-SourcePointMetaAppUITests-acknowledgements.plist"; sourceTree = ""; }; 79856B20A7A56B5BAD69D9B3B36C3C88 /* PromisesObjC.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = PromisesObjC.modulemap; sourceTree = ""; }; @@ -1999,7 +2005,7 @@ 7C301E1306B3BA0BB613E0E7294AEE10 /* SPFocusableTextView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SPFocusableTextView.swift; sourceTree = ""; }; 7C8C89404C773BC73040A0BD437BE51F /* BeginWithPrefix.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeginWithPrefix.swift; path = Sources/Nimble/Matchers/BeginWithPrefix.swift; sourceTree = ""; }; 7D1C0F2AFBE0D1A48CE53E4966CF3CAC /* pb_common.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = pb_common.h; sourceTree = ""; }; - 7D2896CEFC9B3C7D61DDCC6417B18A80 /* cmark_ctype.c */ = {isa = PBXFileReference; includeInIndex = 1; name = cmark_ctype.c; path = Sources/cmark/cmark_ctype.c; sourceTree = ""; }; + 7D2896CEFC9B3C7D61DDCC6417B18A80 /* cmark_ctype.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = cmark_ctype.c; path = Sources/cmark/cmark_ctype.c; sourceTree = ""; }; 7D56FBC2CDC242973E518D559A423907 /* RequestResponseExportOption.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RequestResponseExportOption.swift; path = Sources/Utils/RequestResponseExportOption.swift; sourceTree = ""; }; 7D80B19F6A25288317F8D3C6F0A50EF0 /* SPMessageUIDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SPMessageUIDelegate.swift; path = ConsentViewController/Classes/SPMessageUIDelegate.swift; sourceTree = ""; }; 7E632D167433BCD6AF5BF0B700309DC0 /* Item.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Item.swift; path = Sources/Down/AST/Nodes/Item.swift; sourceTree = ""; }; @@ -2014,6 +2020,7 @@ 80A021AF7392E39FF9B8DF1D1F831F72 /* QuickSpecBase.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QuickSpecBase.h; path = Sources/QuickObjCRuntime/include/QuickSpecBase.h; sourceTree = ""; }; 812282451C707EFD7A0686F2713E9090 /* Expression.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Expression.swift; path = Sources/Nimble/Expression.swift; sourceTree = ""; }; 823BB0A4FBEA705190163CEE1628AB38 /* Pods-NativePMExampleApp-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-NativePMExampleApp-dummy.m"; sourceTree = ""; }; + 827232B72B90C681007404F8 /* SPConsentable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SPConsentable.swift; sourceTree = ""; }; 829CB2456B0D04C6E2684753D1625FFC /* SPSDK.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SPSDK.swift; path = ConsentViewController/Classes/SPSDK.swift; sourceTree = ""; }; 82E8CD49934B78CC6DF2A34CBB2C92ED /* Quick.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Quick.h; path = Sources/QuickObjectiveC/Quick.h; sourceTree = ""; }; 835AEB06751B372764C9973A0021501C /* FIRVersion.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRVersion.h; path = FirebaseCore/Sources/Public/FirebaseCore/FIRVersion.h; sourceTree = ""; }; @@ -2021,10 +2028,10 @@ 838BC7D1D26449FAA4D044B545B23A57 /* WHTableView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WHTableView.swift; path = Sources/Subclasses/WHTableView.swift; sourceTree = ""; }; 83D1EA58E568A600180411B6CBE26FD7 /* pb_decode.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = pb_decode.h; sourceTree = ""; }; 83D88FB9B1684F598E58516854F86BDF /* SPGDPRCategoryDetailsViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SPGDPRCategoryDetailsViewController.swift; sourceTree = ""; }; - 8409986CD727BCC9CB009090689DABAF /* inlines.c */ = {isa = PBXFileReference; includeInIndex = 1; name = inlines.c; path = Sources/cmark/inlines.c; sourceTree = ""; }; + 8409986CD727BCC9CB009090689DABAF /* inlines.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = inlines.c; path = Sources/cmark/inlines.c; sourceTree = ""; }; 848E51ADB95C3B7204B2F6C309D76783 /* Wormholy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Wormholy.swift; path = Sources/Wormholy.swift; sourceTree = ""; }; 855B19DD8DE4F1E1E4D17263336F7484 /* CwlDarwinDefinitions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CwlDarwinDefinitions.swift; path = Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/CwlDarwinDefinitions.swift; sourceTree = ""; }; - 85E4E5347921A642A0075B4371ED3DCC /* cmark.c */ = {isa = PBXFileReference; includeInIndex = 1; name = cmark.c; path = Sources/cmark/cmark.c; sourceTree = ""; }; + 85E4E5347921A642A0075B4371ED3DCC /* cmark.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = cmark.c; path = Sources/cmark/cmark.c; sourceTree = ""; }; 86475760256BD264A96EDD0F3F9F2AB6 /* Quick-iOS-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Quick-iOS-umbrella.h"; sourceTree = ""; }; 86BB8D6EC3B7DBD02E547A66135695E6 /* ExampleHooks.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExampleHooks.swift; path = Sources/Quick/Hooks/ExampleHooks.swift; sourceTree = ""; }; 87C7F5FF8EE61EE889C25067CBA96684 /* Quick-iOS-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Quick-iOS-prefix.pch"; sourceTree = ""; }; @@ -2032,7 +2039,7 @@ 87F52123A0B2F891277E0CFF9A267D9B /* Pods-AuthExample */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-AuthExample"; path = Pods_AuthExample.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 88055A9347CEDC17788E37BCAA86EA72 /* LastMessageData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = LastMessageData.swift; sourceTree = ""; }; 880952C8D5B63E2144C97BFB79B77388 /* IQUIViewController+Additions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQUIViewController+Additions.swift"; path = "IQKeyboardManagerSwift/Categories/IQUIViewController+Additions.swift"; sourceTree = ""; }; - 88999BBDDE6D5572D19CC5D947BB0C56 /* utf8.c */ = {isa = PBXFileReference; includeInIndex = 1; name = utf8.c; path = Sources/cmark/utf8.c; sourceTree = ""; }; + 88999BBDDE6D5572D19CC5D947BB0C56 /* utf8.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = utf8.c; path = Sources/cmark/utf8.c; sourceTree = ""; }; 891D7EDA82F0873DF7DA43EB71A279B4 /* FBLPromise+Async.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBLPromise+Async.h"; path = "Sources/FBLPromises/include/FBLPromise+Async.h"; sourceTree = ""; }; 897A13614A3CB513ECB1D6A2418001C6 /* Pods-ObjC-ExampleApp-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-ObjC-ExampleApp-acknowledgements.markdown"; sourceTree = ""; }; 8996F0BD6F6E35647FA87ACD82FCA9C4 /* StorageFactory.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StorageFactory.swift; path = FirebaseCore/Internal/Sources/HeartbeatLogging/StorageFactory.swift; sourceTree = ""; }; @@ -2065,7 +2072,7 @@ 9106A47221A6CCF0578065DECE2D44D5 /* BeLogical.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeLogical.swift; path = Sources/Nimble/Matchers/BeLogical.swift; sourceTree = ""; }; 910C85D5C27A92ABD5756D216CB9BE69 /* SPError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SPError.swift; path = ConsentViewController/Classes/SPError.swift; sourceTree = ""; }; 911FC3A808A79C8ADE6CC7D475281FFA /* Nimble-iOS-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Nimble-iOS-prefix.pch"; sourceTree = ""; }; - 912E6C0F265356D30D196C2E8C4A3991 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; path = LICENSE; sourceTree = ""; }; + 912E6C0F265356D30D196C2E8C4A3991 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = LICENSE; sourceTree = ""; }; 91DBCF8F1B0C642541FDCDFB1987A1B8 /* JSONView.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = JSONView.modulemap; sourceTree = ""; }; 91EC033E28FFAA49DC0AAC9DDA00B838 /* Quick-tvOS-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "Quick-tvOS-umbrella.h"; path = "../Quick-tvOS/Quick-tvOS-umbrella.h"; sourceTree = ""; }; 92256FEE452E5A337BAEF968E655D8E3 /* QuickConfiguration.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QuickConfiguration.h; path = Sources/QuickObjectiveC/Configuration/QuickConfiguration.h; sourceTree = ""; }; @@ -2112,11 +2119,11 @@ 9D7418672C87543A4D6973EE239F08F4 /* Pods-SourcepointFirebaseDemo-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-SourcepointFirebaseDemo-umbrella.h"; sourceTree = ""; }; 9D76D2AAF759795F17D78BD9B137FB61 /* Pods-ObjC-ExampleAppUITests */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-ObjC-ExampleAppUITests"; path = Pods_ObjC_ExampleAppUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 9D7839C579A6D3FDBBDD39CF0AB92E30 /* SPString.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SPString.swift; sourceTree = ""; }; - 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 9DD461F5BB900E6EDAB0D4EAB1115806 /* Nimble-iOS-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Nimble-iOS-dummy.m"; sourceTree = ""; }; 9E4925D972BBEC2DD040B1B8B4B96C8A /* Heartbeat.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Heartbeat.swift; path = FirebaseCore/Internal/Sources/HeartbeatLogging/Heartbeat.swift; sourceTree = ""; }; 9EB2F9EED14929822333762D1C5563B2 /* DownOptions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DownOptions.swift; path = "Sources/Down/Enums & Options/DownOptions.swift"; sourceTree = ""; }; - 9F43E1611CB6638C9CB84A149A24C085 /* commonmark.c */ = {isa = PBXFileReference; includeInIndex = 1; name = commonmark.c; path = Sources/cmark/commonmark.c; sourceTree = ""; }; + 9F43E1611CB6638C9CB84A149A24C085 /* commonmark.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = commonmark.c; path = Sources/cmark/commonmark.c; sourceTree = ""; }; 9F5A6A84153262E1A7653A7F3C68C668 /* JSONCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = JSONCell.swift; path = Sources/JSONView/JSONCell.swift; sourceTree = ""; }; 9F9B3BEAADC88431BD737E39B3781EB3 /* FirebaseAnalytics.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FirebaseAnalytics.release.xcconfig; sourceTree = ""; }; 9FEE13261BD7CA719A46C136DA2AB465 /* RequestCell.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = RequestCell.xib; path = Sources/UI/Cells/RequestCell.xib; sourceTree = ""; }; @@ -2144,9 +2151,9 @@ A6210F86D03E81F35B5AEB28EC2409C1 /* GULNetworkMessageCode.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GULNetworkMessageCode.h; path = GoogleUtilities/Network/Public/GoogleUtilities/GULNetworkMessageCode.h; sourceTree = ""; }; A6269878A27EDC4666AFB9AD83918373 /* GoogleUtilities.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = GoogleUtilities.debug.xcconfig; sourceTree = ""; }; A6B2052B3E1ABACA6645981AD6FB5592 /* SPWebMessageViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SPWebMessageViewController.swift; sourceTree = ""; }; - A7522BCB84DF53C190B89387EC567C23 /* houdini_html_e.c */ = {isa = PBXFileReference; includeInIndex = 1; name = houdini_html_e.c; path = Sources/cmark/houdini_html_e.c; sourceTree = ""; }; + A7522BCB84DF53C190B89387EC567C23 /* houdini_html_e.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = houdini_html_e.c; path = Sources/cmark/houdini_html_e.c; sourceTree = ""; }; A76569E4BC224EE547CF2BC90CF27EEE /* Nimble-tvOS-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; name = "Nimble-tvOS-Info.plist"; path = "../Nimble-tvOS/Nimble-tvOS-Info.plist"; sourceTree = ""; }; - A779FF010843DA3272F8E81D624079E8 /* xml.c */ = {isa = PBXFileReference; includeInIndex = 1; name = xml.c; path = Sources/cmark/xml.c; sourceTree = ""; }; + A779FF010843DA3272F8E81D624079E8 /* xml.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = xml.c; path = Sources/cmark/xml.c; sourceTree = ""; }; A7EC6B41BC3C2E7F21DBB4DA11480582 /* InputStream+Utils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "InputStream+Utils.swift"; path = "Sources/Utils/InputStream+Utils.swift"; sourceTree = ""; }; A8361774D693350A9CA19D81B8455CB3 /* ListItemParagraphStyler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ListItemParagraphStyler.swift; path = Sources/Down/AST/Styling/Helpers/ListItemParagraphStyler.swift; sourceTree = ""; }; A87C875792C9D30319EFBF4B664A20C5 /* IQUITextFieldView+Additions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQUITextFieldView+Additions.swift"; path = "IQKeyboardManagerSwift/Categories/IQUITextFieldView+Additions.swift"; sourceTree = ""; }; @@ -2217,7 +2224,7 @@ BAACD743ED810C40D9DE3F732889C4BD /* SPPrivacyManagerRequestResponse.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SPPrivacyManagerRequestResponse.swift; sourceTree = ""; }; BAACF4B18C671D0CC1E3BD4EA9B5DFFB /* FIROptionsInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIROptionsInternal.h; path = FirebaseCore/Extension/FIROptionsInternal.h; sourceTree = ""; }; BAB973A84CCB907626D0300E5C51C0D2 /* PMVendorManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PMVendorManager.swift; sourceTree = ""; }; - BAE3CEDE01D9CA6C7496CC68B9D56854 /* references.c */ = {isa = PBXFileReference; includeInIndex = 1; name = references.c; path = Sources/cmark/references.c; sourceTree = ""; }; + BAE3CEDE01D9CA6C7496CC68B9D56854 /* references.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = references.c; path = Sources/cmark/references.c; sourceTree = ""; }; BB7486BC0EC58E71C53B0CBF25F66B78 /* FIRLogger.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRLogger.h; path = FirebaseCore/Extension/FIRLogger.h; sourceTree = ""; }; BBF3967F04E07A2D93D516495A762196 /* ConsentViewController-iOS-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ConsentViewController-iOS-prefix.pch"; sourceTree = ""; }; BC19E98BD045D5D947DE61A4238386D1 /* SPPrivacyPolicyViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SPPrivacyPolicyViewController.swift; sourceTree = ""; }; @@ -2254,7 +2261,7 @@ C59FFE7A487BA64060237FB14CE6D985 /* Wormholy-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Wormholy-umbrella.h"; sourceTree = ""; }; C5E7A49277E381146607DACF074FD3F9 /* SPPropertyName.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SPPropertyName.swift; path = ConsentViewController/Classes/SPPropertyName.swift; sourceTree = ""; }; C62C49F09C3DE8324432B2DA6604E3DD /* FirebaseInstallations.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = FirebaseInstallations.modulemap; sourceTree = ""; }; - C62DBEA8BE9AFF6A42D82D057B21053A /* node.c */ = {isa = PBXFileReference; includeInIndex = 1; name = node.c; path = Sources/cmark/node.c; sourceTree = ""; }; + C62DBEA8BE9AFF6A42D82D057B21053A /* node.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = node.c; path = Sources/cmark/node.c; sourceTree = ""; }; C693E12EE29853137459B1B5F0EFD107 /* Example.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Example.swift; path = Sources/Quick/Example.swift; sourceTree = ""; }; C6A504C136BF51A79244FE93F361068A /* Quick-iOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Quick-iOS.release.xcconfig"; sourceTree = ""; }; C737EDF1F627815F3D09CD27BD12C438 /* Quick-tvOS-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "Quick-tvOS-dummy.m"; path = "../Quick-tvOS/Quick-tvOS-dummy.m"; sourceTree = ""; }; @@ -2271,7 +2278,7 @@ CAB9BBFEDDB530AA78B886D381398C61 /* ShareUtils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ShareUtils.swift; path = Sources/Utils/ShareUtils.swift; sourceTree = ""; }; CABBBA02EE0A14F054457A30674A2006 /* Closures.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Closures.swift; path = Sources/Quick/Hooks/Closures.swift; sourceTree = ""; }; CAEA285DACFED563DC456C78F35A66CF /* Pods-SourcePointMetaAppUITests */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-SourcePointMetaAppUITests"; path = Pods_SourcePointMetaAppUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - CAF2A50450CB7FA7B68803FA5EE1F101 /* blocks.c */ = {isa = PBXFileReference; includeInIndex = 1; name = blocks.c; path = Sources/cmark/blocks.c; sourceTree = ""; }; + CAF2A50450CB7FA7B68803FA5EE1F101 /* blocks.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = blocks.c; path = Sources/cmark/blocks.c; sourceTree = ""; }; CB1E8130A0EB34D5840F6FEAD4ACE519 /* PromisesObjC-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "PromisesObjC-dummy.m"; sourceTree = ""; }; CB2DDF876C1A9BCCA8D5FEAFF3FD9DAD /* FirebaseCore.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = FirebaseCore.modulemap; sourceTree = ""; }; CC92BE6BEC5AE4E6987CF130B07C8059 /* XCTestSuite+QuickTestSuiteBuilder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "XCTestSuite+QuickTestSuiteBuilder.m"; path = "Sources/QuickObjectiveC/XCTestSuite+QuickTestSuiteBuilder.m"; sourceTree = ""; }; @@ -2298,7 +2305,7 @@ D21E8F0AE7380CE7603E0BC3295D1B7F /* SPURLExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SPURLExtensions.swift; sourceTree = ""; }; D23402CC8C785F6B05479C66A3873FF9 /* SPGCMData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SPGCMData.swift; sourceTree = ""; }; D28E5EDB70893A4A6EEF8829859DA5DC /* Behavior.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Behavior.swift; path = Sources/Quick/Behavior.swift; sourceTree = ""; }; - D2DC07F141967AEA6C2CECADBFB6CC19 /* iterator.c */ = {isa = PBXFileReference; includeInIndex = 1; name = iterator.c; path = Sources/cmark/iterator.c; sourceTree = ""; }; + D2DC07F141967AEA6C2CECADBFB6CC19 /* iterator.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = iterator.c; path = Sources/cmark/iterator.c; sourceTree = ""; }; D3380B653F1390A9C078B80ECA50A50E /* Pods-NativePMExampleApp */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-NativePMExampleApp"; path = Pods_NativePMExampleApp.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D354E8FCB2A93ECF244E55EAF6B7141E /* Storage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Storage.swift; path = Sources/Storage.swift; sourceTree = ""; }; D3EB6861AE0740A4E5C5C03971F25838 /* FIRComponentContainer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRComponentContainer.m; path = FirebaseCore/Sources/FIRComponentContainer.m; sourceTree = ""; }; @@ -2318,8 +2325,8 @@ D9CDCACC12D9694839D6683231A37DA9 /* IsAppEncrypted.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IsAppEncrypted.m; path = third_party/IsAppEncrypted/IsAppEncrypted.m; sourceTree = ""; }; D9DB721DD3487B80F47D9E6F4A411B30 /* Pods-SourcePointMetaAppUITests-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-SourcePointMetaAppUITests-Info.plist"; sourceTree = ""; }; D9F543E025F81A296500029F0873EA1E /* Pods-ConsentViewController_Example.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-ConsentViewController_Example.modulemap"; sourceTree = ""; }; - DA3299CF312F7DC2ED8191B551CD6163 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = ConsentViewController/Assets/PrivacyInfo.xcprivacy; sourceTree = ""; }; - DA7106DFCE104F79A67F0EDD336240BF /* javascript */ = {isa = PBXFileReference; includeInIndex = 1; name = javascript; path = ConsentViewController/Assets/javascript; sourceTree = ""; }; + DA3299CF312F7DC2ED8191B551CD6163 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xml; name = PrivacyInfo.xcprivacy; path = ConsentViewController/Assets/PrivacyInfo.xcprivacy; sourceTree = ""; }; + DA7106DFCE104F79A67F0EDD336240BF /* javascript */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = javascript; path = ConsentViewController/Assets/javascript; sourceTree = ""; }; DA8951391DC8E7D492848C16A38A0A8D /* DSL.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DSL.h; path = Sources/NimbleObjectiveC/DSL.h; sourceTree = ""; }; DAA2621711E886E800A7489064C56071 /* FBLPromiseError.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBLPromiseError.m; path = Sources/FBLPromises/FBLPromiseError.m; sourceTree = ""; }; DAD2AF57A92E8FB90F570686EBC7AFB4 /* IQKeyboardManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardManager.swift; path = IQKeyboardManagerSwift/IQKeyboardManager.swift; sourceTree = ""; }; @@ -2337,7 +2344,7 @@ DEE50ADA3950FC48B58EA029ACE5F89C /* SPCCPAPartnersViewController.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; path = SPCCPAPartnersViewController.xib; sourceTree = ""; }; DF1F3CF79FD75885F08F709891ABEFAE /* FIRInstallationsStore.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRInstallationsStore.m; path = FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStore.m; sourceTree = ""; }; DF615FB6DAA4EB86C161C153301DBC23 /* Date.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Date.swift; sourceTree = ""; }; - DF6A838354B2A6DF747C568749988C65 /* man.c */ = {isa = PBXFileReference; includeInIndex = 1; name = man.c; path = Sources/cmark/man.c; sourceTree = ""; }; + DF6A838354B2A6DF747C568749988C65 /* man.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = man.c; path = Sources/cmark/man.c; sourceTree = ""; }; DF9F4C8E8A579A803A1EC311900B29C1 /* Pods-ConsentViewController_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ConsentViewController_Example.release.xcconfig"; sourceTree = ""; }; DFC4BB04494B9771085D43C1CECDD1E6 /* cmark_ctype.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = cmark_ctype.h; path = Sources/cmark/cmark_ctype.h; sourceTree = ""; }; DFC7E9A0D0097047D20824C75A511781 /* GULNetworkConstants.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GULNetworkConstants.h; path = GoogleUtilities/Network/Public/GoogleUtilities/GULNetworkConstants.h; sourceTree = ""; }; @@ -2358,7 +2365,7 @@ E585C8AEE969C254AE99510D4042CE43 /* Pods-SourcepointFirebaseDemoUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-SourcepointFirebaseDemoUITests.release.xcconfig"; sourceTree = ""; }; E592508187E4457ADB4BAAFA7021A7CE /* nanopb-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "nanopb-prefix.pch"; sourceTree = ""; }; E5B8BA903C1D7D18432999F000ED44A7 /* ConsentViewController-iOS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "ConsentViewController-iOS.debug.xcconfig"; sourceTree = ""; }; - E631E03AFBADB58BFE11B577AC02EB16 /* SPJSReceiver.js */ = {isa = PBXFileReference; includeInIndex = 1; path = SPJSReceiver.js; sourceTree = ""; }; + E631E03AFBADB58BFE11B577AC02EB16 /* SPJSReceiver.js */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.javascript; path = SPJSReceiver.js; sourceTree = ""; }; E67B2D7DCF158BAE2A06D2659148F538 /* Pods-ConsentViewController_ExampleTests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-ConsentViewController_ExampleTests-dummy.m"; sourceTree = ""; }; E6B288D4B89041C3B9EE7A93F53B773D /* Pods-AuthExampleUITests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-AuthExampleUITests-frameworks.sh"; sourceTree = ""; }; E6C8548894483748AD346B886D44BB3D /* FIRInstallationsAuthTokenResult.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FIRInstallationsAuthTokenResult.h; path = FirebaseInstallations/Source/Library/Public/FirebaseInstallations/FIRInstallationsAuthTokenResult.h; sourceTree = ""; }; @@ -2371,7 +2378,7 @@ E81A3E33DACB7DD7AC6711DA2AA24A28 /* FirebaseCoreInternal-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FirebaseCoreInternal-prefix.pch"; sourceTree = ""; }; E86A0559B15439254D973AB96C10B9B1 /* Wormholy-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Wormholy-Info.plist"; sourceTree = ""; }; E8FA942B27480E19F7DFD145CBF0E9C8 /* FIRComponentType.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FIRComponentType.m; path = FirebaseCore/Sources/FIRComponentType.m; sourceTree = ""; }; - E921483DC3DB79C81973CEDAA838060E /* pb_common.c */ = {isa = PBXFileReference; includeInIndex = 1; path = pb_common.c; sourceTree = ""; }; + E921483DC3DB79C81973CEDAA838060E /* pb_common.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; path = pb_common.c; sourceTree = ""; }; E9A5C96C37DF82808EC2DF4E0926CC5D /* SP_Icon.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; path = SP_Icon.png; sourceTree = ""; }; E9B3EF97AEB895A72B59F4915E5132FC /* Pods-SourcepointFirebaseDemoUITests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-SourcepointFirebaseDemoUITests-frameworks.sh"; sourceTree = ""; }; EB14ED6A22BC62BBDB29672ABD11F453 /* Pods-NativePMExampleApp-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-NativePMExampleApp-umbrella.h"; sourceTree = ""; }; @@ -2381,7 +2388,7 @@ EC2B33F423C20F015C2D99372AFE5EBC /* SwiftLint-iOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "SwiftLint-iOS.release.xcconfig"; sourceTree = ""; }; EC72818AE6A83FBD07A880EFCBE2BBEB /* Async.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Async.swift; path = Sources/Nimble/Matchers/Async.swift; sourceTree = ""; }; EC79BBF275704BE0010F4DA79F3C6F99 /* ListItemOptions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ListItemOptions.swift; path = Sources/Down/AST/Styling/Options/ListItemOptions.swift; sourceTree = ""; }; - ED01BA23C4580E4D27A568B443813AF4 /* buffer.c */ = {isa = PBXFileReference; includeInIndex = 1; name = buffer.c; path = Sources/cmark/buffer.c; sourceTree = ""; }; + ED01BA23C4580E4D27A568B443813AF4 /* buffer.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = buffer.c; path = Sources/cmark/buffer.c; sourceTree = ""; }; ED329E9D092192CEF8D52268EFDFC509 /* IQKeyboardManager+Debug.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardManager+Debug.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager+Debug.swift"; sourceTree = ""; }; ED4D1991B041CFDF01F125B8C364F24F /* QuickSpec.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QuickSpec.h; path = Sources/QuickObjectiveC/QuickSpec.h; sourceTree = ""; }; EDC72AA9D84CB33825B571461330F071 /* FirebaseCoreInternal.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = FirebaseCoreInternal.modulemap; sourceTree = ""; }; @@ -2447,7 +2454,7 @@ FEE85D4203FE370624D0F0D855849B6D /* GULNetwork.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GULNetwork.m; path = GoogleUtilities/Network/GULNetwork.m; sourceTree = ""; }; FEFFCC9C168DFC6C5CCE60B8B8470AF6 /* DownCommonMarkRenderable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DownCommonMarkRenderable.swift; path = Sources/Down/Renderers/DownCommonMarkRenderable.swift; sourceTree = ""; }; FF00D5F12037A9AF99C06FB05442AFA7 /* FirebaseInstallations.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FirebaseInstallations.release.xcconfig; sourceTree = ""; }; - FF9402036CDC82F24DFC5363D0B8FF38 /* scanners.c */ = {isa = PBXFileReference; includeInIndex = 1; name = scanners.c; path = Sources/cmark/scanners.c; sourceTree = ""; }; + FF9402036CDC82F24DFC5363D0B8FF38 /* scanners.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = scanners.c; path = Sources/cmark/scanners.c; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -2786,7 +2793,6 @@ 8CA972B687FE5BDA75FB16B4D09DFA1C /* Support Files */, B4E230576101B5BBB364761A8CBC5E2D /* WithoutAdIdSupport */, ); - name = GoogleAppMeasurement; path = GoogleAppMeasurement; sourceTree = ""; }; @@ -2833,7 +2839,6 @@ 44883F494021E80E1FDDC7330D526C3C /* Resources */, 94E82FEC09C63A4C58F5B7621B34CB89 /* Support Files */, ); - name = Wormholy; path = Wormholy; sourceTree = ""; }; @@ -2882,7 +2887,6 @@ 9268DCFD1D5E6CF6F70387B9789FD1E4 /* Support Files */, 621C96E7DD12F95CBCD4468DD03655CB /* UserDefaults */, ); - name = GoogleUtilities; path = GoogleUtilities; sourceTree = ""; }; @@ -2953,7 +2957,6 @@ BD848B2C7F1AE325114C13A3A18D56E0 /* Data */, 5D8EEDF483C80D2393501D64BDE1AB23 /* GDPR */, ); - name = NativePrivacyManager; path = NativePrivacyManager; sourceTree = ""; }; @@ -3070,7 +3073,6 @@ 0A06DF5FE5185C1C71EF3D79E091D09A /* JSONView.swift */, CB90F025AB6FE1131360BBE325968261 /* Support Files */, ); - name = JSONView; path = JSONView; sourceTree = ""; }; @@ -3112,7 +3114,6 @@ CC92BE6BEC5AE4E6987CF130B07C8059 /* XCTestSuite+QuickTestSuiteBuilder.m */, 080A2FA3F53FE0FE1CB5CC25FDD2F268 /* Support Files */, ); - name = Quick; path = Quick; sourceTree = ""; }; @@ -3193,7 +3194,6 @@ 28C38ECF38F43FDD0E0DF398D3694B03 /* XCTestObservationCenter+Register.m */, 92F31F8BBB11CFC2177F1148DEA7F866 /* Support Files */, ); - name = Nimble; path = Nimble; sourceTree = ""; }; @@ -3299,7 +3299,6 @@ F0401A2F5D751ADE28A76C7994D614A6 /* SPGDPRVendorDetailsViewController.swift */, 386AE0811226ED7D713A5213310B3FD4 /* SPGDPRVendorDetailsViewController.xib */, ); - name = GDPR; path = GDPR; sourceTree = ""; }; @@ -3318,7 +3317,6 @@ 5F9AEBBBDCB370283E19153952980A82 /* SPCCPAVendorDetailsViewController.swift */, 6243F8B74D2E0A9FB82505B293D04B92 /* SPCCPAVendorDetailsViewController.xib */, ); - name = CCPA; path = CCPA; sourceTree = ""; }; @@ -3461,7 +3459,6 @@ 56D84E7DFB82FAF79051EDCED6B3AD65 /* FBLPromises.h */, 2CCEC2825869E9C9401E72137EA6FD70 /* Support Files */, ); - name = PromisesObjC; path = PromisesObjC; sourceTree = ""; }; @@ -3493,7 +3490,6 @@ 880952C8D5B63E2144C97BFB79B77388 /* IQUIViewController+Additions.swift */, A9C21400FC14B8A423AA2B9F9C1CC213 /* Support Files */, ); - name = IQKeyboardManagerSwift; path = IQKeyboardManagerSwift; sourceTree = ""; }; @@ -3524,7 +3520,6 @@ children = ( 1E6DDDFC512EF0E0B17443A4A231538D /* NativePrivacyManager */, ); - name = tvOS; path = tvOS; sourceTree = ""; }; @@ -3660,7 +3655,6 @@ 8EE15A315201C99588DE0BD07FF38B16 /* WeakContainer.swift */, 17867BBD24A729EA84A9D1E620474024 /* Support Files */, ); - name = FirebaseCoreInternal; path = FirebaseCoreInternal; sourceTree = ""; }; @@ -3750,7 +3744,6 @@ A6B2052B3E1ABACA6645981AD6FB5592 /* SPWebMessageViewController.swift */, C47A86E96214AF01A2D60A615C4942EB /* SPWebViewExtensions.swift */, ); - name = iOS; path = iOS; sourceTree = ""; }; @@ -3793,7 +3786,6 @@ C2C891812FDC4B1786FCC61447F99C01 /* FIRVersion.m */, B4A3350384F4B33A0C680D0769CA42D9 /* Support Files */, ); - name = FirebaseCore; path = FirebaseCore; sourceTree = ""; }; @@ -3811,7 +3803,6 @@ B87FC94313C3F6CD2A609B535E242EBB /* encode */, E1E6AAA372995110357F4F66211ED649 /* Support Files */, ); - name = nanopb; path = nanopb; sourceTree = ""; }; @@ -3893,7 +3884,6 @@ BAACF4B18C671D0CC1E3BD4EA9B5DFFB /* FIROptionsInternal.h */, 26993A8D6E641AF2226681DA23023DFC /* Support Files */, ); - name = FirebaseInstallations; path = FirebaseInstallations; sourceTree = ""; }; @@ -3957,7 +3947,6 @@ children = ( ED0067C5D015088C9E9B264BB8B1DB66 /* Support Files */, ); - name = SwiftLint; path = SwiftLint; sourceTree = ""; }; @@ -3966,7 +3955,6 @@ children = ( D23402CC8C785F6B05479C66A3873FF9 /* SPGCMData.swift */, ); - name = GoogleConsentMode; path = GoogleConsentMode; sourceTree = ""; }; @@ -4006,7 +3994,6 @@ 4F82BF3657117F5154467A181CBB937A /* PMCategoryManager.swift */, BAB973A84CCB907626D0300E5C51C0D2 /* PMVendorManager.swift */, ); - name = Data; path = Data; sourceTree = ""; }; @@ -4026,7 +4013,6 @@ 69C7A2FDE02741DB3CA92165A22429F5 /* SPPrivacyPolicyViewController.xib */, 4E82BB45C47F112E10BE1417C8E462BC /* SPQRCode.swift */, ); - name = Common; path = Common; sourceTree = ""; }; @@ -4134,7 +4120,6 @@ A779FF010843DA3272F8E81D624079E8 /* xml.c */, EB2FF9BE1A8C34E827ED5AF8F9C552CC /* Support Files */, ); - name = Down; path = Down; sourceTree = ""; }; @@ -4174,7 +4159,6 @@ C5694987A309320E12F59838F4D772A4 /* AdIdSupport */, FBE9E8C4DF24F9DB2E5F322B1E1DF281 /* Support Files */, ); - name = FirebaseAnalytics; path = FirebaseAnalytics; sourceTree = ""; }; @@ -4278,6 +4262,7 @@ EF8E0955273A2F9B93CA98673AD99E4C /* SPUserData.swift */, 7B87DA7D309B4CC933AA56C4FC9D3DDC /* SPUSNatConsent.swift */, B6AE8F78B2147B0CBD958AFC4FC851B0 /* GoogleConsentMode */, + 827232B72B90C681007404F8 /* SPConsentable.swift */, ); name = Consents; path = ConsentViewController/Classes/Consents; @@ -6407,6 +6392,7 @@ 9920F643FCA99DB5DA1D83A997BF198F /* GDPRPrivacyManagerViewResponse.swift in Sources */, 9F73DCD42FC317D117631D12E976DEED /* IDFAStatusReportRequest.swift in Sources */, CBE2432EEE1C7A734A1EB616820CBB99 /* IncludeData.swift in Sources */, + 827232B92B90C681007404F8 /* SPConsentable.swift in Sources */, F3C240CB57FA4C1774E836C0061370B5 /* LastMessageData.swift in Sources */, 79D7A976136547EA1165CD7E48C6C1DC /* LongButtonViewCell.swift in Sources */, D3F3349700CFE807143D3CFABB8815FE /* LongButtonViewCell.xib in Sources */, @@ -6700,6 +6686,7 @@ 9B85267181461234235C9921B6EF5B29 /* SPUserData.swift in Sources */, E73492DE4173726E9C362E28996CD288 /* SPUserDefaults.swift in Sources */, CBB986F2458B5C482F35BC6D8A5A53B0 /* SPUSNatConsent.swift in Sources */, + 827232B82B90C681007404F8 /* SPConsentable.swift in Sources */, C0C05BA7A59A2DD8D175F84D1A3CB00C /* SPWebMessageViewController.swift in Sources */, AC5F15D51A2157A61D26A82484F40077 /* SPWebViewExtensions.swift in Sources */, ); From c376427d84e7161047976b0e042962a392fc6b8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Herculano?= Date: Fri, 1 Mar 2024 11:18:01 +0100 Subject: [PATCH 3/6] bump SDK State version from 3 to 4 --- .../SourcePointClient/SourcepointClientCoordinator.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ConsentViewController/Classes/SourcePointClient/SourcepointClientCoordinator.swift b/ConsentViewController/Classes/SourcePointClient/SourcepointClientCoordinator.swift index e0cce474b..89be723a9 100644 --- a/ConsentViewController/Classes/SourcePointClient/SourcepointClientCoordinator.swift +++ b/ConsentViewController/Classes/SourcePointClient/SourcepointClientCoordinator.swift @@ -81,7 +81,7 @@ extension SPSampleable { class SourcepointClientCoordinator: SPClientCoordinator { struct State: Codable { - static let version = 3 + static let version = 4 struct GDPRMetaData: Codable, SPSampleable, Equatable { var additionsChangeDate = SPDate.now() From 45c05658e9b288dbd54fe7d8057c73ef89aae14a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Herculano?= Date: Fri, 1 Mar 2024 12:04:45 +0100 Subject: [PATCH 4/6] fix lint in a custom matcher --- .../Helpers/CustomMatchers.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Example/ConsentViewController_ExampleTests/Helpers/CustomMatchers.swift b/Example/ConsentViewController_ExampleTests/Helpers/CustomMatchers.swift index d4dd7a8ef..8460ba4d3 100644 --- a/Example/ConsentViewController_ExampleTests/Helpers/CustomMatchers.swift +++ b/Example/ConsentViewController_ExampleTests/Helpers/CustomMatchers.swift @@ -126,7 +126,7 @@ public func containQueryParam(_ name: String, withValue value: String) -> Predic guard let actual = try actual.evaluate(), let params = actual.queryParams else { - return PredicateResult(bool: false, message: .fail("could not get query params from URL(\(try? actual.evaluate()?.absoluteString as Any))")) + return PredicateResult(bool: false, message: .fail("could not get query params from URL(\((try? actual.evaluate()?.absoluteString) as Any))")) } var pass = false var message = "" From 5b45091db8d05b45f867a1555d1a89d9b3d2a963 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Herculano?= Date: Fri, 1 Mar 2024 12:05:58 +0100 Subject: [PATCH 5/6] implement SPUSNatConsent.Statuses --- .../Classes/Consents/SPUSNatConsent.swift | 62 +++++++++++++++++++ .../SPUSNatConsentSpec.swift | 25 +++++++- 2 files changed, 84 insertions(+), 3 deletions(-) diff --git a/ConsentViewController/Classes/Consents/SPUSNatConsent.swift b/ConsentViewController/Classes/Consents/SPUSNatConsent.swift index 056c301b0..c16c56389 100644 --- a/ConsentViewController/Classes/Consents/SPUSNatConsent.swift +++ b/ConsentViewController/Classes/Consents/SPUSNatConsent.swift @@ -28,6 +28,9 @@ import Foundation public let consentStrings: [ConsentString] /// A dictionary with all GPP related data + /// A series of statuses (`Bool?`) regarding GPP and user consent + /// - SeeAlso: `SPUSNatConsent.Statuses` + public var statuses: Statuses { .init(from: consentStatus) } public var GPPData: SPJson? var dateCreated, expirationDate: SPDate @@ -131,3 +134,62 @@ import Foundation GPPData: GPPData )} } +extension SPUSNatConsent { + @objcMembers public class Statuses: NSObject { + let rejectedAny, consentedToAll, consentedToAny, + hasConsentData, sellStatus, shareStatus, + sensitiveDataStatus, gpcStatus: Bool? + + override open var description: String { + """ + SPUSNatConsent.Statuses( + - rejectedAny: \(rejectedAny as Any) + - consentedToAll: \(consentedToAll as Any) + - consentedToAny: \(consentedToAny as Any) + - hasConsentData: \(hasConsentData as Any) + - sellStatus: \(sellStatus as Any) + - shareStatus: \(shareStatus as Any) + - sensitiveDataStatus: \(sensitiveDataStatus as Any) + - gpcStatus: \(gpcStatus as Any) + ) + """ + } + + init(from status: ConsentStatus) { + rejectedAny = status.rejectedAny + consentedToAll = status.consentedToAll + consentedToAny = status.consentedToAny + hasConsentData = status.hasConsentData + sellStatus = status.granularStatus?.sellStatus + shareStatus = status.granularStatus?.shareStatus + sensitiveDataStatus = status.granularStatus?.sensitiveDataStatus + gpcStatus = status.granularStatus?.gpcStatus + } + + init(rejectedAny: Bool?, consentedToAll: Bool?, consentedToAny: Bool?, + hasConsentData: Bool?, sellStatus: Bool?, shareStatus: Bool?, + sensitiveDataStatus: Bool?, gpcStatus: Bool?) { + self.rejectedAny = rejectedAny + self.consentedToAll = consentedToAll + self.consentedToAny = consentedToAny + self.hasConsentData = hasConsentData + self.sellStatus = sellStatus + self.shareStatus = shareStatus + self.sensitiveDataStatus = sensitiveDataStatus + self.gpcStatus = gpcStatus + } + + public override func isEqual(_ object: Any?) -> Bool { + guard let other = object as? Statuses else { return false } + + return other.rejectedAny == rejectedAny && + other.consentedToAll == consentedToAll && + other.consentedToAny == consentedToAny && + other.hasConsentData == hasConsentData && + other.sellStatus == sellStatus && + other.shareStatus == shareStatus && + other.sensitiveDataStatus == sensitiveDataStatus && + other.gpcStatus == gpcStatus + } + } +} diff --git a/Example/ConsentViewController_ExampleTests/SPUSNatConsentSpec.swift b/Example/ConsentViewController_ExampleTests/SPUSNatConsentSpec.swift index 3ecb6ddfe..5a9e56cfa 100644 --- a/Example/ConsentViewController_ExampleTests/SPUSNatConsentSpec.swift +++ b/Example/ConsentViewController_ExampleTests/SPUSNatConsentSpec.swift @@ -44,8 +44,16 @@ class SPUSNatConsentsSpec: QuickSpec { }] }, "consentStatus": { - "granularStatus": {}, - "hasConsentData": false + "rejectedAny": true, + "consentedToAll": true, + "consentedToAny": true, + "hasConsentData": true, + "granularStatus": { + "sellStatus": true, + "shareStatus": true, + "sensitiveDataStatus": true, + "gpcStatus": true + } }, "GPPData": { "foo": "bar" @@ -66,7 +74,18 @@ class SPUSNatConsentsSpec: QuickSpec { ])) expect(consent.dateCreated).to(equal(year: 2023, month: 2, day: 6)) expect(consent.expirationDate).to(equal(year: 2024, month: 2, day: 6)) - expect(consent.consentStatus).to(equal(ConsentStatus())) + expect(consent.statuses).to(equal( + SPUSNatConsent.Statuses( + rejectedAny: true, + consentedToAll: true, + consentedToAny: true, + hasConsentData: true, + sellStatus: true, + shareStatus: true, + sensitiveDataStatus: true, + gpcStatus: true + ) + )) } catch { fail(String(describing: error)) } From df43b2e45415d22895f0488cb4ab6f74aa1e006d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Herculano?= Date: Fri, 1 Mar 2024 12:06:12 +0100 Subject: [PATCH 6/6] refactor and document SPUSNatConsent --- .../Classes/Consents/SPUSNatConsent.swift | 92 ++++++++++++++----- 1 file changed, 67 insertions(+), 25 deletions(-) diff --git a/ConsentViewController/Classes/Consents/SPUSNatConsent.swift b/ConsentViewController/Classes/Consents/SPUSNatConsent.swift index c16c56389..12c969ac4 100644 --- a/ConsentViewController/Classes/Consents/SPUSNatConsent.swift +++ b/ConsentViewController/Classes/Consents/SPUSNatConsent.swift @@ -8,29 +8,28 @@ import Foundation @objcMembers public class SPUSNatConsent: NSObject, Codable, CampaignConsent, NSCopying { - struct UserConsents: Codable, Equatable { - let vendors, categories: [SPConsentable] - } - - public struct ConsentString: Codable, Equatable { - public let sectionId: Int - public let sectionName, consentString: String - } - + /// A collection of accepted/rejected vendors and their ids public var vendors: [SPConsentable] { userConsents.vendors } + /// A collection of accepted/rejected categories (aka. purposes) and their ids public var categories: [SPConsentable] { userConsents.categories } + /// Identifies this usnat consent profile public var uuid: String? + /// Whether USNat applies according to user's location (inferred from IP lookup) and your Vendor List applies scope setting public var applies: Bool + /// The consent strings related to this user profile public let consentStrings: [ConsentString] - /// A dictionary with all GPP related data /// A series of statuses (`Bool?`) regarding GPP and user consent /// - SeeAlso: `SPUSNatConsent.Statuses` public var statuses: Statuses { .init(from: consentStatus) } + + /// A dictionary with all GPP related data. Only available on Swift implementations. + /// ObjC projects will have to access this data via `UserDefaults` according to the GPP spec: + /// - SeeAlso: https://github.com/InteractiveAdvertisingBureau/Global-Privacy-Platform/blob/main/Core/CMP%20API%20Specification.md#in-app-details public var GPPData: SPJson? var dateCreated, expirationDate: SPDate @@ -41,24 +40,13 @@ import Foundation /// Used by the rendering app let webConsentPayload: SPWebConsentPayload? + /// Used by SP endpoints and to derive the data inside `statuses` var consentStatus: ConsentStatus + /// Only here to make it easier encoding/decoding data from SP endpoints. + /// Used to derive the data in `vendors` and `categories` var userConsents: UserConsents - override open var description: String { - """ - SPUSNatConsent( - - uuid: \(uuid ?? "") - - applies: \(applies) - - consentStrings: \(consentStrings) - - categories: \(categories) - - vendors: \(vendors) - - dateCreated: \(dateCreated) - - expirationDate: \(expirationDate) - ) - """ - } - init( uuid: String? = nil, applies: Bool, @@ -97,6 +85,22 @@ import Foundation GPPData = try container.decodeIfPresent(SPJson.self, forKey: .GPPData) userConsents = try container.decodeIfPresent(UserConsents.self, forKey: .userConsents) ?? UserConsents(vendors: [], categories: []) } +} + +extension SPUSNatConsent { + override open var description: String { + """ + SPUSNatConsent( + - uuid: \(uuid ?? "") + - applies: \(applies) + - consentStrings: \(consentStrings) + - categories: \(categories) + - vendors: \(vendors) + - dateCreated: \(dateCreated) + - expirationDate: \(expirationDate) + ) + """ + } public static func empty() -> SPUSNatConsent { SPUSNatConsent( applies: false, @@ -115,7 +119,7 @@ import Foundation other.applies == applies && other.consentStrings.count == consentStrings.count && other.consentStrings.sorted(by: { $0.sectionId > $1.sectionId }) == - other.consentStrings.sorted(by: { $0.sectionId > $1.sectionId }) && + other.consentStrings.sorted(by: { $0.sectionId > $1.sectionId }) && other.categories == categories && other.vendors == vendors } @@ -134,6 +138,44 @@ import Foundation GPPData: GPPData )} } + +extension SPUSNatConsent { + struct UserConsents: Codable, Equatable { + let vendors, categories: [SPConsentable] + } +} + +extension SPUSNatConsent { + @objcMembers public class ConsentString: NSObject, Codable { + public let sectionId: Int + public let sectionName, consentString: String + + override open var description: String { + """ + SPUSNatConsent.ConsentString( + - sectionId: \(sectionId) + - sectionName: \(sectionName) + - consentString: \(consentString) + ) + """ + } + + init(sectionId: Int, sectionName: String, consentString: String) { + self.sectionId = sectionId + self.sectionName = sectionName + self.consentString = consentString + } + + override public func isEqual(_ object: Any?) -> Bool { + guard let other = object as? ConsentString else { return false } + + return other.sectionId == sectionId && + other.sectionName == sectionName && + other.consentString == consentString + } + } +} + extension SPUSNatConsent { @objcMembers public class Statuses: NSObject { let rejectedAny, consentedToAll, consentedToAny,